hdu 4614 Vases and Flowers(线段树:成段更新)
线段树裸题。自己写复杂了,准确说是没想清楚就敲了。
先是建点为已插花之和,其实和未插花是一个道理,可是开始是小绕,后来滚雪球了,跪了。
重新建图,分解询问1为:找出真正插画的开始点和终止点,做成段更新。
再次向notonlysuccess大神致谢,清晰的代码+清晰的思路=ac
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 const int MAXN=;
int sum[MAXN<<];
int lag[MAXN<<];
int n; void PushUp(int rt)
{
if(lag[rt<<]==lag[rt<<|]&&lag[rt<<]!=-)
lag[rt]=lag[rt<<];
else
lag[rt]=-;
sum[rt]=sum[rt<<]+sum[rt<<|];
} void PushDown(int rt,int m)
{
if(lag[rt]!=-){
lag[rt<<]=lag[rt<<|]=lag[rt];
sum[rt<<]=(m-(m>>))*(-lag[rt]);
sum[rt<<|]=(m>>)*(-lag[rt]);
lag[rt]=-; }
} void Build(int l,int r,int rt)
{
lag[rt]=-;
if(l==r){
sum[rt]=;
return ;
}
int m=(l+r)>>;
Build(lson);
Build(rson);
PushUp(rt);
} void updata(int L,int R,int c,int l,int r,int rt)
{
if(L<=l&&r<=R){
sum[rt]=(r-l+)*(-c);
lag[rt]=c;
return ;
}
PushDown(rt,r-l+);
int m=(l+r)>>;
if(L<=m)updata(L,R,c,lson);
if(m<R)updata(L,R,c,rson);
PushUp(rt);
} int Query1(int L,int R,int l,int r,int rt)
{
if(L>R)
return ;
if(L<=l&&r<=R)
return sum[rt];
PushDown(rt,r-l+);
int m=(l+r)>>;
int res=;
if(L<=m)
res+=Query1(L,R,lson);
if(m<R)
res+=Query1(L,R,rson);
return res;
} int Query2(int p,int l,int r,int rt)
{
if(l==r)
return l;
PushDown(rt,r-l+);
int m=(l+r)>>;
if(p<=sum[rt<<])
return Query2(p,lson);
else
return Query2(p-sum[rt<<],rson);
}
int main()
{
int T,m;
int op,a,b,k;
int flag=;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m); Build(,n-,); for(k=;k<m;k++)
{
scanf("%d%d%d",&op,&a,&b); if(op==){
int s=Query1(a,n-,,n-,);
if(!s)
printf("Can not put any one.\n");
else {
int left=Query1(,a-,,n-,); int l=Query2(left+,,n-,);
int r=Query2(left+min(s,b),,n-,);
printf("%d %d\n",l,r);
updata(l,r,,,n-,);
}
}else {
printf("%d\n",b-a+-Query1(a,b,,n-,));
updata(a,b,,,n-,);
}
}
printf("\n");
}
return ;
}
hdu 4614 Vases and Flowers(线段树:成段更新)的更多相关文章
- HDU 1698 Just a Hook(线段树成段更新)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 1698 Just a Hook (线段树 成段更新 lazy-tag思想)
题目链接 题意: n个挂钩,q次询问,每个挂钩可能的值为1 2 3, 初始值为1,每次询问 把从x到Y区间内的值改变为z.求最后的总的值. 分析:用val记录这一个区间的值,val == -1表示这 ...
- HDU 4614 Vases and Flowers(线段树+二分)
题目链接 比赛的时候一直想用树状数组,但是树状数组区间更新之后,功能有局限性.线段树中的lz标记很强大,这个题的题意也挺纠结的. k = 1时,从a开始,插b个花,输出第一个插的位置,最后一个的位置, ...
- hdu 4614 Vases and Flowers 线段树
题目链接 一共n个盒子, 两种操作, 第一种是给出两个数x, y, 从第x个盒子开始放y朵花, 一个盒子只能放一朵, 如果某个盒子已经有了, 那么就跳过这个盒子放下面的盒子. 直到花放完了或者到了最后 ...
- hdu 4747【线段树-成段更新】.cpp
题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...
- HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )
线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...
- ACM: Copying Data 线段树-成段更新-解题报告
Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...
- Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)
题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...
- POJ 2777 Count Color (线段树成段更新+二进制思维)
题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...
- HDU1698_Just a Hook(线段树/成段更新)
解题报告 题意: 原本区间1到n都是1,区间成段改变成一个值,求最后区间1到n的和. 思路: 线段树成段更新,区间去和. #include <iostream> #include < ...
随机推荐
- linux 下 安装 rpm 格式 的 mysql
在Linux操作系统下,安装MYSQL有两种方式: 一种tar安装方式, 另外一种是rpm安装方式. 这两种安装方式有什么区别呢?尽管我们在Linux下常用tar来压缩/解压缩文件,但MYSQL的ta ...
- 【POJ】【2068】Nim
博弈论/DP 这是Nim?这不是巴什博奕的变形吗…… 我也不会捉啊,不过一看最多只有20个人,每人最多拿16个石子,总共只有8196-1个石子,范围好像挺小的,嗯目测暴力可做. so,记忆化搜索直接水 ...
- 【Vijos】【1164】曹冲养猪
中国剩余定理 没啥重要的……模板题,中国剩余定理就是解出模线性方程组的一个可行解(好像也是唯一解?) 这是一种神奇的构造方法……明白了为什么这样构造是对的就行了=.=至于怎么想到这种构造方法的……去问 ...
- struts2+hibernate+spring+jquery返回json List列表
1.引入包:struts2-json-plugin-2.1.8.1.jar json-lib-2.1.jar commons-collections-3.2.1.jar commons-beanuti ...
- SPOJ MULTQ3 7299 Multiples of 3 (区间更新)
题目连接:http://www.spoj.com/problems/MULTQ3/ #include <iostream> #include <stdio.h> #includ ...
- POJ2586Y2K Accounting Bug
http://poj.org/problem?id=2586 Description Accounting for Computer Machinists (ACM) has sufferred fr ...
- java中什么时候该用static修饰方法?有什么好处或者坏处?
当一个方法或者变量需要初始化加载,或者是经常被调用的时候可以加上static.用static修饰的方法可以用类名直接调用,不用的一定要先实例化一个对象然后才可以调用比如 person这个类里面有一个方 ...
- Swift入门(十一)——类型转换与is、as操作
三种操作:is.as?和as! Swift是强类型语言,但也允许开发者通过is.as?和as!这三种操作来对类型进行判断和强制转换.其中is用作类型判断,而as?和as!则分别是类型转换的可选形式和强 ...
- Java学习笔记之:Java数组
一.介绍 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如number ...
- ORA-12571 : TNS : 包写入程序失败
错误原因 解决方案 修改D:/oracle/ora92/network/admin目录下sqlnet.ora,将”NAMES.DEFAULT_DOMAIN =” 这一行用#注释掉,将“SQLNET.A ...