hdu4614Vases and Flowers(线段树,段设置,更新时范围的右边值为变量)
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 one blank line after each test case.
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
2
1 9
4
Can not put any one.
2 6
2
0 9
4
4 5
2 3
#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(线段树,段设置,更新时范围的右边值为变量)的更多相关文章
- HDU I Hate It(线段树单节点更新,求区间最值)
http://acm.hdu.edu.cn/showproblem.php?pid=1754 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分 ...
- hdu4267线段树段更新,点查找,55棵线段树.
题意: 给你N个数,q组操作,操作有两种,查询和改变,查询就是查询当前的这个数上有多少,更改是给你a b k c,每次从a到b,每隔k的数更改一次,之间的数不更改,就相当于跳着更新. 思路: ...
- UVA11992不错的线段树段更新
题意: 给你一个矩阵,最大20*50000的,然后有三个操作 1 x1 y1 x2 y2 v 把子矩阵的值全部都加上v 2 x1 y1 x2 y2 v 把子矩阵的值全部都变成v 2 x ...
- hdu4614 Vases and Flowers 线段树+二分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意: 给你N个花瓶,编号是0 到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. ...
- poj3468A Simple Problem with Integers(线段树的区域更新)
http://poj.org/problem?id=3468 真心觉得这题坑死我了,一直错,怎么改也没戏,最后tjj把q[rt].lz改成了long long 就对了,真心坑啊. 线段树的区域更新. ...
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 1698:Just a Hook(线段树,区间更新)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 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 ...
- hdu1698线段树的区间更新区间查询
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
随机推荐
- Save output to a text file from Mac terminal
Simply with output redirection: system_profiler > file.txt Basically, this will take the output ...
- poj 3264 Balanced Lineup (RMQ算法 模板题)
RMQ支持操作: Query(L, R): 计算Min{a[L],a[L+1], a[R]}. 预处理时间是O(nlogn), 查询只需 O(1). RMQ问题 用于求给定区间内的最大值/最小值问题 ...
- ASCII码常用值
大写字母 A~Z 65~90 小写字母a~z 97~122 数字0~9 48~ 57
- 4197: [Noi2015]寿司晚宴
状压dp. 500分解质因数的话,除了最大的质因数只需要8个质数,用二进制x储存,最大的质因数用y来储存(若没有比那8个质数大的质因数就使y=1) 用f[i][j]表示第一个人方案为i,第二个人方案为 ...
- UVa 10820 (打表、欧拉函数) Send a Table
题意: 题目背景略去,将这道题很容易转化为,给出n求,n以内的有序数对(x, y)互素的对数. 分析: 问题还可以继续转化. 根据对称性,我们可以假设x<y,当x=y时,满足条件的只有(1, 1 ...
- bzoj1927: [Sdoi2010]星际竞速
跟上一题几乎一样... #include<cstdio> #include<cstring> #include<iostream> #include<algo ...
- 【C#学习笔记】类型转换
using System; namespace ConsoleApplication { class Program { static void Main(string[] args) { " ...
- 最简单的视音频播放示例2:GDI播放YUV, RGB
前一篇文章对“Simplest Media Play”工程作了概括性介绍.后续几篇文章打算详细介绍每个子工程中的几种技术.在记录Direct3D,OpenGL这两种相对复杂的技术之前,打算先记录一种和 ...
- ORACLE远程连接数据库
1. sqlplus sqlnet.ora 文件格式NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME).客户端就会首先在tnsnames.ora文件中找orcl的记录. ...
- Spring学习之声明式事物管理
public List<Student> selectStudent() { Student s = new Student(); s.setName("zhengbin&quo ...