社区讨论

10分,但大样例全过,对拍没随到hack,救命!!

P9588「MXOI Round 2」队列参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lzasbrmn
此快照首次捕获于
2024/08/01 12:37
2 年前
此快照最后确认于
2024/08/01 14:39
2 年前
查看原帖
离线处理,靠前缀和,线段树和二分实现操作
我觉得用不着带修线段树所以没用
CPP
#include<bits/stdc++.h>
#define ll long long
#define int long long
#define lc p<<1
#define rc p<<1|1
using namespace std;
const int N=2e5+7;
inline int read()
{
	register int ret=0,w=1;
	register char c=getchar();
	while(!isdigit(c)) {
		if(c=='-') w=-1;
		c=getchar();
	} while(isdigit(c)) {
		ret=(ret<<1)+(ret<<3)+(c^48);
		c=getchar();
	} return ret*w;
}
ll a[N];
struct Tr{
	int l,r,mx;
}tr[N<<2];
void push_up(int p)
{
	tr[p].mx=max(tr[lc].mx,tr[rc].mx);
}
void build(int p,int l,int r)
{
	tr[p].l=l,tr[p].r=r;
	if(l==r)	return tr[p].mx=a[l],void();
	int mid=(l+r)>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	push_up(p);
}
int query(int p,int x,int y,int ans=0)
{
	if(x<=tr[p].l&&y>=tr[p].r)	return tr[p].mx;
	int mid=(tr[p].l+tr[p].r)>>1;
	if(x<=mid)	ans=max(ans,query(lc,x,y));
	if(y>mid)	ans=max(ans,query(rc,x,y));
	return ans;
}
struct node{
	int opt,x;
}k[N];
int tzz=1,mazz,enzz;
int tnum=1,mx;
int q,cnt;
ll sum[N]; 
signed main()
{
	int c=read();
    q=read();
    for(int i=1;i<=q;i++)
    {
    	k[i].opt=read();
		if(k[i].opt!=4)	k[i].x=read();
    	if(k[i].opt==1)	sum[++cnt]=sum[cnt-1]+k[i].x,a[cnt]=k[i].x;
	}
	if(cnt)	build(1,1,cnt);
	bool f=1;
	for(int i=1;i<=q;i++)
	{
		if(k[i].opt==1)
		{
			f=0;
			enzz++;
		}
		if(k[i].opt==2)
		{
			int len=a[tzz]-tnum+1;
			if(k[i].x<len)	tnum+=k[i].x;
			else
			{
				k[i].x-=len;
				k[i].x++;
				if(k[i].x+sum[tzz]>sum[enzz])
				{
					f=1;
					tnum=1,tzz=enzz+1;
					continue;
				}
				int p=lower_bound(sum+tzz+1,sum+enzz+1,sum[tzz]+k[i].x)-sum;
				tnum=k[i].x+sum[tzz]-sum[p-1];
				tzz=p;
			}
		}
		if(k[i].opt==3)
		{
			int len=a[tzz]-tnum+1;
			if(k[i].x<=len)	printf("%lld\n",tnum+k[i].x-1);
			else
			{
				k[i].x-=len;
				int p=lower_bound(sum+tzz+1,sum+enzz+1,sum[tzz]+k[i].x)-sum;
				printf("%lld\n",k[i].x+sum[tzz]-sum[p-1]);
			}
		}
		if(k[i].opt==4)
		{
			if(f)	puts("0");
			else	printf("%lld\n",query(1,tzz,enzz));
		}
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...