计蒜客 学校的宣传板 (离散化||线段树+离散化)

 离散化做法:

#include<bits/stdc++.h>

using namespace std;

const int maxn=1e4+10;

struct node{
    int x,y;
}p[maxn];

int tmp[maxn*2];

map<int,int> mp;

bool vis[maxn*2];

int main(){
    ios::sync_with_stdio(false);cin.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>p[i].x>>p[i].y;
        tmp[2*i]=p[i].x;
        tmp[2*i+1]=p[i].y;
    }
    sort(tmp,tmp+n*2);
    int len=unique(tmp,tmp+n*2)-tmp;
    for(int i=0;i<len;i++){
        mp[tmp[i]]=i+1;
    }
    int ans=n;
    for(int i=n-1;i>=0;i--){
        p[i].x=mp[p[i].x];
        p[i].y=mp[p[i].y];
        int num=0;
        for(int j=p[i].x;j<=p[i].y;j++){
            if(!vis[j]) vis[j]=1;
            else num++;
        }
        if(num==p[i].y-p[i].x+1) ans--;
    }
    cout<<ans<<endl;
    return 0;
}

线段树+离散化        标程

#include<bits/stdc++.h>

using namespace std;

const int maxn=1e4+10;

struct node{
    int x,y;
}p[maxn];

int tmp[maxn*2];

map<int,int> mp;

struct point{
    int l,r;
    bool cover;
}tree[maxn*8];  //点数的四倍,即线段树的八倍

void build(int i,int l,int r){
    tree[i].l=l;
    tree[i].r=r;
    tree[i].cover=false;
    if(l==r) return ;
    int mid=l+r>>1;
    build(i<<1,l,mid);
    build(i<<1|1,mid+1,r);
}

bool post(int i,int l,int r){
    if(tree[i].cover) return false;
    if(tree[i].l==l&&tree[i].r==r){
        tree[i].cover=true;
        return true;
    }
    bool ans;
    int mid=tree[i].l+tree[i].r>>1;
    if(r<=mid) ans=post(i<<1,l,r);
    else if(l>mid) ans=post(i<<1|1,l,r);
    else{
        bool b1=post(i<<1,l,mid);
        bool b2=post(i<<1|1,mid+1,r);
        ans=b1||b2;
    }
    if(tree[i<<1].cover&&tree[i<<1|1].cover)
        tree[i].cover=true;
    return ans;
}

int main(){
    ios::sync_with_stdio(false);cin.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>p[i].x>>p[i].y;
        tmp[2*i]=p[i].x;
        tmp[2*i+1]=p[i].y;
    }
    sort(tmp,tmp+n*2);
    int len=unique(tmp,tmp+n*2)-tmp;
    for(int i=0;i<len;i++){
        mp[tmp[i]]=i+1;
    }
    build(1,1,len);
    int ans=0;
    for(int i=n-1;i>=0;i--){
        if(post(1,mp[p[i].x],mp[p[i].y])) ans++;
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40679299/article/details/81735874