求hack/求调
查看原帖
求hack/求调
756843
Lilium_davidii楼主2024/8/14 20:19

AC on #12,#13 10pts。动态开点线段树。已经调了进两天了,求大佬调

#include<bits/stdc++.h>
#define int long long
using namespace std;
void timings(string info=""){if(info=="")cerr<<"timings = "<<clock()<<endl;else cerr<<"timings = "<<clock()<<" with info "<<info<<endl;}
#define debug(x) {cerr<<"timings "<<clock()<<", ["<<#x<<" == "<<x<<"] on line "<<__LINE__<<" in "<<__func__<<"()"<<endl;}
int tree[20000000],id[20000000],lc[20000000],rc[20000000],now[600005];
int cnt=0;
int n,m,q;
void update(int p,int l,int r,int x,int k,int ori){
	if(l==r){
		id[p]=k;
		tree[p]=(int)(k!=0);
		return;
	}
	int mid=(l+r)>>1;
	tree[p]=0;
	if(x<=mid){
		if(!lc[p]){
			lc[p]=++cnt;
			if(l==mid&&l<=((ori==n+1)?n:m-1)){
				id[lc[p]]=(ori-1)*n+l;
				tree[lc[p]]=1;
                if(ori==n+1){
                    id[lc[p]]=l*n;
                }
			}else if(l<=((ori==n+1)?n:m-1)){
				tree[lc[p]]=(mid-l+1);
			}
		}
		update(lc[p],l,mid,x,k,ori);
	}else{
		if(!rc[p]){
			rc[p]=++cnt;
			if(r==mid+1&&r<=((ori==n+1)?n:m-1)){
				id[rc[p]]=(ori-1)*n+r;
				tree[rc[p]]=1;
                if(ori==n+1){
                    id[rc[p]]=r*n;
                }
			}else if(r<=((ori==n+1)?n:m-1)){
				tree[rc[p]]=(r-mid);
			}
		}
		update(rc[p],mid+1,r,x,k,ori);
	}
    if(lc[p]){
        tree[p]+=tree[lc[p]];
    }else{
        tree[p]+=(mid-l+1);
    }
    if(rc[p]){
        tree[p]+=tree[rc[p]];
    }else{
        tree[p]+=(r-mid);
    }
}
pair<int,int> query(int p,int l,int r,int k,int ori){
	if(l==r){
		return make_pair(id[p],l);
	}
	int mid=(l+r)>>1;
	if(!lc[p]){
		lc[p]=++cnt;
		if(l==mid&&l<=((ori==n+1)?n:m-1)){
            id[lc[p]]=(ori-1)*n+l;
            tree[lc[p]]=1;
            if(ori==n+1){
                id[lc[p]]=l*n;
            }
        }else if(l<=((ori==n+1)?n:m-1)){
            tree[lc[p]]=(mid-l+1);
        }
	} 
	if(!rc[p]){
		rc[p]=++cnt;
		if(r==mid+1&&r<=((ori==n+1)?n:m-1)){
            id[rc[p]]=(ori-1)*n+r;
            tree[rc[p]]=1;
            if(ori==n+1){
                id[rc[p]]=r*n;
            }
        }else if(r<=((ori==n+1)?n:m-1)){
            tree[rc[p]]=(r-mid);
        }
	}
	if(k<=tree[lc[p]]){
		return query(lc[p],l,mid,k,ori);
	}else{
		return query(rc[p],mid+1,r,k-tree[lc[p]],ori);
	}
}
signed main(){
    //ios::sync_with_stdio(0);
    //cin.tie(0);cout.tie(0);
	cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
        now[i]=m-1;
    }
    now[n+1]=n;
	cnt=n+1;
	for(int i=1;i<=q;i++){
		int x,y;
		cin>>x>>y;
        pair<int,int> tmp;
		if(y!=m){
			tmp=query(x,1,m-1+q,y,x);
            cout<<tmp.first<<"\n";
			update(x,1,m-1+q,tmp.second,0,x);
            update(n+1,1,n+q,++now[n+1],tmp.first,n+1);
            tmp=query(n+1,1,n+q,x,n+1);
            update(n+1,1,n+q,tmp.second,0,n+1);
            update(x,1,m-1+q,++now[x],tmp.first,x);
		}else{
            tmp=query(n+1,1,n+q,x,n+1);
            cout<<tmp.first<<"\n";
            update(n+1,1,n+q,tmp.second,0,n+1);
            update(n+1,1,n+q,++now[n+1],tmp.first,n+1);
        }
	}
	return 0;
}

2024/8/14 20:19
加载中...