zoukankan      html  css  js  c++  java
  • 【[SCOI2010]序列操作】

    好颓啊,我竟然来写了一道恶心的板子

    旁边的魏佬嘲讽我,还用欺负我

    嘤嘤嘤

    那就不膜魏佬了

    嘤嘤嘤

    这是一道无聊的板子

    看到这些操作,我们看到这些操作就知道我们需要维护的东西了

    首先那个最长的连续的(1),显然要维护一下左最长,右最长,还是区间最长

    由于有非常恶心的取反操作,所以最长的连续(0)也需要顺带维护一下

    之后就是推一下标记了

    显然非常强制性的覆盖标记比取反标记的优先级要更高

    没什么了

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define re register
    #define maxn 100005
    #define max(a,b) ((a)>(b)?(a):(b))
    struct node
    {
    	int t,ll,rr,dd;
    };
    int l[maxn<<2],r[maxn<<2],tag[2][maxn<<2],d[maxn<<2],ans[2][maxn<<2],lc[2][maxn<<2],rc[2][maxn<<2];
    int n,m;
    int a[maxn];
    inline void pushup(int i)
    {
    	d[i]=d[i<<1]+d[i<<1|1];
    	if(d[i<<1|1]==r[i<<1|1]-l[i<<1|1]+1) rc[1][i]=rc[1][i<<1|1]+rc[1][i<<1];
    		else rc[1][i]=rc[1][i<<1|1];
    	if(d[i<<1]==r[i<<1]-l[i<<1]+1) lc[1][i]=lc[1][i<<1]+lc[1][i<<1|1];
    		else lc[1][i]=lc[1][i<<1];
    	if(!d[i<<1|1]) rc[0][i]=rc[0][i<<1|1]+rc[0][i<<1];
    		else rc[0][i]=rc[0][i<<1|1];
    	if(!d[i<<1]) lc[0][i]=lc[0][i<<1]+lc[0][i<<1|1];
    		else lc[0][i]=lc[0][i<<1];
    	ans[0][i]=max(max(ans[0][i<<1],ans[0][i<<1|1]),rc[0][i<<1]+lc[0][i<<1|1]);
    	ans[1][i]=max(max(ans[1][i<<1],ans[1][i<<1|1]),rc[1][i<<1]+lc[1][i<<1|1]);
    }
    inline void pushdown(int i)
    {
    	if(tag[0][i]!=-1)
    	{
    		tag[0][i<<1]=tag[0][i],tag[0][i<<1|1]=tag[0][i];
    		tag[1][i<<1]=tag[1][i<<1|1]=0;
    		d[i<<1]=(r[i<<1]-l[i<<1]+1)*tag[0][i],d[i<<1|1]=(r[i<<1|1]-l[i<<1|1]+1)*tag[0][i];
    		ans[tag[0][i]][i<<1]=r[i<<1]-l[i<<1]+1,ans[tag[0][i]][i<<1|1]=r[i<<1|1]-l[i<<1|1]+1;
    		lc[tag[0][i]][i<<1]=r[i<<1]-l[i<<1]+1,lc[tag[0][i]][i<<1|1]=r[i<<1|1]-l[i<<1|1]+1;
    		rc[tag[0][i]][i<<1]=r[i<<1]-l[i<<1]+1,rc[tag[0][i]][i<<1|1]=r[i<<1|1]-l[i<<1|1]+1;
    		ans[tag[0][i]^1][i<<1]=0,ans[tag[0][i]^1][i<<1|1]=0;
    		lc[tag[0][i]^1][i<<1]=0,lc[tag[0][i]^1][i<<1|1]=0;
    		rc[tag[0][i]^1][i<<1]=0,rc[tag[0][i]^1][i<<1|1]=0;
    		tag[0][i]=-1;
    	}
    	if(tag[1][i])
    	{
    		if(tag[0][i<<1]==-1) tag[1][i<<1]^=1;
    			else tag[0][i<<1]^=1;
    		if(tag[0][i<<1|1]==-1) tag[1][i<<1|1]^=1;
    			else tag[0][i<<1|1]^=1;
    		d[i<<1]=(r[i<<1]-l[i<<1]+1-d[i<<1]),d[i<<1|1]=(r[i<<1|1]-l[i<<1|1]+1-d[i<<1|1]);
    		std::swap(ans[0][i<<1],ans[1][i<<1]),std::swap(ans[0][i<<1|1],ans[1][i<<1|1]);
    		std::swap(lc[0][i<<1],lc[1][i<<1]),std::swap(lc[0][i<<1|1],lc[1][i<<1|1]);
    		std::swap(rc[0][i<<1],rc[1][i<<1]),std::swap(rc[0][i<<1|1],rc[1][i<<1|1]);
    		tag[1][i]=0;
    	}
    }
    inline int read()
    {
    	char c=getchar();
    	int x=0;
    	while(c<'0'||c>'9') c=getchar();
    	while(c>='0'&&c<='9')
    		x=(x<<3)+(x<<1)+c-48,c=getchar();
    	return x;
    }
    void build(int x,int y,int i)
    {
    	l[i]=x,r[i]=y,tag[0][i]=-1;
    	if(x==y)
    	{
    		d[i]=a[x];
    		lc[a[x]][i]=rc[a[x]][i]=1;
    		ans[a[x]][i]=1;
    		return;
    	}
    	int mid=x+y>>1;
    	build(x,mid,i<<1),build(mid+1,y,i<<1|1);
    	pushup(i);
    }
    void change_1(int x,int y,int i,int val)
    {
    	if(x<=l[i]&&y>=r[i])
    	{
    		d[i]=val*(r[i]-l[i]+1);
    		tag[1][i]=0;
    		tag[0][i]=val;
    		rc[val][i]=lc[val][i]=(r[i]-l[i]+1);
    		ans[val][i]=(r[i]-l[i]+1);
    		rc[val^1][i]=lc[val^1][i]=ans[val^1][i]=0;
    		return;
    	}
    	pushdown(i);
    	int mid=l[i]+r[i]>>1;
    	if(y<=mid) change_1(x,y,i<<1,val);
    		else if(x>mid) change_1(x,y,i<<1|1,val);
    			else change_1(x,y,i<<1|1,val),change_1(x,y,i<<1,val);
    	pushup(i);
    }
    void change_2(int x,int y,int i)
    {
    	if(x<=l[i]&&y>=r[i])
    	{
    		d[i]=(r[i]-l[i]+1-d[i]);
    		if(tag[0][i]!=-1) tag[0][i]^=1;
    			else tag[1][i]^=1;
    		std::swap(rc[0][i],rc[1][i]),std::swap(lc[0][i],lc[1][i]),std::swap(ans[0][i],ans[1][i]);
    		return;
    	}
    	pushdown(i);
    	int mid=l[i]+r[i]>>1;
    	if(y<=mid) change_2(x,y,i<<1);
    		else if(x>mid) change_2(x,y,i<<1|1);
    			else change_2(x,y,i<<1|1),change_2(x,y,i<<1);
    	pushup(i);
    }
    int query(int x,int y,int i)
    {
    	if(x<=l[i]&&y>=r[i]) return d[i];
    	pushdown(i);
    	int mid=l[i]+r[i]>>1;
    	if(y<=mid) return query(x,y,i<<1);
    	if(x>mid) return query(x,y,i<<1|1);
    	return query(x,y,i<<1)+query(x,y,i<<1|1);
    }
    node ask(int x,int y,int i)
    {
    	if(x<=l[i]&&y>=r[i]) return (node){ans[1][i],lc[1][i],rc[1][i],r[i]-l[i]+1};
    	pushdown(i);
    	int mid=l[i]+r[i]>>1;
    	if(y<=mid) return ask(x,y,i<<1);
    	if(x>mid) return ask(x,y,i<<1|1);
    	node L=ask(x,y,i<<1),R=ask(x,y,i<<1|1);
    	node now;
    	if(R.dd==R.rr) now.rr=R.rr+L.rr;
    		else now.rr=R.rr;
    	if(L.dd==L.ll) now.ll=L.ll+R.ll;
    		else now.ll=L.ll;
    	now.dd=L.dd+R.dd;
    	now.t=max(L.t,max(R.t,R.ll+L.rr));
    	return now;
    }
    int main()
    {
    	n=read(),m=read();
    	for(re int i=1;i<=n;i++)	
    		a[i]=read();
    	build(1,n,1);
    	int opt,x,y;
    	while(m--)
    	{
    		opt=read(),x=read()+1,y=read()+1;
    		if(opt==0) change_1(x,y,1,0);
    		if(opt==1) change_1(x,y,1,1);
    		if(opt==2) change_2(x,y,1);
    		if(opt==3) printf("%d
    ",query(x,y,1));
    		if(opt==4) printf("%d
    ",ask(x,y,1).t);
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    WIN10下搭建reactnative开发Android环境
    node使用JsonWebToken 生成token,完成用户登录、登录检测
    SAP 学习网站汇总
    HTML5 学习网站收集
    优化 优化网站设计
    IoC容器 Spring.NET
    ORACLE 简介及安装
    MVC PureMVC
    HTML5 概要认识
    知识点 NHibernate
  • 原文地址:https://www.cnblogs.com/asuldb/p/10206153.html
Copyright © 2011-2022 走看看