間隔マージ(ソート+分類/離散化+差分配列+トリック)

ポータルの
質問の意味:与えられたnnn 个区间 [ l i , r i ] [li,ri] [ l i r i ]、すべての交差する間隔をマージする必要があります。
端点で交差する場合、交差点もあることに注意してください。
マージ完了後の間隔数を出力します。
例:[1、3] [1,3][ 1 3 ]および[2、6] [2,6][ 2 6 ]は1つの間隔に組み合わせることができます[1、6] [1,6][ 1 6 ]
データ範囲n≤1e5、−1e9≤li≤ri≤1e9n \ le1e5、-1e9 \ le li \ le ri \ le1e9n1 e 5 1 e 9l ir i1 E 9
問題の解決策:ほとんどの当面の考えは確かに左のエンドポイントの並べ替えです。ちょうど始めたばかりで、好奇心旺盛な質問ysl君主に手紙を書く予定なので、どのようなアイデアがなかったのか、yslJunの違いの離散化と保守について教えてください。この方法は十分に強力ですが、最後の交差点が[1、4] [1,4]の場合、小さな問題があります。[ 1 4 ]ともう1つは[5、6] [5,6]です。[ 5 6 ]方法は放棄しようとするときに、最終的な統計が最後に再び一緒に2を聞かせ、そして、氏のYSLは言ったがある場合で4.5 4.5ミドル4 5とか突然フラッシュ、同様に、各離散座標場合直接乗じたことを見出した222、中央の隙間を人為的に拡大します。
コード

#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;
}

おすすめ

転載: blog.csdn.net/zhouzi2018/article/details/108144428