萌新求助,LOJAC,luogu全WA,本机使用luogu数据AC,请求大佬帮看
查看原帖
萌新求助,LOJAC,luogu全WA,本机使用luogu数据AC,请求大佬帮看
51569
wgyhm楼主2020/8/14 13:26

LOJ提交记录

萌新的代码,luogu全WA,感谢各位路过的大佬

把快读去掉换成scanf,还是WA。

Code:

#include<bits/stdc++.h>
#define maxn 300005
#define rg register
using namespace std;
inline void read(int &x){
	int f=1;x=0;char c=getchar();
	while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
	while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
	x*=f;
}
long long n,m;
int root[maxn],cnt;
struct yyy{
	int ls,rs,size,rnd;
	long long l,r;
}a[maxn*10];
inline int qlen(int k){
	if (!k) return 0;
	return a[k].r-a[k].l+1;
}
inline void Pushup(int k){
	a[k].size=a[a[k].ls].size+a[a[k].rs].size+qlen(k);
}
inline void split(int k,int x,int &a_,int &b_){
	if (!k) a_=b_=0;
	else{
		if (a[a[k].ls].size+qlen(k)<x) a_=k,split(a[k].rs,x-a[a[k].ls].size-qlen(k),a[k].rs,b_);
		else b_=k,split(a[k].ls,x,a_,a[k].ls);
		Pushup(k);
	}
}
inline int merge(int u,int v){
	if (!u||!v) return u|v;
	if (a[u].rnd<a[v].rnd){
		a[u].rs=merge(a[u].rs,v);
		Pushup(u);return u;
	}
	else{
		a[v].ls=merge(u,a[v].ls);
		Pushup(v);return v;
	}
}
inline int clone(long long val){
	a[++cnt].l=a[cnt].r=val;a[cnt].rnd=rand();a[cnt].size=1;
	return cnt;
}
inline int Build(long long l,long long r){
	if (l==r) return clone(l*m);
	long long mid=l+r>>1;return merge(Build(l,mid),Build(mid+1,r));
}
inline int at(int k){
	int x=1;
	while (k){
		if (x<=a[a[k].ls].size) k=a[k].ls;
		else if (x<=a[a[k].ls].size+qlen(k)) return k;
		else k=a[k].rs;
	}
}
inline void print(int k){
	if (a[k].ls) print(a[k].ls);
	printf(" %lld~%lld ",a[k].l,a[k].r);
	if (a[k].rs) print(a[k].rs);
}
int main(){
	//freopen("P3960_1.in","r",stdin);
	//freopen("my.out","w",stdout);
	rg int i,q,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,k1,k2,x,y,k;
	rg long long tot;
	srand(time(0));
	scanf("%lld%lld",&n,&m);read(q);
	root[n+1]=Build(1,n);
	for (i=1;i<=n;i++){
		root[i]=++cnt;
		a[cnt].l=(i-1)*m+1;
		a[cnt].r=i*m-1;
		a[cnt].rnd=rand();
		a[cnt].size=m-1;
	}
//	for (i=1;i<=n+1;i++,putchar('\n')) print(root[i]);
	while (q--){
		read(x);read(y);
		if (y==m){
			split(root[n+1],x,tmp1,tmp2);
			split(tmp2,2,tmp2,tmp3);
			printf("%lld\n",a[tmp2].l);
			root[n+1]=merge(tmp1,merge(tmp3,tmp2));
		}
		else{
			k1=k2=0;
			split(root[x],y,tmp1,tmp2);k=at(tmp2);
			split(tmp2,qlen(k)+1,tmp2,tmp3);tot=a[tmp2].l-1+y-a[tmp1].size;
			printf("%lld\n",tot);
			if (tot^a[tmp2].l) a[++cnt].l=a[tmp2].l,a[cnt].r=tot-1,a[cnt].rnd=rand(),a[cnt].size=qlen(cnt),k1=cnt;
			if (tot^a[tmp2].r) a[++cnt].l=tot+1,a[cnt].r=a[tmp2].r,a[cnt].rnd=rand(),a[cnt].size=qlen(cnt),k2=cnt;
			a[tmp2].l=a[tmp2].r=tot;a[tmp2].size=1;
			split(root[n+1],x,tmp4,tmp5);
			split(tmp5,2,tmp5,tmp6);
			root[n+1]=merge(tmp4,merge(tmp6,tmp2));
			root[x]=merge(merge(tmp1,k1),merge(k2,merge(tmp3,tmp5)));
		}
//		for (i=1;i<=n+1;i++,putchar('\n')) print(root[i]);
	}
	return 0;
}
2020/8/14 13:26
加载中...