求助神秘RE,悬一关
查看原帖
求助神秘RE,悬一关
760776
zzy_zzy楼主2025/1/20 14:18

code:

#include<bits/stdc++.h>
#define ls (p<<1)
#define rs (p<<1|1)
using namespace std;
struct node{
    int lsum,rsum,sum,S;
}tree[800010];
vector<pair<int,int> >g[200010];
int b[6000010];
unordered_map<int,int>lsh;
struct NN{
    int l,r,id;
}Q[400010];
int Len;
bool cmp(NN i,NN j){
    int ksi=(i.l-1)/Len+1;
    int ksj=(j.l-1)/Len+1;
    if(ksi!=ksj)return ksi<ksj;
    return i.r<j.r;
}
int ll[200010],rr[200010];
void pushup(int p,int l,int r){
    int mid=(l+r)>>1;
    tree[p].S=tree[ls].S+tree[rs].S;
    tree[p].lsum=tree[ls].lsum;
    if(tree[p].lsum==mid-l+1)tree[p].lsum+=tree[rs].lsum;
    tree[p].rsum=tree[rs].rsum;
    if(tree[p].rsum==r-mid)tree[p].rsum+=tree[ls].rsum;
    tree[p].sum=max(max(tree[ls].sum,tree[rs].sum),tree[ls].rsum+tree[rs].lsum);
}
void change(int p,int l,int r,int x,int y){
    if(l>x||r<x)return;
    if(l==r&&l==x){
        tree[p].lsum=tree[p].rsum=tree[p].sum=tree[p].S=y;
        return;
    }
    int mid=(l+r)>>1;
    change(ls,l,mid,x,y);
    change(rs,mid+1,r,x,y);
    pushup(p,l,r);
}
node ask(int p,int l,int r,int L,int R){
    if(l>R||r<L)return (node){0,0,0,0};
    if(l>=L&&r<=R)return tree[p];
    int mid=(l+r)>>1;
    node I=ask(ls,l,mid,L,R);
    node J=ask(rs,mid+1,r,L,R);
    node K;
    K.S=I.S+J.S;
    K.lsum=I.lsum;
    if(K.lsum==mid-l+1)K.lsum+=J.lsum;
    K.rsum=J.rsum;
    if(K.rsum==r-mid)K.rsum+=I.rsum;
    K.sum=max(max(I.sum,J.sum),I.rsum+J.lsum);
    return K;
}
int n,m;
void add(int x,int y){
    for(auto pp:g[x]){
        if(pp.second!=y)change(1,1,n,pp.first,1);
    }
}
void del(int x,int y){
    for(auto pp:g[x]){
        if(pp.second!=y)change(1,1,n,pp.first,0);
    }
}
int ans[200010];

int main(){
    cin>>n>>m;
    int cnt=0;
    for(int i=1;i<=n;i++){
        cin>>ll[i]>>rr[i];
        b[++cnt]=ll[i];
        b[++cnt]=rr[i];
    }
    for(int i=1;i<=m;i++){
        cin>>Q[i].l>>Q[i].r;
        Q[i].id=i;
        b[++cnt]=Q[i].l;
        b[++cnt]=Q[i].r;
    }
    sort(b+1,b+cnt+1);
    int len=unique(b+1,b+cnt+1)-b-1;
    Len=2*sqrt(len);
    for(int i=1;i<=len;i++)lsh[b[i]]=i;
    for(int i=1;i<=n;i++)ll[i]=lsh[ll[i]],rr[i]=lsh[rr[i]];
    for(int i=1;i<=m;i++)Q[i].l=lsh[Q[i].l],Q[i].r=lsh[Q[i].r];
    for(int i=1;i<=n;i++)g[ll[i]].push_back(make_pair(i,0)),g[rr[i]].push_back(make_pair(i,1));
    sort(Q+1,Q+m+1,cmp);
    int L=1,R=0;
    for(int i=1;i<=m;i++){
        while(R<Q[i].r)R++,add(R,1);
        while(L<Q[i].l)del(L,0),L++;
        while(L>Q[i].l)L--,add(L,0);
        while(R>Q[i].r)del(R,1),R--;
        ans[Q[i].id]=ask(1,1,n,1,n).sum;
    }
    for(int i=1;i<=m;i++)cout<<ans[i]<<"\n";
    return 0;
}
2025/1/20 14:18
加载中...