这题为什么会 TLE 啊
  • 板块题目总版
  • 楼主MCRS_lizi
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/1/8 18:18
  • 上次更新2023/10/24 05:08:29
查看原帖
这题为什么会 TLE 啊
585805
MCRS_lizi楼主2023/1/8 18:18

题目

代码:

#include<ctime>
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<string>
#include<algorithm>
#include<functional>
#include<numeric>
using namespace std;
const int N=5000100;
const int inf=2e9;
int n,m,a[N],key[N],val[N],ls[N],rs[N],sum[N],sz[N],lz[N],mark[N],root,cnt;
char op[114];
inline void pushup(register int x,register int v)
{
	if(!x)
	{
		return;
	}
	sum[x]+=v;
	val[x]+=v;
	lz[x]+=v;
}
inline void pushdown(register int x)
{
	if(!x)
	{
		return;
	}
	pushup(ls[x],lz[x]);
	pushup(rs[x],lz[x]);
	if(x&&mark[x])
	{
		mark[x]=0;
		swap(ls[x],rs[x]);
		if(ls[x])mark[ls[x]]^=1;
		if(rs[x])mark[rs[x]]^=1;
	}
	lz[x]=0;
}
inline int add(register int x)
{
	sz[++cnt]=1;
	val[cnt]=sum[cnt]=x;
	key[cnt]=rand();
	return cnt;
}
inline void upd(register int x)
{
	sz[x]=sz[ls[x]]+sz[rs[x]]+1;
	sum[x]=val[x];
	if(ls[x])
	{
		sum[x]=min(sum[x],sum[ls[x]]);
	}
	if(rs[x])
	{
		sum[x]=min(sum[x],sum[rs[x]]);
	}
}
inline int merge(register int x,register int y)
{
	if(!x||!y)
	{
		return x|y;
	}
	if(key[x]<key[y])
	{
		pushdown(x);
		rs[x]=merge(rs[x],y);
		upd(x);
		return x;
	}
	else
	{
		pushdown(y);
		ls[y]=merge(x,ls[y]);
		upd(y);
		return y;
	}
}
inline void split(register int now,register int k,register int &x,register int &y)
{
	if(!now)
	{
		x=y=0;
		return;
	}
	pushdown(now);
	if(sz[ls[now]]>=k)
	{
		y=now;
		split(ls[now],k,x,ls[now]);
	}
	else
	{
		x=now;
		split(rs[now],k-sz[ls[now]]-1,rs[now],y);
	}
	upd(now);
	
}
inline int read(){
	char ch;
	register int s=0,x=1;
	ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')x=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		s=(s<<3)+(s<<1)+(ch^48);
		ch=getchar();
	}
	return s*x;
}
int main()
{
	srand(114514);
//	std::ios::sync_with_stdio(false);
	n=read();
	for(register int i=1;i<=n;i++)
	{
		a[i]=read();
		root=merge(root,add(a[i]));
	}
	m=read();
//	cout<<m<<endl;
	while(m--)
	{
		scanf("%s",op);
	//	cout<<op<<endl;
		if(op[0]=='M')
		{
	//		puts("HUIUX");
			register int l,r;
			l=read(),r=read();
			register int a,b,c,d;
			split(root,r,a,b);
			split(a,l-1,c,d);
			printf("%d\n",sum[d]);
			root=merge(merge(c,d),b);
		}
		else if(op[0]=='A')
		{
			register int l,r,k;
			l=read(),r=read(),k=read();
			register int a,b,c,d;
			split(root,r,a,b);
			split(a,l-1,c,d);
			pushup(d,k);
			root=merge(merge(c,d),b);
		}
		else if(op[0]=='I')
		{
			register int x,p;
			x=read(),p=read();
			int a,b;
			split(root,x,a,b);
			a=merge(a,add(p));
			root=merge(a,b);
		}
		else if(op[0]=='D')
		{
			register int x;
			x=read();
			register int a,b,c,d;
			split(root,x,a,b);
			split(a,x-1,c,d);
			d=merge(ls[d],rs[d]);
			root=merge(merge(c,d),b);
		}
		else if(op[3]=='E')
		{
		//	puts("cc");
			register int l,r;
			l=read(),r=read();
			register int a,b,c,d;
			split(root,r,a,b);
			split(a,l-1,c,d);
			mark[d]^=1;
			root=merge(merge(c,d),b);
		}
		else
		{
			register int l,r,t;
			l=read(),r=read(),t=read();
			register int len=r-l+1;
			t%=len;
			if(!t)
			{
				continue;
			}
			register int x,y,z,a,b;
			split(root,l-1,x,y);
			split(y,r-l+1,y,z);
			split(y,len-t,a,b);
			y=merge(b,a);
			root=merge(merge(x,y),z);
		}
	}
 	return 0;
}
/*
in #1
6
1 2 3 4 5 6
6
MIN 3 5
REVOLVE 2 5 2
MIN 3 6
DELETE 1
INSERT 1 2
MIN 1 3

out #1
3
2
2

in #2
8
1 2 3 4 5 6 7 8
8
REVOLVE 2 5 2
REVERSE 2 7
MIN 3 6
DELETE 1
INSERT 1 2
MIN 1 3
ADD 2 2 114
MIN 1 3
out #2
2
2
6
*/
2023/1/8 18:18
加载中...