全部MLE球条
查看原帖
全部MLE球条
663638
Butterfly_qwq楼主2023/6/23 09:04
#include<bits/stdc++.h>
using namespace std;
const int N=200001;
struct segt
{
	int s[4*N],h[4*N],l[4*N],r[4*N],len[4*N],ans[4*N];
	int tmax(int a,int b,int c)
	{
		return max(a,max(b,c));
	}
	void pushdown(int u,int w)
	{
		s[u]=h[u]=ans[u]=1;
		l[u]=r[u]=w;
	}
	void pushup(int u)
	{
		if(l[u<<1|1]^r[u<<1])
	      ans[u]=tmax(s[u<<1|1]+h[u<<1],ans[u<<1],ans[u<<1|1]);
      else ans[u]=max(ans[u<<1],ans[u<<1|1]);
      l[u]=l[u<<1];
      r[u]=r[u<<1|1];
      if(s[u<<1]==len[u<<1]&&l[u<<1|1]^r[u<<1])s[u]=s[u<<1]+s[u<<1|1];
      else s[u]=s[u<<1];
      if(h[u<<1|1]==len[u<<1|1]&&l[u<<1|1]^r[u<<1])h[u]=h[u<<1]+h[u<<1|1];
      else h[u]=s[u<<1|1];
	}
	void build(int u,int l,int r)
	{
		len[u]=r-l+1;
		if(l==r)
		{
			pushdown(u,0);
			return;
		}
		int mid=(l+r)/2;
		build(u<<1,l,mid);
		build(u<<1|1,mid+1,r);
		pushup(u);
	}
	void update(int u,int lt,int rt,int v)
	{
		if(l==r)
		{
			pushdown(u,!l[u]);
			return;
		}
		int mid=(lt+rt)/2;
		if(v<=mid)update(u<<1,lt,mid,v);
		else update(u<<1|1,mid+1,rt,v);
		pushup(u);
	}
};//魔改线段树板子 
int main()
{
	segt st;
	int n,m;
	cin>>n>>m;
   st.build(1,1,n);
	while(m--)
	{
		int u;
		cin>>u;
		st.update(1,1,n,u);
		cout<<(st.ans)[1]<<'\n';
	}
	return 0;
}//主程序15行,比前面简单多了 
2023/6/23 09:04
加载中...