【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)

时间:2022-01-27 07:05:23

题目
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&lpar;线段树&plus;二分&rpar;

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

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

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

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

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

  4. hdu1698 Just a Hook &lpar;线段树区间更新 懒惰标记&rpar;

    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&period;1556 Color the ball &lpar;线段树 区间更新 单点查询&rpar;

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

  7. HDU 1698 Just a Hook&lpar;线段树区间更新查询&rpar;

    描述 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&lpar;线段树区间更新&rpar;

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

  9. &lpar;简单&rpar; HDU 1698 Just a Hook &comma; 线段树&plus;区间更新。

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

随机推荐

  1. 多Form界面控件状态变化问题分析

    假定有frmA,frmB,frmC三个界面,当frmA中触发显示frmC与frmB触发显示frmC时显示界面不同,或者让frmC上的某个按钮不可用,此时应该在如何来控制frmC的显示.是采用在frmC ...

  2. Bootstrap Navbar应用及源码解析

    目的: 用Bootstrap Navbar component 实现一个响应式导航 理解Bootstrap Navbar component是如何工作的(不包括collepse.js) 清楚自己添加一 ...

  3. 洛谷P1991无线通讯网&lbrack;kruskal &vert; 二分答案 并查集&rsqb;

    题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...

  4. linux常见目录的作用

    根目录下的bin 和sbin,usr目录下的bin和sbin四个都是保存系统命令.bin下的普通用户都可以使用,sbin下只有超级用户root可以使用 pro和syc不能直接操作,是内存的过载点 / ...

  5. Java中的泛型方法

    泛型是什么意思在这就不多说了,而Java中泛型类的定义也比较简单,例如:public class Test<T>{}.这样就定义了一个泛型类Test,在实例化该类时,必须指明泛型T的具体类 ...

  6. Mac上安装 mySql

    今天在mac系统上安装了 mySql 和大家分享下 安装的过程.. 首先 第一步 需要在oracle的网站下载 mysql 的mac 版本. 下载地址如下: http://www.mysql.com/ ...

  7. javascript笔记5之流程控制语句

    /* var box = 100; //单行语句 var age = 20; //另一条单行语句 { //用花括号包含的语句集合,叫做复合语句,单位一个 //一对花括号,表示一个复合语句,处理时候,可 ...

  8. hdu 4861 Couple doubi&lpar;数论&rpar;

    题目链接:hdu 4861 Couple doubi 题目大意:两个人进行游戏,桌上有k个球,第i个球的值为1i+2i+⋯+(p−1)i%p,两个人轮流取,假设DouBiNan的值大的话就输出YES, ...

  9. centos7安装图形化界面

    yum groups install -y "GNOME Desktop" "Graphical Administration Tools"

  10. Java进阶&lpar;七&rpar;Java加密技术之非对称加密算法RSA

    Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...