hdu4614 Vases and Flowers【线段树】【二分】
Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N-1. When she receive some flowers, she will try to put them in the vases, one flower in one vase. She randomly choose the vase A and try to put a flower in the vase. If the there is no flower in the vase, she will put a flower in it, otherwise she skip this vase. And then she will try put in the vase A+1, A+2, ..., N-1, until there is no flower left or she has tried the vase N-1. The left flowers will be discarded. Of course, sometimes she will clean the vases. Because there are too many vases, she randomly choose to clean the vases numbered from A to B(A <= B). The flowers in the cleaned vases will be discarded.
Input
The first line contains an integer T, indicating the number of test cases.
For each test case, the first line contains two integers N(1 < N < 50001) and M(1 < M < 50001). N is the number of vases, and M is the operations of Alice. Each of the next M lines contains three integers. The first integer of one line is K(1 or 2). If K is 1, then two integers A and F follow. It means Alice receive F flowers and try to put a flower in the vase A first. If K is 2, then two integers A and B follow. It means the owner would like to clean the vases numbered from A to B(A <= B).
Output
For each operation of which K is 1, output the position of the vase in which Alice put the first flower and last one, separated by a blank. If she can not put any one, then output 'Can not put any one.'. For each operation of which K is 2, output the number of discarded flowers.
Output one blank line after each test case.
Sample Input
2
10 5
1 3 5
2 4 5
1 1 8
2 3 6
1 8 8
10 6
1 2 5
2 3 4
1 0 8
2 2 5
1 4 4
1 2 3
Sample Output
[pre]3 7
2
1 9
4
Can not put any one. 2 6
2
0 9
4
4 5
2 3 [/pre]
要和二分结合一下 线段树方面没有什么特别的
但是一时想不到要和二分结合
查询就是查区间的和 更新也就是全变0或全变1 关键就是怎么找到最开始可以插花的位子和最后一个位子
这里就需要二分了
先二分找到可以插花的位子 pos
再二分找到可以插花的最远的位子ans 这个位子可能已经有花了 反正就是pos到ans可以把花都插进去
最后二分找到实际的最后插花的位子 realans
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#define inf 1e18
using namespace std;
const int maxn = 50005;
int flower[maxn << 2];
int same[maxn << 2];
int m, n;
void pushup(int rt)
{
flower[rt] = flower[rt << 1] + flower[rt<<1|1];
//same[rt] = same[rt<<1] && same[rt<<1|1];
}
void build(int l, int r, int rt)
{
flower[rt] = 0;
same[rt] = 0;
if(l == r) return;
int m = (l + r) >> 1;
build(l, m, rt << 1);
build(m + 1, r, rt << 1 | 1);
pushup(rt);
}
void pushdown(int l, int r, int rt)
{
if(same[rt]){
int m = (l + r) / 2;
same[rt<<1] = same[rt<<1|1] = same[rt];
flower[rt<<1] = (m - l + 1) * same[rt];
flower[rt<<1|1] = (r - m) * same[rt];
if(same[rt] == -1){
flower[rt<<1] = flower[rt<<1|1] = 0;
}
same[rt] = 0;
}
}
void update(int L, int R, int x, int l, int r, int rt)
{
if(l >= L && r <= R){
if(x == 1){
flower[rt] = r - l + 1;
same[rt] = true;
}
else{
flower[rt] = 0;
same[rt] = -1;
}
return;
}
pushdown(l, r, rt);
int m = (l + r) / 2;
if(L <= m) update(L, R, x, l, m, rt<<1);
if(R > m) update(L, R, x, m + 1, r, rt<<1|1);
pushup(rt);
}
int query(int L, int R, int l, int r, int rt)
{
if(L <= l && R >= r){
return flower[rt];
}
pushdown(l, r, rt);
int m = (l + r) / 2, ans = 0;
if(L <= m) ans += query(L, R, l, m, rt<<1);
if(R > m) ans += query(L, R, m + 1, r, rt<<1|1);
pushup(rt);
return ans;
}
int main()
{
int t;
cin>>t;
while(t--){
scanf("%d%d", &n, &m);
build(1, n, 1);
while(m--){
int l, r, op;
scanf("%d%d%d", &op, &l, &r);
l++;r++;
if(op == 1){
r--;
int left = l, right = n, pos = -1;
while(right - left >= 0){//找第一个可插花点
int mid = (right + left) / 2;
if(query(l, mid, 1, n, 1) == mid - l + 1){
left = mid + 1;
}
else{
right = mid - 1;
pos = mid;
}
}
if(pos == -1)
printf("Can not put any one.\n");
else{
int ans = -1;
left = pos;
right = n;
while(right - left >= 0){//找最远可插花位子 得到的ans可能原来已经被插上花
int mid = (left + right) / 2;
if(mid - pos + 1 - query(pos, mid, 1, n, 1) <= r){
left = mid + 1;
ans = mid;
}
else{
right = mid - 1;
}
}
int realans = -1;
left = pos;
right = ans;
while(right - left >= 0){//找到实际插最后一朵花的位子,可能花没被插完
//要在pos到ans中找到最远的空位
int mid = (left + right) / 2;
if(ans - mid + 1 - query(mid, ans, 1, n, 1) == 0){
right = mid - 1;
realans = mid;
}
else left = mid + 1;
}
if(realans == -1){
printf("%d %d\n", pos - 1, ans - 1);
}
else{
printf("%d %d\n", pos - 1, realans - 2);
}
update(pos, ans, 1, 1, n, 1);
}
}
if(op == 2){
printf("%d\n", query(l, r, 1, n, 1));
update(l, r, -1, 1, n, 1);
}
}
printf("\n");
}
return 0;
}
hdu4614 Vases and Flowers【线段树】【二分】的更多相关文章
- hdu4614 Vases and Flowers 线段树+二分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意: 给你N个花瓶,编号是0 到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. ...
- hdu4614 Vases and Flowers 线段树
Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N ...
- HDU-4614 Vases and Flowers 线段树区间更新
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 线段树保存区间是否被覆盖以及区间的和即可,在询问的时候在线段树上二分查找就可以了...代码写得比 ...
- HDU 4614 Vases and Flowers(线段树+二分)
题目链接 比赛的时候一直想用树状数组,但是树状数组区间更新之后,功能有局限性.线段树中的lz标记很强大,这个题的题意也挺纠结的. k = 1时,从a开始,插b个花,输出第一个插的位置,最后一个的位置, ...
- hdu 4614 Vases and Flowers 线段树
题目链接 一共n个盒子, 两种操作, 第一种是给出两个数x, y, 从第x个盒子开始放y朵花, 一个盒子只能放一朵, 如果某个盒子已经有了, 那么就跳过这个盒子放下面的盒子. 直到花放完了或者到了最后 ...
- hdu4614 线段树+二分 插花
Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N ...
- Codeforces Gym 100803G Flipping Parentheses 线段树+二分
Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块
!!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...
- luogu4422 [COCI2017-2018#1] Deda[线段树二分]
讨论帖:线段树二分的题..我还考场切过..白学 这题我一年前的模拟赛考场还切过,现在就不会了..好菜啊. 显然直接线段树拆成$\log n$个区间,然后每个区间在进行线段树二分即可. UPD:复杂度分 ...
随机推荐
- python带参装饰器的改良版
简单点就是这种 def deco2(param=1): def _deco2(fun): def __deco2(*args, **kwargs): print (param) fun(*args, ...
- IOS 应用官方接口地址
地址: http://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-a ...
- Android的WebView控件载入网页显示速度慢的究极解决方案
Android的WebView控件载入网页显示速度慢的究极解决方案 [转载来源自http://hi.baidu.com/goldchocobo/] 秒(甚至更多)时间才会显示出来.研究了很久,搜遍了国 ...
- UML类图关系(转,添加了实例)
UML类图关系(泛化 .继承.实现.依赖.关联.聚合.组合) 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Associati ...
- BearSkill纯代码搭建iOS界面
欢迎相同喜欢动效的project师/UI设计师/产品增加我们 iOS动效特攻队–>QQ群:547897182 iOS动效特攻队–>熊熊:648070256 浅谈一下 关于iOS兼容布局一直 ...
- Java重定向输出流实现程序日志
创建一个类,在该类的main主方法中,保存System类的out成员变量为临时变量,然后创建一个新的文件输出流,并把这个输出流设置为System类新的输出流.在程序关键位置输出调试信息,这些调试信息将 ...
- 5 -- Hibernate的基本用法 --4 8 外连接抓取属性
外连接抓取能限制执行SQL语句的次数来提高效率,这种外连接抓取通过在单个select语句中使用outer join来一次抓取多个数据表的数据. 外连接抓取允许在单个select语句中,通过@ManyT ...
- VS2015编译提示无法运行“rc.exe”
使用VSx64命令行编译项目,提示无法运行“rc.exe” 想办法搜索rc.exe和rcdll.dll这两个文件,然后拷贝到C:\Program Files (x86)\Microsoft Visua ...
- IMAP命令与分析
https://www.cnblogs.com/crystalray/p/3304688.html Internet Mail Access Protocol(缩写为IMAP,以前称作交互邮件访问协议 ...
- time_t到.NET DateTime的转换
time函数返回的time_t是一个utc时间且相对于1970年1月1日的total seconds,转换到DateTime只需以相同的方式转换回去即可. C/C++ auto t = time(); ...