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

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

重新建图,分解询问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. Azure VM 远程无法登陆问题(No Remote Desktop License)

    解决方法: 打开 Wins+R=> mstsc /v: yourVMIPadress /admin mstsc /v:xx.xx.xx.xx:54738 /admin

  2. Maven搭建webService (一) 创建服务端---使用main函数发布服务

    今天和大家分享下 使用maven 搭建 webService 服务端: 首先需要在你的IDE中集成Maven.集成办法此处略....... 1.创建一个web工程. 2.在pom文件中增加以下依赖: ...

  3. 【转载】关于typedef的用法总结

    不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些 ...

  4. WP 类似扑克牌布局控件和类似扑克卡片控件

    一.说明 本文代码来源: <windows phone 7 程序设计> Charles Petzold 控件效果: 二.要点: 1.ItemControl.子项容器模板(ItemsCont ...

  5. cf 363D

    贪心加二分 虽然比赛后才过 ........ /************************************************************************* &g ...

  6. POJ2104 K-th Number Range Tree

    又是区间第k大,这次选择这道题是为以后写线段树套平衡树铺路的.Range Tree可以理解成线段树套vector吧,相当于每个结点多存了对应区间的一个排好序的序列.画一下就会知道空间的消耗是nlogn ...

  7. C Primer Plus之C预处理器和C库

    编译程序前,先由预处理器检查程序(因此称为预处理器).根据程序中使用的预处理器指令,预处理器用符号缩略语所代表的内容替换程序中的缩略语. 预处理器不能理解C,它一般是接受一些文件并将其转换成其他文本. ...

  8. Android中ContentProvider的简单使用

    1.新建继承ContentProvider的类 package com.wangzhu.demo; import android.content.ContentProvider; import and ...

  9. lintcode :搜索二维矩阵

    题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1 ...

  10. 被忽略却很有用的html标签

    <base>标签  作用:标签为页面中所有链接指定默认链接地址或链接目标.有时候我们需要让首页的链接全部在新窗口中打开,我们一般会这样写链接,而使用这个标签就能一下搞定了! 属性:Href ...