题目
0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标。操作2清空[a,b]的花瓶,求清除的花的数量。
线段树懒惰标记来更新区间。
操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或者二分找出第num+1个空瓶子的下标,和第num+b个空瓶子的下标。再区间更新为满。
操作2,也相当于区间更新为空。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 50001
using namespace std;
int tree[N<<],lz[N<<];
void PushUp(int node)
{
tree[node]=tree[node<<]+tree[node<<|];
}
void PushDown(int node,int v)
{
if(lz[node]==)tree[node<<]=tree[node<<|]=;//清空区间
else if(lz[node]==)//填满区间
{
tree[node<<]=v-(v>>);//左儿子的区间长度
tree[node<<|]=v>>;
}
lz[node<<]=lz[node<<|]=lz[node];//将懒惰标记下移
lz[node]=;
}
void build(int l,int r,int node)
{
lz[node]=tree[node]=;
if(l==r)return;
int m=l+r>>;
build(l,m,node<<);
build(m+,r,node<<|);
}
//查询[ll,rr]有多少花。节点node对应区间[l,r]
int query(int l,int r,int node,int ll,int rr)
{
if(r<ll||l>rr)return ;//[l,r]不在[ll,rr]范围内
if(ll<=l&&r<=rr)return tree[node];//[l,r]完全在[ll,rr]范围内
if(lz[node])PushDown(node,r-l+);//将懒惰标记下移
int m=l+r>>;
return query(l,m,node<<,ll,rr)+query(m+,r,node<<|,ll,rr);
}
void update(int l,int r,int node,int ll,int rr)
{
if(r<ll||l>rr)return;
if(ll<=l&&r<=rr)
{
tree[node]=r-l+;//区间填满
lz[node]=;//标记为需要填满子区间,直接覆盖原来的懒惰标记
}
else
{
if(lz[node])PushDown(node,r-l+);//先将原有的标记下移
int m=l+r>>;
update(l,m,node<<,ll,rr);
update(m+,r,node<<|,ll,rr);
PushUp(node);
}
}
//找出第v个空瓶子的下标
int solve(int l,int r,int node,int v)
{
if(l==r) return l;
if(lz[node])PushDown(node,r-l+);
int m=l+r>>;
int ans=m-l+-tree[node<<];//左儿子区间有多少空瓶子
if(ans<v) return solve(m+,r,node<<|,v-ans);
return solve(l,m,node<<,v);
}
int dele(int l,int r,int node,int ll,int rr)
{
if(r<ll||l>rr)return ;
int ans=;
if(ll<=l&&r<=rr)
{
ans=tree[node];//要清除的花
tree[node]=;
lz[node]=;
}
else
{
if(lz[node])PushDown(node,r-l+);
int m=l+r>>;
ans=dele(l,m,node<<,ll,rr)+dele(m+,r,node<<|,ll,rr);
PushUp(node);
}
return ans;
}
int main()
{
int t,n,m,k,a,b,ansl,ansr;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
build(,n-,);
for(int i=; i<m; i++)
{
scanf("%d%d%d",&k,&a,&b);
if(k==)
{
int sum=query(,n-,,a,n-);//求a到n-1有多少花
if(sum==n-a) printf("Can not put any one.\n");//如果满了就不能插了
else
{
int num=a-query(,n-,,,a-);//0到a-1有多少空瓶子
ansl=solve(,n-,,num+);//第num+1个空瓶子的下标
ansr=solve(,n-,,min(num+b,num+n-a-sum));//第num+b个空瓶子的下标
printf("%d %d\n",ansl,ansr);
update(,n-,,ansl,ansr);
}
}
else printf("%d\n", dele(,n-,,a,b));
}
printf("\n");
}
}
  

【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)的更多相关文章

  1. HDU 4614 Vases and Flowers(线段树+二分)

    题目链接 比赛的时候一直想用树状数组,但是树状数组区间更新之后,功能有局限性.线段树中的lz标记很强大,这个题的题意也挺纠结的. k = 1时,从a开始,插b个花,输出第一个插的位置,最后一个的位置, ...

  2. HDU-4614 Vases and Flowers 线段树区间更新

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 线段树保存区间是否被覆盖以及区间的和即可,在询问的时候在线段树上二分查找就可以了...代码写得比 ...

  3. 扶桑号战列舰 (单调栈+线段树区间更新懒惰标记 or 栈)

    传送门 •题目描述 题目描述 众所周知,一战过后,在世界列强建造超无畏级战列舰的竞争之中,旧日本海军根据“个舰优越主义”,建造了扶桑级战列舰,完工时为当时世界上武装最为强大的舰只. 同时,扶桑号战列舰 ...

  4. hdu1698 Just a Hook (线段树区间更新 懒惰标记)

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

  5. hdu 4614 Vases and Flowers 线段树

    题目链接 一共n个盒子, 两种操作, 第一种是给出两个数x, y, 从第x个盒子开始放y朵花, 一个盒子只能放一朵, 如果某个盒子已经有了, 那么就跳过这个盒子放下面的盒子. 直到花放完了或者到了最后 ...

  6. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

  7. HDU 1698 Just a Hook(线段树区间更新查询)

    描述 In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes ...

  8. HDU 1556 Color the ball(线段树区间更新)

    Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...

  9. (简单) HDU 1698 Just a Hook , 线段树+区间更新。

    Description: In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of ...

随机推荐

  1. java 22 - 10 多线程之两种代码实现方式的比较与区别

  2. childNodes的兼容性问题

    元素.childNodes:只读 属性 子节点列表集合 标准浏览器下:包含文本和元素类型节点,也会包含非法嵌套的子节点 非标准浏览器下:只包含元素类型节点,ie7下不会包含非法嵌套的子节点 child ...

  3. mongodb分布式查询

    分布式查询:mongodb的分布式模型分为replica set和sharded cluster. sharded集群中将read根据sharding key(分片键)转发到指定的shard节点,re ...

  4. topshelf包装redis为windows服务

    topshelf包装redis为windows服务 Redis服务端目前用的是控制台程序运行,部署的时候能作为windows服务后台运行感觉更好.找到一篇文章Running Redis as a Wi ...

  5. 后台运行程序screen or nohup

    后台运行 方法1 &   方法2:screen screen –S lnmp à起个名字 进去后运行程序 Ctrl+ad à退出lnmp屏幕 Scree –ls à查看 Screen –r x ...

  6. CSS3 动画效果带来的bug

    css3 动画效果比如transition:all 2s linear;这种用来计算及时的物体坐标的话会带来一定的问题 比如把一个DIV从A点移动到B点.JS为DIV.style.left=B; 但是 ...

  7. U3D屏幕空间到世界空间变换

    using UnityEngine; using System.Collections; public class FPSCam : MonoBehaviour { Vector3 lastPos; ...

  8. H2 Database入门

    H2 Database做为轻量级的内嵌数据库,功能十分强大,而且运行时只需要一个jar包即可,下表是官网的描述: 更详细的对比见官网页面: http://www.h2database.com/html ...

  9. c++多重继承小结

    如果一个类从两个不同的类里继承两个同名的成员,则需要在派生类中使用类限定符来区分他们. 即在从A和B派生出来的c类中使用a::Show()和B::Show()来区分从这两个类那里继承的show()方法 ...

  10. Theano3.2-练习之数据集及目标函数介绍

    来自http://deeplearning.net/tutorial/gettingstarted.html#gettingstarted 一.下载 在后续的每个学习算法上,都需要下载对应的文档,如果 ...