反复求调(WA16)
  • 板块灌水区
  • 楼主Lucifero
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/2/25 23:16
  • 上次更新2023/11/5 02:41:54
查看原帖
反复求调(WA16)
335094
Lucifero楼主2021/2/25 23:16
#include <bits/stdc++.h>
#define ls (p<<1)
#define rs ((p<<1)+1)
#define len(i) (tree[i].r-tree[i].l+1)
using namespace std;
class SegmentTree
{
public:
	int v,l,r;
	int lt,rt;
}tree[1600001];
int n;
void pushup(int p)
{
	if (tree[ls].r!=tree[rs].l)
	{
		tree[p].v=tree[ls].rt+tree[rs].lt;
		tree[p].v=max(tree[p].v,tree[ls].v);
		tree[p].v=max(tree[p].v,tree[rs].v);
	}
	else tree[p].v=max(tree[ls].v,tree[rs].v);
	tree[p].l=tree[ls].l,tree[p].r=tree[rs].r;

	if (tree[ls].lt==len(ls) && tree[ls].r!=tree[rs].l)
		tree[p].lt=tree[ls].lt+tree[rs].lt;
	else tree[p].lt=tree[ls].lt;

	if (tree[rs].rt==len(rs) && tree[ls].r!=tree[rs].l)
		tree[p].rt=tree[ls].rt+tree[rs].rt;
	else tree[p].rt=tree[rs].rt;
}
void build(int p,int l,int r)            
{
	if (l==r)
	{
		tree[p].l=tree[p].r=1;
		tree[p].lt=tree[p].rt=tree[p].v=1;
		return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(p);
}
void modify(int p,int l,int r,int d)
{
	if (l==r)
	{
		tree[p].l^=1;
		tree[p].r^=1;
		return;
	}
	int mid=(l+r)>>1;
	if (d<=mid) modify(ls,l,mid,d);
	else modify(rs,mid+1,r,d);
	pushup(p);
}
int main()
{
	//COCI STEP
	int q,x,i;
	scanf("%d%d",&n,&q);
	build(1,1,n);
	while(q--)
	{
		scanf("%d",&x);
		modify(1,1,n,x);
		printf("%d\n",tree[1].v);
	}
}
2021/2/25 23:16
加载中...