清理花瓶(NKOI 2460)
来源:互联网 发布:零售业数据分析 编辑:程序博客网 时间:2024/06/10 19:14
过于害怕线段树。
问题描述
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
来源 改编自 multi 2013 contest 2
看到这道题显然是线段树,关键就是在于ins函数处。鉴于本人早已失了智所以肝了一个小时没肝出来。增加的两个辅助数组l[]与r[]记录当前节点处左/右第一个为空的位置,如果满了就到外面去。(ps.为何每次看到别人的骚操作觉得很有道理自己就没想出来?? pps.今天一道状压dp+kruskal硬是让我用裸kruskal骗了90分..)
#include <cstdio>#include <iostream>#include <cmath>#include <algorithm>#include <cstring>#include <iomanip>#define lson (p<<1)#define rson (p<<1|1)#define mid (l+r>>1)using namespace std;inline int R(){ int o=0;char t=getchar(); while(t<48||t>57)t=getchar(); for(;t<58&&t>47;t=getchar())o=(o<<1)+(o<<3)+t-48; return o;}inline void W(int x){ if(x<0){x=-x;putchar(45);} if(x>9)W(x/10); putchar(x%10+48);}inline int dmax(int a,int b){return a>b?a:b;}inline int dmin(int a,int b){return a<b?a:b;}const int N = 500000;int e[N], lazy[N], ls[N], rs[N], n, m, cmd, a, b;int x, y, xl, xr;void putdown( int p, int l, int r ){ if( lazy[p] < 0 ){ e[lson] = mid - l + 1; e[rson] = r - mid; ls[lson] = l; rs[rson] = r; ls[rson] = mid + 1; rs[lson] = mid; lazy[lson] = lazy[rson] = -1; lazy[p] = 0; } else { e[lson] = e[rson] = 0; ls[lson] = mid + 1; rs[rson] = mid; ls[rson] = r+1; rs[lson] = l-1; lazy[lson] = lazy[rson] = 1; lazy[p] = 0; }}void ins( int p, int l, int r ){ if( ! y ) return; if( lazy[p] ) putdown( p, l, r ); if( ! e[p] ) return; if( x <= l && e[p] <= y ){ y -= e[p]; e[p] = 0; lazy[p] = 1; xl = dmin( xl, ls[p] ); xr = dmax( xr, rs[p] ); ls[p] = r + 1; rs[p] = l - 1; return; } if( x <= mid ) ins( lson, l, mid ); if( x <= r ) ins( rson, mid+1, r ); ls[p] = e[lson] ? ls[lson] : ls[rson]; rs[p] = e[rson] ? rs[rson] : rs[lson]; e[p] = e[lson] + e[rson];}int del( int p, int l, int r ){ if( lazy[p] ) putdown( p, l, r ); int tmp = 0; if( x <= l && r <= y ){ ls[p] = l; rs[p] = r; tmp = r - l + 1 - e[p]; e[p] = r - l + 1; lazy[p] = -1; return tmp; } if( x <= mid && y >= l ) tmp += del( lson, l, mid ); if( x <= r && y > mid ) tmp += del( rson, mid+1, r ); ls[p] = e[lson] ? ls[lson] : ls[rson]; rs[p] = e[rson] ? rs[rson] : rs[lson]; e[p] = e[lson] + e[rson]; return tmp;}int main(){ n = R(); m = R(); lazy[1] = -1; e[1] = n; ls[1] = 1; rs[1] = n; while( m -- ){ cmd = R(); x = R(); y = R(); if( cmd & 1 ){ x ++; xl = n + 1; xr = 0; ins( 1, 1, n ); if( xr == 0 ) puts("Can not put any one."); else W(xl-1),putchar(32),W(xr-1),putchar(10); } else { x ++; y ++; W( del( 1, 1, n ) ); putchar(10); } } return 0;}
- 清理花瓶(NKOI 2460)
- NKOJ-2460 清理花瓶
- NKOJ-2460 清理花瓶
- P2460清理花瓶
- 花瓶。
- 花瓶
- 花瓶插花
- 花瓶 暴力
- Sony是花瓶
- 花瓶与旧屋
- 象脚花瓶
- 花 花瓶 投其所好
- 不想再做 '花瓶'
- ~~现代女性不在是花瓶~~
- DP-花瓶摆放
- 蓝色花瓶的故事
- 花瓶的线性dp
- [c]sdnuoj1044 花瓶插花
- I2C串行总线及串行EEPROM的扩展
- Java Develop——使用 Docker 将 Web 应用容器化
- Hdu 3804 Query on a tree 树链剖分+线段树
- 字符串拼接问题和data数据的长度
- 合法括号子段 51Nod
- 清理花瓶(NKOI 2460)
- 使用Scrapy爬取百万知乎用户信息
- hdu 1203
- Party at Hali-Bula UVA
- 【CUGBACM15级BC第24场 A】hdu 5150 Sum Sum Sum
- HTML初学者笔记3
- [cocos2d-x]判断两个矩形是否有交叉区域
- Simple Skewness CodeForces
- bzoj 1336/bzoj 1337: [Balkan2002]Alien最小圆覆盖 随机增量法