Problem Description
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
3 7
2
1 9
4
Can not put any one.

2 6
2
0 9
4
4 5
2 3

题目意思:每一组的第一行有两个数n,m, n表示花瓶数量0~n-1,开始全为空,接下来有m组,每组有数k,a,b;当k=1时, 从a位置开始插花,b为花数量,当花瓶有花时,跳过当前,直到找到空花瓶再插入,输出插入第一支花的位置和最后一支花的位置,花可以没插完,当一支都没有插入则输出Can not put any one.;当k=2时,清空【a,b】的花瓶,并输出在范围内花的数量。
#include<stdio.h>
#define N 50010
struct node
{
int sum,b;//sum为在范围内的花数,b为判断是否全为空或全为满则为1,否则为0
}tree[4*N];
void biulde(int l,int r,int k)
{
int m=(l+r)/2;
tree[k].sum=0; tree[k].b=1;
if(l==r) return ;
biulde(l,m,k*2); biulde(m+1,r,k*2+1);
}
void set_child(int l,int r,int k)
{
int m=(l+r)/2;
tree[k*2].b=tree[k*2+1].b=1;
if(tree[k].sum==r-l+1){
tree[k*2].sum=m-l+1; tree[k*2+1].sum=r-m;
}
else{
tree[k*2].sum=0; tree[k*2+1].sum=0;
}
}
int QL,QR,L,R,ans,n;
void putInFlower(int l,int r,int k)
{
if(ans<=0) return ;
int m=(l+r)/2;
if(L<=l&&r<=R&&tree[k].b)
{
if(!tree[k].sum) {
int tans=ans;
ans-=(r-l+1); tree[k].sum=r-l+1;
if(QL<0) QL=l-1;
QR=r-1;
}
else{//跳动插花范围的右边值,R刚好是插完花的右边范围的最小值,除非超出花瓶数量,则为n
R+=(r-l+1); if(R>n) R=n;
}
return ;
}
if(tree[k].b)
set_child(l,r,k);
tree[k].b=0;
if(L<=m) putInFlower(l,m,k*2);
if(R>m) putInFlower(m+1,r,k*2+1); tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
if(tree[k].sum==r-l+1||!tree[k].sum)
tree[k].b=1;
}
void clear(int l,int r,int k)
{
int m=(l+r)/2;
if(L<=l&&r<=R)
{
ans+=tree[k].sum; tree[k].b=1; tree[k].sum=0;
return ;
}
if(tree[k].b)
set_child(l,r,k);
tree[k].b=0;
if(L<=m) clear(l,m,k*2);
if(R>m) clear(m+1,r,k*2+1); tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
if(tree[k].sum==r-l+1||!tree[k].sum)
tree[k].b=1;
}
int main()
{
int t,m,x;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
biulde(1,n,1);
while(m--)
{
scanf("%d%d",&x,&L); L++;
if(x==1){
scanf("%d",&ans);
R=L+ans-1; QL=QR=-1;
putInFlower(1,n,1);
if(QR>=0)
printf("%d %d\n",QL,QR);
else
printf("Can not put any one.\n");
}
else{
scanf("%d",&R); R++; ans=0;
clear(1,n,1);
printf("%d\n",ans);
}
}
printf("\n");
}
return 0;
}

hdu4614Vases and Flowers(线段树,段设置,更新时范围的右边值为变量)的更多相关文章

  1. HDU I Hate It(线段树单节点更新,求区间最值)

    http://acm.hdu.edu.cn/showproblem.php?pid=1754 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分 ...

  2. hdu4267线段树段更新,点查找,55棵线段树.

    题意:      给你N个数,q组操作,操作有两种,查询和改变,查询就是查询当前的这个数上有多少,更改是给你a b k c,每次从a到b,每隔k的数更改一次,之间的数不更改,就相当于跳着更新. 思路: ...

  3. UVA11992不错的线段树段更新

    题意:       给你一个矩阵,最大20*50000的,然后有三个操作 1 x1 y1 x2 y2 v  把子矩阵的值全部都加上v 2 x1 y1 x2 y2 v  把子矩阵的值全部都变成v 2 x ...

  4. hdu4614 Vases and Flowers 线段树+二分

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意: 给你N个花瓶,编号是0  到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. ...

  5. poj3468A Simple Problem with Integers(线段树的区域更新)

    http://poj.org/problem?id=3468 真心觉得这题坑死我了,一直错,怎么改也没戏,最后tjj把q[rt].lz改成了long long 就对了,真心坑啊. 线段树的区域更新. ...

  6. hdu 1556:Color the ball(线段树,区间更新,经典题)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. hdu 1698:Just a Hook(线段树,区间更新)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. UVA 12436-Rip Van Winkle's Code(线段树的区间更新)

    题意: long long data[250001]; void A( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = da ...

  9. hdu1698线段树的区间更新区间查询

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

随机推荐

  1. Redis VS Memcached

    1. Redis & Memecached比较   内存管理 持久化 数据类型 客户端支持 并发性能 Memcached 预分配的内存池的方式 不支持持久化 支持简单的key-value存储 ...

  2. Difference between 2>&-, 2>/dev/null, |&, &>/dev/null and >/dev/null 2>&1

    Reference link: http://unix.stackexchange.com/questions/70963/difference-between-2-2-dev-null-dev-nu ...

  3. 高斯消元 分析 && 模板 (转载)

    转载自:http://hi.baidu.com/czyuan_acm/item/dce4e6f8a8c45f13d7ff8cda czyuan 先上模板: /* 用于求整数解得方程组. */ #inc ...

  4. C# 创建iis站点以及IIS站点属性,iis不能启动站点

    DontLog = False是否将客户端的请求写入日志文件 2011年04月09日 #region CreateWebsite 新增网站 public string CreateWebSite(st ...

  5. UVa 11992 (线段树 区间修改) Fast Matrix Operations

    比较综合的一道题目. 二维的线段树,支持区间的add和set操作,然后询问子矩阵的sum,min,max 写完这道题也是醉醉哒,代码仓库里还有一份代码就是在query的过程中也pushdown向下传递 ...

  6. 为什么会出现ADB rejected shell command

    出现这个问题,是由于在运行过程中,android emulator 没有打开,可以在run configurations--target- automatic-设置自己的android-version ...

  7. plsql developer 使用技巧

    plsql developer 使用技巧 Oracle数据库相信已成为很多企业构建自身关键业务的重要后台支撑,也是众多开发人员常常采用的后台.但Oracle自己提供的一套客户端工具不是很好用,极大的影 ...

  8. 【转】Linux 之 /etc/profile、~/.bash_profile 等几个文件的执行过程

    原文网址:http://blog.csdn.net/ithomer/article/details/6322892 在登录Linux时要执行文件的过程如下:在刚登录Linux时,首先启动 /etc/p ...

  9. 如何使用 orachk 工具

    Oracle RAC 安装完毕后的健壮性是一个令人头疼的问题.之前Oracle为之专门推出了raccheck工具,确实方便了我们这些个苦逼的DBA.现在Oracle在raccheck的基础之上又推出了 ...

  10. 关于DatePicker控件在IsEnabled为False视觉效果没有明显辨识度的处理方法

    DatePicker控件在IsEnabled为False时界面没有让人看上去不可用(背景为灰色等)的效果.容易让用户迷惑. 可以用下面的代码增加设置透明度的触发器来解决(XAML以及C#方式): &l ...