线段树裸题。自己写复杂了,准确说是没想清楚就敲了。

先是建点为已插花之和,其实和未插花是一个道理,可是开始是小绕,后来滚雪球了,跪了。

重新建图,分解询问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(线段树:成段更新)的更多相关文章

  1. HDU 1698 Just a Hook(线段树成段更新)

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

  2. HDU 1698 Just a Hook (线段树 成段更新 lazy-tag思想)

    题目链接 题意: n个挂钩,q次询问,每个挂钩可能的值为1 2 3,  初始值为1,每次询问 把从x到Y区间内的值改变为z.求最后的总的值. 分析:用val记录这一个区间的值,val == -1表示这 ...

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

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

  4. hdu 4614 Vases and Flowers 线段树

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

  5. hdu 4747【线段树-成段更新】.cpp

    题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...

  6. HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )

    线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...

  7. ACM: Copying Data 线段树-成段更新-解题报告

    Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...

  8. 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. 这题 ...

  9. POJ 2777 Count Color (线段树成段更新+二进制思维)

    题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...

  10. HDU1698_Just a Hook(线段树/成段更新)

    解题报告 题意: 原本区间1到n都是1,区间成段改变成一个值,求最后区间1到n的和. 思路: 线段树成段更新,区间去和. #include <iostream> #include < ...

随机推荐

  1. NYOJ-171 聪明的kk AC 分类: NYOJ 2014-01-02 09:01 165人阅读 评论(0) 收藏

    #include<stdio.h> #define max(x,y) x>y?x:y int main(){ int num[22][22]={0}; int n,m; int x, ...

  2. 基于Pre-Train的CNN模型的图像分类实验

    基于Pre-Train的CNN模型的图像分类实验  MatConvNet工具包提供了好几个在imageNet数据库上训练好的CNN模型,可以利用这个训练好的模型提取图像的特征.本文就利用其中的 “im ...

  3. HttpWebRequest和HttpWebResponse

    原文:http://blog.csdn.net/haitaofeiyang/article/details/18362225 申公前几日和一个客户做系统对接,以前和客户对接一般采用webservice ...

  4. 关于C#中timer类

    ·关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Tim ...

  5. [主席树]HDOJ4348 To the moon

    题意:n个数, m个操作 1. C l r d  给[l, r]区间的每个数加上d2. Q l r:   查询[l, r]区间的和3. H l r t: 查询第t个操作时[l, r]区间的和4. B ...

  6. lintcode 中等题 :Maximum Product Subarray 最大连续乘积子序列

    题目 乘积最大子序列 找出一个序列中乘积最大的连续子序列(至少包含一个数). 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6. 解题  法一:直接暴力求解 时 ...

  7. 46. Permutations

    题目: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the fo ...

  8. Nmap扫描原理与用法

    Nmap扫描原理与用法 1     Nmap介绍 Nmap扫描原理与用法PDF:下载地址 Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Audit ...

  9. Java API —— IO流( FileInputStream & FileOutputStream & BufferedInputStream & BufferedOutputStream )

    1.IO流概述 · IO流用来处理设备之间的数据传输        · 上传文件和下载文件        · Java对数据的操作是通过流的方式 · Java用于操作流的对象都在IO包中   2.IO ...

  10. Java内部类总结 分类: 原理 2015-06-28 09:51 9人阅读 评论(0) 收藏

    内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的. 内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问 ...