zoukankan      html  css  js  c++  java
  • [SHOI2015]脑洞治疗仪

    洛咕

    题意:第一行两个整数 (n)(m),表示 SHTSC 的大脑可分为从(1)(n)编号的(n)个连续区域,有(m)个操作。

    以下(m)行每行是下列三种格式之一:

    • (0 l r):SHTSC 挖了一个范围为([l,r])的脑洞。

    • (1 l_0 r_0 l_1 r_1):SHTSC 进行了一次脑洞治疗,用从(l_0)(r_0)的脑组织修补(l_1)(r_1)的脑洞。

    • (2 l r):SHTSC 询问([l,r])区间内最大的脑洞有多大。
      上述区间均在([1,n])范围内。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<map>
    #include<set>
    #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 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 void change(int l,int r,int ll,int rr){
    	IT itr=split(r+1),itl=split(l);
    	int sum=0;
    	for(IT it=itl;it!=itr;++it)
    		if(it->val!=0)sum+=(it->r-it->l+1);
    	s.erase(itl,itr);
    	s.insert(node(l,r,0));
    	if(!sum)return;
    	itr=split(rr+1),itl=split(ll);
    	for(;itl!=itr;++itl)
    		if(itl->val==0){ 
    			if(sum<=(itl->r-itl->l+1)){ 
    				if(sum==itl->r-itl->l+1)itl->val=1; 
    				else{
    					int ql=itl->l,qr=itl->r; 
    					s.erase(itl);
    					s.insert(node(ql,ql+sum-1,1));
    					s.insert(node(ql+sum,qr,0)); 
    				}
    				return;
    			}
    			else itl->val=1,sum-=(itl->r-itl->l+1); 
    		}
    }
    inline int ask(int l,int r){
    	int ans=0,cnt=0;
    	IT itr=split(r+1),itl=split(l);
    	for(;itl!=itr;++itl){
    		if(itl->val==1)ans=max(ans,cnt),cnt=0;
    		else cnt+=itl->r-itl->l+1;
    	}
    	return max(ans,cnt);
    }
    int main(){
    	int n=read(),m=read();
    	s.insert(node(1,n,1));
    	while(m--){
    		int opt=read(),l=read(),r=read();
    		if(opt==0)assign(l,r,0);
    		else if(opt==1){
    			int ll=read(),rr=read();
    			change(l,r,ll,rr);
    		}
    		else if(opt==2)printf("%d
    ",ask(l,r));
    	}
        return 0;
    }
    
    
  • 相关阅读:
    0426-mysql插入语句大全
    JS节点操作
    模态框
    滚动监听 after选择器
    JS数组
    js函数 DOM操作
    JS循环 for while 全局/局部变量 短路
    JavaScript 基础 if switch 弹窗 运算符
    无序列表属性 隐藏方式 JS简介
    Css问题 margin float 文档流 背景图底部充满
  • 原文地址:https://www.cnblogs.com/PPXppx/p/11336440.html
Copyright © 2011-2022 走看看