WA on #3 求调
查看原帖
WA on #3 求调
333855
int233楼主2024/4/4 20:12

实在调不动了,不知道哪里错了。

代码:

#include<iostream>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
multiset<pair<ll,ll> > s2;
multiset<pair<ll,ll> >::iterator it;
ll nn,n,d,q,a[100005],tp[100005],ans[100005],qt,cnt,b[100005],vr,root,tag[100005],son[100005][2],rnd[100005],sz[100005],cc,val[100005],now;
string ss;
vector<ll> vc; 
struct node{
	ll k,m,id;
}c[100005];
ll cmp(node x,node y){
	return x.k<y.k;
}
ll nwnd(ll x){
	++vr;
	rnd[vr]=rand()*rand();
	val[vr]=x;
	sz[vr]=1;
	return vr;
}
void psup(ll x){
	sz[x]=sz[son[x][0]]+sz[son[x][1]]+1;
}
void psdown(ll x){
	if(tag[x]){
		if(son[x][0]){
			tag[son[x][0]]+=tag[x];
			val[son[x][0]]+=tag[x];
		}
		if(son[x][1]){
			tag[son[x][1]]+=tag[x];
			val[son[x][1]]+=tag[x];
		}
		tag[x]=0;
		psup(x);
	}
}
ll merge(ll x,ll y){
	if(!x||!y){
		return x+y;
	}
	if(rnd[x]<=rnd[y]){
		psdown(x);
		son[x][1]=merge(son[x][1],y);
		psup(x);
		return x;
	}
	else{
		psdown(y);
		son[y][0]=merge(x,son[y][0]);
		psup(y);
		return y;
	}
}
void split(ll rt,ll &x,ll &y,ll k){
	if(!rt){
		x=y=0;
		return ;
	}
	psdown(rt);
	if(sz[son[rt][0]]+1<=k){
		x=rt;
		split(son[rt][1],son[rt][1],y,k-sz[son[rt][0]]-1);
	}
	else{
		y=rt;
		split(son[rt][0],x,son[rt][0],k);
	}
	psup(rt);
}
void split2(ll rt,ll &x,ll &y,ll k){
	if(!rt){
		x=y=0;
		return ;
	}
	psdown(rt);
	if(val[rt]<=k){
		x=rt;
		split2(son[rt][1],son[rt][1],y,k);
	}
	else{
		y=rt;
		split2(son[rt][0],x,son[rt][0],k);
	}
	psup(rt);
}
void modify(ll x,ll v){
	ll y,z;
	split(root,y,z,x);
//	cout<<tree[root]<<"伯爵\n";
	tag[y]+=v;
	val[y]+=v;
//	cout<<tree[root]<<"威廉伯爵\n";
	root=merge(z,y);
}
ll kth(ll x){
	ll y,z,ret,xx;
	//cout<<x<<" "<<root<<" "<<tree[root]<<" "<<tag[root]<<" "<<tree[son[root][0]]<<" "<<tree[son[root][1]]<<" ("<<endl;
	split(root,y,z,x);
	xx=y;
	while(son[xx][1]){
		psdown(xx);
		xx=son[xx][1];
	}
	ret=val[xx];
	root=merge(y,z);
//	cout<<x<<" "<<root<<" "<<tree[root]<<" "<<tag[root]<<" "<<tree[son[root][0]]<<" "<<tree[son[root][1]]<<" )"<<endl;
	return ret;
}
ll sums(ll x){
	ll y,z,ret;
	split2(root,y,z,x);
	ret=sz[y];
	root=merge(y,z);
	return ret;
}
ll nxt(ll x){
	ll t=x/cnt,t2=x%cnt;
	if(!t2){
		return kth(cnt)+(d+cnt-1)*t; 
	}
	return max(kth(cnt)+(d+cnt-1)*t,kth(t2)+(d+cnt-1)*(t+1)); 
}
ll nxtFi(ll x){
	ll t=x/cnt,t2=x%cnt;
	if(!t2){
		return kth(t2+1)+(d+cnt-1)*t; 
	}
	return min(kth(1)+(d+cnt-1)*(t+1),kth(t2+1)+(d+cnt-1)*t); 
}
void ins(ll x){
	ll y,z;
	split2(root,y,z,x);
	root=merge(y,merge(nwnd(x),z));
}
void ers(ll x){
	ll y,z,r;
	split(root,y,z,x-1);
	split(z,z,r,1);
	root=merge(y,r);
}
void upd(ll x){
	if(!s2.empty()){
		it=s2.lower_bound(make_pair(cc,0));
		if(it!=s2.end()&&(*it).first<cc+x){
			s2.erase(it);
			vc.push_back(a[(*it).second]);
			upd(((*it).first-cc));
			ers(1);
			cnt--;
			qt++;
			upd(x-((*it).first-cc));
			return ;
		}
	}
	ll t=x/cnt,t2=x%cnt;
	//cout<<kth(now)<<"AKCTSC\n";
	//cout<<x<<" "<<now<<" "<<(d+now)*t<<"AKIOI\n";
	modify(cnt,(d+cnt-1)*t);
	//cout<<tree[root]<<" "<<root;
//	cout<<" "<<tree[root]<<"AKCTSC\n";
	if(t2){
	//	cout<<x<<" "<<t2<<" "<<d+now<<"AKNOI\n";
		modify(t2,d+cnt-1);
	}
	cc+=x;
}
int main(){
	srand(time(0));
	cin>>n>>d>>q;
	for(ll i=1;i<=n;i++){
		cin>>a[i];
	}
	cin>>ss;
	for(ll i=1;i<=q;i++){
		cin>>c[i].k>>c[i].m;
		c[i].id=i;
	}
	sort(c+1,c+q+1,cmp);
	cnt=1;now=1;
	root=nwnd(a[1]); 
	cc=0;
	if(ss[0]=='0'){
		ll l=0,r=c[q].k-cc,mid;
		while(l<r){
			mid=(l+r)>>1;
			if(nxtFi(mid)>=a[now+1]){
				r=mid;
			}
			else{
				l=mid+1;
			}
		}
		if(nxtFi(l)>=a[now+1]){
			s2.insert({l+cc,now});
		}
	}
	for(ll i=1;i<=q;i++){
		while(now<n&&cc<=c[i].k){
			ll s=nxt(c[i].k-cc);
		//	cout<<i<<" Pre"<<endl;
		//	cout<<"-----------------------------------\n";
		//	for(int j=1;j<=cnt;j++){
		//		cout<<kth(j)<<" ";
		//	}
		//	cout<<endl;
		//	cout<<"-----------------------------------\n";
			if(s>=a[now+1]){
				ll l,r,mid,tmp;
				l=0,r=c[i].k-cc;
				while(l<r){
					mid=(l+r)>>1;
					if(nxt(mid)>=a[now+1]){
						r=mid;
					}
					else{
						l=mid+1;
					}
				}
				upd(l-1);
				while(now<n&&kth(1)+cnt+d-1>=a[now+1]){
					now++;
					cnt++;
					ins(a[now]);
					if(ss[now-1]=='0'){
						l=0,r=c[q].k-cc;
						while(l<r){
							mid=(l+r)>>1;
							if(nxtFi(mid)>=a[now]){
								r=mid;
							}
							else{
								l=mid+1;
							}
						}
						//cout<<now<<" Stop At: "<<l+cc<<endl; 
						if(nxtFi(l)>=a[now]){
							s2.insert({l+cc,now});
						}
					}
				}
				//cout<<i<<" tmpisnotfound"<<endl;
				//cout<<"-----------------------------------\n";
			//	for(int j=1;j<=cnt;j++){
			//		cout<<kth(j)<<" ";
			//	}
				//cout<<endl;
			//	cout<<"-----------------------------------\n";
				upd(1);
				//modify(1,4);
			//	cout<<i<<" tmp is:"<<tmp<<endl;
			//	cout<<"-----------------------------------\n";
			//	for(int j=1;j<=cnt;j++){
			//		cout<<kth(j)<<" ";
			//	}
			//	cout<<endl;
			//	cout<<"-----------------------------------\n";
			}
			else{
				break;
			}
		}
	//	cout<<i<<" "<<now<<" "<<tree[root]<<" TESTER"<<endl;
		upd(c[i].k-cc);
	//	cout<<i<<" "<<now<<" "<<tree[root]<<" TESTERCOPY"<<endl;
		if(c[i].m<=qt){
			ans[c[i].id]=vc[c[i].m-1];
		//	if(n>=15){
		//		tp[c[i].id]=1;
		//	}
		}
		else if(cnt<(c[i].m-qt)){
			ans[c[i].id]=a[now+(c[i].m-qt)-cnt];
		//	if(n>=15){
		//		tp[c[i].id]=2;
		//	}
		}
		else{
			ans[c[i].id]=kth(c[i].m-qt);	
		//	if(n>=15){
		//		tp[c[i].id]=3;
		//	}
		}
	}
	for(ll i=1;i<=q;i++){
		cout<<ans[i];
		//if(n>=15){
	//		cout<<" "<<tp[i];
	//	}
		cout<<endl;
	}
	return 0;
} 
2024/4/4 20:12
加载中...