C.Recuento de puntos cubiertos (pensamiento + diferencia)

https://codeforces.com/problemset/problem/1000/C


Idea: el rango de valores es grande y no se permite el escaneo de diferencias. Necesidad de diferenciar después de la discretización. Diferencia los puntos finales del segmento de línea. Recorra el mapa para obtener los tiempos de cobertura de los puntos desde el punto actual hasta el último intervalo (mantenimiento durante la exploración). Solo resta la longitud.

 

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=2e5+1000;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar();	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
map<LL,LL>map1;
vector<LL>ans[maxn];
int main(void)
{
  cin.tie(0);std::ios::sync_with_stdio(false);
  LL n;cin>>n;
  for(LL i=1;i<=n;i++){
     LL l,r;cin>>l>>r;
     map1[l]++;map1[r+1]--;
  }
  LL res=0;
  LL lastpos=0;
  for(auto i:map1){
     LL cnt=i.first-lastpos;
     ans[res].push_back(cnt);
     res+=i.second;
     lastpos=i.first;
  }
  for(LL i=1;i<=n;i++){
     LL f=0;
     for(auto j:ans[i]){
        f+=j;
     }
     cout<<f<<" ";
  }
return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/zstuyyyyccccbbbb/article/details/115204106
Recomendado
Clasificación