[SHOI2015]脑洞治疗仪
时间:2019-08-11
本文章向大家介绍[SHOI2015]脑洞治疗仪,主要包括[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\n",ask(l,r));
}
return 0;
}
原文地址:https://www.cnblogs.com/PPXppx/p/11336440.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python入门摘要
- 这些 ECMAScript 模块知识,都是我需要知道的
- 微信小程序【事件绑定】入门一篇就搞定
- 一个后端狗的 Vue 笔记【入门级】
- 这才是现代C++单例模式简单又安全的实现
- Linux 学习笔记(1) 查看文件内容
- Python从入门到熟练(3):第一个程序
- 数学系的概率论和我们的不太一样。。。
- 如何实现一个优雅的Python的Json序列化库
- 还在从零开始搭建项目?手撸了款快速开发脚手架!
- Node.js 中的 require 是如何工作的?
- Ajax请求携带Cookie
- 关于kubernetes垃圾回收那点事
- 强化学习笔记11:工程师看强化学习
- 强化学习笔记10:经典游戏示例 classic games