P2460清理花瓶
来源:互联网 发布:淘宝玩具古剑 编辑:程序博客网 时间:2024/04/30 22:22
问题描述
Nicole是大家心中的女神,她每天都会收到很多束男生们送的鲜花。她有N个花瓶,编号0到N-1.
每天她都会试着把收到的花束放到花瓶里,一个花瓶只能装一束花。她总是随机地选择一个花瓶A,如果该花瓶是空的,她就放一束花在里面,否则她会跳过这个花瓶。接着她会试着往A+1,A+2,…,N-1号花瓶里面放花,直到没有花了或者是第N-1号花瓶都被讨论了。然后她会扔掉剩下的花。
有时Nicole也会去清理花瓶,因为花瓶太多了,所以她每次都随机选择一段花瓶清理。比如编号A到编号B这一段花瓶,她会把里面的花全都扔掉。
输入格式
第一行,两个整数N和M,表示花瓶的个数和操作的次数
接下来M行,每行三个整数K,A,B。
若K=1,表示今天Nicole收到了B束花,她打算从第A号花瓶开始放花。
若K=2,表示今天Nicole要清理花瓶,她打算清理掉从第A号到第B号花瓶里的花(A <= B)。
输出格式
对于每次操作,输出一行结果:
若K=1,输出Nicole放花的起止花瓶的编号。若一束花也放不进去,输出 “Can not put any one.”
若k=2,输出Nicole清理掉的花的数目。
样例输入
输入样例1
10 5
1 3 5
2 4 5
1 1 8
2 3 6
1 8 8
输入样例2
10 6
1 2 5
2 3 4
1 0 8
2 2 5
1 4 4
1 2 3
样例输出
输出样例1
3 7
2
1 9
4
Can not put any one.
输出样例2
2 6
2
0 9
4
4 5
2 3
提示
1 < N < 50001
1 < M < 50001
题解
线段树加二分查找
注意二分查找边界(手推小数据)
代码
#include<stdio.h> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> #include<cstring> #include<queue> using namespace std; #define maxn 1e9 #define pr cout<<//lazy 修改下一层值并延续标记 #define inf 50005//下放的意义为修改下一层的数值 int n,m; struct node{ int a,b,x,lazy; }; node tree[inf*5]; void bt (int p,int x,int y) { int mid=x+y>>1; tree[p].a=x;tree[p].b=y; if(x==y) return; bt(p<<1,x,mid); bt(p<<1|1,mid+1,y); } void pd(int k) { tree[k<<1].lazy=tree[k].lazy; tree[k<<1|1].lazy=tree[k].lazy; if(tree[k].lazy==1){ tree[k<<1].x=tree[k<<1].b-tree[k<<1].a+1; tree[k<<1|1].x=tree[k<<1|1].b-tree[k<<1|1].a+1; } if(tree[k].lazy==2){ tree[k<<1].x=tree[k<<1|1].x=0; } tree[k].lazy=0; } void add(int p,int x,int y){ if(tree[p].lazy) pd(p); if(tree[p].a>=x&&tree[p].b<=y) { tree[p].x=tree[p].b-tree[p].a+1; tree[p].lazy=1; return; } int mid=tree[p].a+tree[p].b>>1; if(mid>=x) add(p<<1,x,y); if(mid<y) add(p<<1|1,x,y); tree[p].x=tree[p<<1].x+tree[p<<1|1].x; } int cl(int p,int x,int y){ if(tree[p].lazy) pd(p); if(tree[p].a>=x&&tree[p].b<=y) { int t=tree[p].x; tree[p].x=0; tree[p].lazy=2; return t; } int mid=tree[p].a+tree[p].b>>1; int t1=0,t2=0; if(mid>=x) t1=cl(p<<1,x,y); if(mid<y) t2=cl(p<<1|1,x,y); tree[p].x=tree[p<<1].x+tree[p<<1|1].x; return t1+t2;} int ask(int p,int x,int y){ if(tree[p].lazy) pd(p); if(tree[p].a>=x&&tree[p].b<=y) return tree[p].x; int l1=0,r1=0,mid=tree[p].a+tree[p].b>>1; if(mid>=x) l1=ask(p<<1,x,y); if(mid<y) r1=ask(p<<1|1,x,y); return l1+r1; } int b1(int x,int y) { int l=x,r=n; while(l<=r){ int mid=(l+r)>>1; if(mid-x+1-ask(1,x,mid)>=y) r=mid-1; else l=mid+1; } return l; } int b2(int x,int y) { int l=1,r=x; while(l<=r){ int mid=(l+r)>>1; if(x-mid+1-ask(1,mid,x)>=y) l=mid+1; else r=mid-1; } return r; } int main() { int i,j; scanf("%d%d",&n,&m); int x,y,z; bt(1,1,n); for(i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&z); if(x==1){ y++; int t=n-y+1-ask(1,y,n); if(t==0){ cout<<"Can not put any one."<<endl; } else{ z=min(z,t); int en=b1(y,z); int st=b2(en,z); cout<<st-1<<" "<<en-1<<endl; add(1,st,en); } } else{ y++;z++; cout<<cl(1,y,z)<<endl; } } }
- P2460清理花瓶
- NKOJ-2460 清理花瓶
- 清理花瓶(NKOI 2460)
- NKOJ-2460 清理花瓶
- 花瓶。
- 花瓶
- 花瓶插花
- 花瓶 暴力
- Sony是花瓶
- 花瓶与旧屋
- 象脚花瓶
- 花 花瓶 投其所好
- 不想再做 '花瓶'
- ~~现代女性不在是花瓶~~
- DP-花瓶摆放
- 蓝色花瓶的故事
- 花瓶的线性dp
- [c]sdnuoj1044 花瓶插花
- 线段树模板
- 搭建ELK(ElasticSearch+Logstash+Kibana)日志分析系统(十) elasticsearch集群部署
- VsCode插件整理
- mongodb添加修改用户,设置权限
- 如何获得select被选中option的value和text
- P2460清理花瓶
- 博客搬家
- Android使用讯飞SDK开发语音识别及合成小Demo
- Android应用更改系统语言
- prime flyd 基础算法
- Git 推送项目新内容
- 今天在数据库中做插入时,提醒“当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'TB_Admin_Role' 中的标识列插入显式值。”的问题。
- 怎么分辨博文的好坏
- 接口测试简介及如何做接口测试