关于今晚的ARC
  • 板块学术版
  • 楼主黑影洞人
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/1/14 22:08
  • 上次更新2023/10/24 04:13:03
查看原帖
关于今晚的ARC
285617
黑影洞人楼主2023/1/14 22:08

T2我打了平衡树,TLE了

#pragma comment(linker,"/stack:200000000")
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define fastcall __attribute__((optimize("-O3")))
#include<cstdio>
#include<algorithm>
#define N 614514
using namespace std;
int seed,md=19260817;
void _srand(int x){seed=x;}
int _rand(){seed=(seed*7+13)%md;return seed;}
int n,m,q;
char s[N];
int rt[N];
struct fhq_treap{
	int ch[N][2],tot,siz[N],rnd[N];
	bool r[N];
	char val[N];
	#define lc ch[x][0]
	#define rc ch[x][1]
	int pushup(int x){siz[x]=siz[lc]+siz[rc]+1;return x;}
	void split(int p,int k,int &x,int &y){
		if(!p)return void(x=y=0);
		pushdown(p);
		if(siz[ch[p][0]]<k)split(ch[x=p][1],k-siz[ch[p][0]]-1,ch[p][1],y);
		else split(ch[y=p][0],k,x,ch[p][0]);
		pushup(p);
	}
	void rev(int x){swap(lc,rc);r[x]^=1;}
	int merge(int x,int y){
		if(!x||!y)return x+y;
		pushdown(x),pushdown(y);
		if(rnd[x]<=rnd[y]){rc=merge(rc,y);return pushup(x);}
		else{ch[y][0]=merge(x,ch[y][0]);return pushup(y);}
	}
	void pushdown(int x){
		if(!r[x])return;
		if(lc)rev(lc);
		if(rc)rev(rc);
		r[x]^=1;
	}
	int newnode(char v){
		int x=++tot;
		rnd[x]=_rand();
		val[x]=v;siz[x]=1;
		lc=rc=0;
		return x;
	}
	void print(int x){
		if(!x)return;
		pushdown(x);
		print(lc);
		putchar(val[x]);
		print(rc);
	}
}t;
#define split t.split
#define merge t.merge
#define rev t.rev
signed main(){
	bool flg=0;
	_srand(1919810);
	scanf("%d%d",&n,&m);
	if(n<750){
		for(int i=1;i<=n;i++){
			scanf("%s",s+1);
			rt[i]=t.newnode(s[1]);	
			for(int j=2;j<=m;j++)rt[i]=merge(rt[i],t.newnode(s[j]));
		}
	}else{
		for(int i=1;i<=n;i++){
			scanf("%s",s+1);	
			for(int j=1;j<=m;j++)rt[j]=merge(rt[j],t.newnode(s[j]));
		}
		swap(n,m);
		flg=1;
	}
	scanf("%d",&q);
	while(q--){
		int a,b;
		scanf("%d%d",&a,&b);
		if(flg)swap(a,b);
		int f1=0,f2=0,f3=0,f4=0;
		for(int i=1;i<=a;i++){
			int x,y;
			split(rt[i],b,x,y);
			f1=merge(f1,x);
			f2=merge(f2,y);
		}
		for(int i=a+1;i<=n;i++){
			int x,y;
			split(rt[i],b,x,y);
			f3=merge(f3,x);
			f4=merge(f4,y);
		}
		rev(f1);rev(f2);
		rev(f3);rev(f4);
		for(int i=1;i<=a;i++){
			int x,y,e,f;
			rt[i]=0;
			split(f1,b,x,y);
			rt[i]=merge(rt[i],x);
			split(f2,m-b,e,f);
			rt[i]=merge(rt[i],e);
			f1=y;f2=f;
		}
		for(int i=a+1;i<=n;i++){
			int x,y,e,f;
			rt[i]=0;
			split(f3,b,x,y);
			rt[i]=merge(rt[i],x);
			split(f4,m-b,e,f);
			rt[i]=merge(rt[i],e);
			f3=y;f4=f;
		}
	}
	if(flg){
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				int x,y,e,f;
				split(rt[j],i,x,y);
				split(x,i-1,e,f);
				putchar(t.val[f]);
				x=merge(e,f);
				rt[j]=merge(x,y);
			}
			puts("");
		}
	}else{
		for(int i=1;i<=n;i++){
			t.print(rt[i]);
			puts("");
		}
	}
	return 0;
}



2023/1/14 22:08
加载中...