• [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;
    }
    
    
  • 相关阅读:
    java获取当前项目或类路径
    java转义字符处理——“\”替换为“/”
    OpenModelica 在特定目录下生成仿真结果文件
    Eclipse常用设置
    java反编译器
    OMShell常用命令及遇到的问题
    Java中的单实例
    Eclipse常用设置
    Eclipse快捷键
    vlookup+match高亮显示行
  • 原文地址:https://www.cnblogs.com/PPXppx/p/11336420.html
Copyright © 2020-2023  润新知