Fusión de intervalo (clasificación + clasificación / discretización + matriz de diferencias + truco)


Significado de la pregunta del portal : dado nnn divisiones[li, ri] [li, ri][ l yo ,r i ] , es necesario fusionar todos los intervalos de intersección.
Tenga en cuenta que si se cruza en los puntos finales, también hay una intersección.
Genere el número de intervalos después de que se complete la fusión.
Por ejemplo:[1, 3] [1,3][ 1 ,3 ] y[2, 6] [2,6][ 2 ,6 ] se puede combinar en un intervalo[1, 6] [1,6][ 1 ,6 ] .
Rango de datos:n ≤ 1 e 5, - 1 e 9 ≤ li ≤ ri ≤ 1 e 9 n \ le1e5, -1e9 \ le li \ le ri \ le1e9norte1 e 5 ,- 1 y 9l ir yo1 E 9
solución a un problema: la mayoría de los pensamientos inmediatos son ciertamente la clasificación del extremo izquierdo por hacer, recién comencé también planea escribir al curioso pregunteysl monarchentonces qué ideas no lo hicieron, dígame ysl Jun diferencia discretización y mantenimiento, después de pensar en , este método es lo suficientemente fuerte, pero hay un pequeño problema si la última intersección es[1, 4] [1,4][ 1 ,4 ] y el otro es[5, 6] [5,6][ 5 ,6 ] , luego las estadísticas finales dejan a los dos juntos nuevamente, y finalmente cuando el método está a punto de abandonarse, el Sr. ysl dijo que si hay un4.5 4.5 en elmedio4 . 5 y cosas por el estilo, de repente un destello, encontrado que si cada coordenada discreta directamente multiplicado por222 , la brecha en el medio se ampliará artificialmente.
Codigo:

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define pb push_back
#define sc(a) scanf("%d",&a)
#define pf(a) printf("%d\n",a)
#define p_f(a) printf("%d ",a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf2(a,b) printf("%d %d\n",a,b)
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e5+5;
int n,a[N<<2];
pii segs[N];
vector<int>numbers;
int main()
{
    
    
    sc(n);
    rep(i,1,n)cin>>segs[i].first>>segs[i].second;
    rep(i,1,n)numbers.push_back(segs[i].first),numbers.push_back(segs[i].second);
    sort(numbers.begin(),numbers.end());
    numbers.erase(unique(numbers.begin(),numbers.end()),numbers.end());
    rep(i,1,n)segs[i].first=lower_bound(numbers.begin(),numbers.end(),segs[i].first)-numbers.begin()+1,segs[i].second=lower_bound(numbers.begin(),numbers.end(),segs[i].second)-numbers.begin()+1;
    rep(i,1,n)segs[i].first*=2,segs[i].second*=2;
    rep(i,1,n)a[segs[i].first]++,a[segs[i].second+1]--;
    rep(i,1,N*2)a[i]+=a[i-1];
    int count=0;
    for(int i=1;i<=N*2;i++){
    
    
        if(a[i]){
    
    
            count++;
            for(int j=i+1;j<=N;j++)if(!a[j]){
    
    i=j;break;}
        }
    }
    cout<<count<<endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/zhouzi2018/article/details/108144428
Recomendado
Clasificación