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:复杂度分 ...
随机推荐
- 探究Visual Studio生成的.vs文件夹内部结构和作用
https://shiyousan.com/post/636441130259624698 在某个契机的引发下,对VS解决方案中自动生成的.vs文件夹产生了兴趣,以前总对这个文件夹不怎么上心,最近正好 ...
- 8 -- 深入使用Spring -- 1...1Bean后处理器
8.1.1 Bean后处理器(BeanPostProcessor) Bean后处理器主要负责对容器中其他Bean执行后处理,例如为容器中的目标Bean生成代理等. Bean后处理器会在Bean实例创建 ...
- grid简单布局
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 指定cmd窗口或tomcat运行窗口的名称
1. 指定cmd窗口运行时名称 1)直接执行命令:title 窗口名称 2)bat文件中直接加上命令:title 窗口名称 例子: title test_ v1 java -jar -Dfile.en ...
- 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 1.什么都没过滤的入门情况
0x01 背景 首先恭喜Seay法师的力作<代码审计:企业级web代码安全架构>,读了两天后深有感触.想了想自己也做审计有2年了,决定写个PHP代码审计实例教程的系列,希望能够帮助到新人更 ...
- Explaining Delegates in C# - Part 1 (Callback and Multicast delegates)
I hear a lot of confusion around Delegates in C#, and today I am going to give it shot of explaining ...
- 高并发应对:淘宝CDN缓存服务器部署探秘
转自:http://server.chinabyte.com/6/12663506.shtml “好,时间到,开抢!”坐在电脑前早已等待多时的宋兰(化名)一看时间已到2011年11月11日零时,便迫不 ...
- 使用js是想防止表单重复提交的效果
直接上代码: <html> <head> <title>Form表单</title> <script type="text/javasc ...
- PHP array_merge 隐藏坑。。
foreach ($list as $k=> $teamGoods){ if($teamGoods['status'] > 4){ $_soldGoods[] = $teamGoods; ...
- Androidの解决自动旋转导致activity重启问题
记录一下,经常在新建项目的时候就会发生这个问题,正好上次有个群友也问道了这个问题.就是设备屏幕打开自动旋转会导致activity重启,这样会消耗很多资源. 比如在加载listview数据会重新请求数据 ...