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

    洛咕

    题意:lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作:

    0 a b 把[a, b]区间内的所有数全变成0

    1 a b 把[a, b]区间内的所有数全变成1

    2 a b 把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,把所有的1变成0

    3 a b 询问[a, b]区间内总共有多少个1

    4 a b 询问[a, b]区间内最多有多少个连续的1

    对于每一种询问操作,lxhgww都需要给出回答,聪明的程序员们,你们能帮助他吗?

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<map>
    #include<set>
    #define ll long long
    #define IT set<node>::iterator
    using namespace std;
    inline int read(){
        int x=0,o=1;char ch=getchar();
        while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
        if(ch=='-')o=-1,ch=getchar();
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*o;
    }
    struct node{
    	int l,r;mutable int val;
    	node(int L,int R=-1,int V=0){l=L,r=R,val=V;}
    	bool operator <(const node &x)const{
    		return l<x.l;
    	}
    };
    set<node>s;
    inline IT split(int pos){
    	IT it=s.lower_bound(node(pos));
    	if(it!=s.end()&&it->l==pos)return it;
    	--it;
    	int l=it->l,r=it->r,val=it->val;
    	s.erase(it);
    	s.insert(node(l,pos-1,val));
    	return s.insert(node(pos,r,val)).first;
    }
    inline void add(int l,int r){
    	IT itr=split(r+1),itl=split(l);
    	for(;itl!=itr;++itl)itl->val^=1;
    	return;
    }
    inline void assign(int l,int r,int val){
    	IT itr=split(r+1),itl=split(l);
    	s.erase(itl,itr);
    	s.insert(node(l,r,val));
    }
    inline int ask1(int l,int r){
    	int ans=0;
    	IT itr=split(r+1),itl=split(l);
    	for(;itl!=itr;++itl)
    		if(itl->val==1)ans+=(itl->r-itl->l+1);
    	return ans;
    }
    inline int ask2(int l,int r){
        int ans=0,cnt=0;
        IT itr=split(r+1),itl=split(l);
        for(;itl!=itr;++itl){
            if(itl->val==0)ans=max(ans,cnt),cnt=0;
            else cnt+=itl->r-itl->l+1;
        }
        return max(ans,cnt);
    }
    int main(){
    	int n=read(),m=read();
    	for(int i=1;i<=n;++i){
    		int a=read();
    		s.insert(node(i,i,a));
    	}
    	for(int i=1;i<=m;++i){
    		int opt=read(),l=read(),r=read();++l;++r;
    		if(opt==0)assign(l,r,0);
    		else if(opt==1)assign(l,r,1);
    		else if(opt==2)add(l,r);
    		else if(opt==3)printf("%d
    ",ask1(l,r));
    		else if(opt==4)printf("%d
    ",ask2(l,r));
    	}
        return 0;
    }
    
    
  • 相关阅读:
    ext导出表格数据到excel中
    Oracle 外连接和 (+)号的用法
    通过json取树
    最简单的extjs 树
    extjs放在本地tomcat中部署运行
    extjs viewport panel tabPanel tree
    jsp注意的问题(初学)
    查看进程的路径,不用第三方软件
    vc常用技巧
    表单中单选按钮的有效性控制问题
  • 原文地址:https://www.cnblogs.com/PPXppx/p/11336420.html
Copyright © 2011-2022 走看看