题目
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中字符流与字节流的区别

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  2. 转: Git远程操作详解 (阮一峰)

    说明: 通过这个说明终于把远程操作给搞明白了. http://www.ruanyifeng.com/blog/2014/06/git_remote.html

  3. Lobes of the brain

    Source: https://en.wikipedia.org/wiki/Lobes_of_the_brain (Except for the last figure) Terminologia A ...

  4. Web服务器父与子 Apache和Tomcat区别

    http://developer.51cto.com/art/201007/210894.htm 熟悉三国的朋友都知道曹操,曹操有二十五个儿子,其中最得曹操宠爱的是曹丕.曹植.曹彰三个,曹丕性格阴冷, ...

  5. Post model至Web Api创建或是保存数据

    前一篇<Post model至Web Api>http://www.cnblogs.com/insus/p/4343538.html中,使用Post来从Web Api获取数据.由于Post ...

  6. 微软职位内部推荐-SW Engineer II for Cloud Service

    微软近期Open的职位: Positions: SDE for Big Data Cloud Services Azure Big Data Cloud Services and Cosmos are ...

  7. Linux常用命令笔记

    ~ 我的home目录/ 系统根目录进入home目录:cd \进入跟目录:cd /Maven编译:mvn clean deploy -U -Dmaven.test.skip=true dependenc ...

  8. saltstack安装配置(halite)

    saltstack官方提供了一个简单的web UI--halite.但是给出的安装配置方法实在没法实现,在网上找了几篇博客,见文章末尾的参考链接,可以用起来了.但是功能有点简单.这篇文章记录安装配置h ...

  9. Caffe学习系列(23):如何将别人训练好的model用到自己的数据上

    caffe团队用imagenet图片进行训练,迭代30多万次,训练出来一个model.这个model将图片分为1000类,应该是目前为止最好的图片分类model了. 假设我现在有一些自己的图片想进行分 ...

  10. Atom插件安装

    Atom插件安装 Atom狂拽炫酷插件之activate-power-mode 引语: 在前文中提到了关于插件的安装,似乎简单易操作,不过最后我发现是我自己想简单了. activate-power-m ...