不是哥们
查看原帖
不是哥们
275860
___A__楼主2024/7/30 23:28

这是怎么被卡空的 P2617单个最多20多mb就过了

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,V=1e9;
struct option{
    int typ,l,r,k,x,y,id,add;
};
vector<option>vec;
int n,T,last[N],vis[N],ans[N],tree[N];
int lowbit(int x){
    return x&-x;
}
void add(int x,int val){
    for(int i=x;i<=n;i+=lowbit(i)){
        tree[i]+=val;
    }
}
int query(int x){
    int ret=0;
    for(int i=x;i;i-=lowbit(i)){
        ret+=tree[i];
    }
    return ret;
}
void solve(int l,int r){
    if(vec.empty()){
        return;
    }
    if(l==r){
        for(auto i:vec){
            vis[i.id]=1,ans[i.id]=l;
        }
        return;
    }
    int mid=(l+r)>>1;
    vector<option>A,B;
    for(auto i:vec){
        if(!i.typ){
            if(i.y<=mid){
                A.push_back(i),add(i.x,i.add);
            }
            else{
                B.push_back(i);
            }
        }
        else{
            int val=query(i.r)-query(i.l-1);
            if(val>=i.k){
                A.push_back(i);
            }
            else{
                i.k-=val,B.push_back(i);
            }
        }
    }
    for(auto i:vec){
        if(!i.typ){
            if(i.y<=mid){
                add(i.x,-i.add);
            }
        }
    }
    vec=A,solve(l,mid),vec=B,solve(mid+1,r);
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0),cin>>n>>T;
    for(int i=1;i<=n;i++){
        last[i]=0,vec.push_back({0,0,0,0,i,last[i],0,1});
    }
    for(int l,r,k,x,y,i=1;i<=T;i++){
        char typ;
        cin>>typ;
        if(typ=='Q'){
            cin>>l>>r,k=r-l+1-8+1,vec.push_back({1,l,r,k,0,0,i,0});

        }
        else{
            cin>>x>>y,vec.push_back({0,0,0,0,x,last[x],0,-1}),last[x]=y,vec.push_back({0,0,0,0,x,last[x],0,1});
        }
    }
    solve(0,V);
    for(int i=1;i<=T;i++){
        if(vis[i]){
            cout<<ans[i]<<'\n';
        }
    }
}
2024/7/30 23:28
加载中...