hdu 4614 Vases and Flowers
http://acm.hdu.edu.cn/showproblem.php?pid=4614
直接线段树维护
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
#include<queue>
#include<bitset>
#include<deque>
#include<numeric> //#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; typedef long long ll;
typedef unsigned int uint;
typedef pair<int,int> pp;
const double eps=1e-9;
const int INF=0x3f3f3f3f;
const ll MOD=1000000007;
const int N=50001;
struct node
{
int l,r,k;
int m;
}btr[N*4];
void update(int x,int l,int r,int k)
{
if(btr[x].l==l&&btr[x].r==r)
{
btr[x].k=k;
btr[x].m=k*(btr[x].r-btr[x].l+1);
return ;
}
if(btr[x].k!=-1)
{
btr[(x<<1)].k=btr[(x<<1)|1].k=btr[x].k;
btr[(x<<1)].m=(btr[(x<<1)].r-btr[(x<<1)].l+1)*btr[(x<<1)].k;
btr[(x<<1)|1].m=(btr[(x<<1)|1].r-btr[(x<<1)|1].l+1)*btr[(x<<1)|1].k;
}
int mid=(btr[x].l+btr[x].r)>>1;
if(r<=mid)
update((x<<1),l,r,k);
else if(l>mid)
update((x<<1)|1,l,r,k);
else
{
update((x<<1),l,mid,k);
update((x<<1)|1,mid+1,r,k);
}
btr[x].m=btr[(x<<1)].m+btr[(x<<1)|1].m;
if(btr[(x<<1)].k==btr[(x<<1)|1].k)
btr[x].k=btr[(x<<1)].k;
else
btr[x].k=-1;
}
int get(int x,int l,int r)
{
if(btr[x].l==l&&btr[x].r==r)
return btr[x].m;
if(btr[x].k!=-1)
return (btr[x].k*(r-l+1));
int mid=(btr[x].l+btr[x].r)>>1;
if(r<=mid)
return get((x<<1),l,r);
else if(l>mid)
return get((x<<1)|1,l,r);
else
return get((x<<1),l,mid)+get((x<<1)|1,mid+1,r);
}
void build(int x,int l,int r)
{//cout<<x<<" "<<l<<" "<<r<<endl;
btr[x].l=l;
btr[x].r=r;
btr[x].k=0;
btr[x].m=0;
if(l==r)
return ;
int mid=(l+r)>>1;
build((x<<1),l,mid);
build((x<<1)|1,mid+1,r);
}
int bs(int l,int r,int k)
{
int x=l;
while(l<=r)
{
int m=(l+r)>>1;
if((m-x+1-get(1,x,m))>=k)
r=m-1;
else
l=m+1;
}
return l;
}
int main()
{
//freopen("data.in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d %d",&n,&m);
build(1,0,n-1);
while(m--)
{
int w;
scanf("%d",&w);
if(w==1)
{
int a,f;
scanf("%d %d",&a,&f);
int tmp=get(1,a,n-1);
if(tmp==(n-a)||f==0)
{printf("Can not put any one.\n");continue;}
f=min(f,n-a-tmp);
int l=bs(a,n-1,1);
int r=bs(a,n-1,f);
printf("%d %d\n",l,r);
update(1,l,r,1);
}else
{
int l,r;
scanf("%d %d",&l,&r);
printf("%d\n",get(1,l,r));
update(1,l,r,0);
}
}
printf("\n");
}
return 0;
}
hdu 4614 Vases and Flowers的更多相关文章
- HDU 4614 Vases and Flowers(线段树+二分)
Vases and Flowers Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others ...
- HDU 4614 Vases and Flowers (2013多校2 1004 线段树)
Vases and Flowers Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others ...
- HDU 4614 Vases and Flowers(二分+线段树区间查询修改)
描述Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to ...
- HDU 4614 Vases and Flowers(线段树+记录区间始末点或乱搞)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题目大意:有n个空花瓶,有两种操作: 操作①:给出两个数字A,B,表示从第A个花瓶开始插花,插B ...
- hdu 4614 Vases and Flowers(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意: 给你N个花瓶,编号是0 到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. ...
- HDU 4614 Vases and Flowers(线段树+二分)
题目链接 比赛的时候一直想用树状数组,但是树状数组区间更新之后,功能有局限性.线段树中的lz标记很强大,这个题的题意也挺纠结的. k = 1时,从a开始,插b个花,输出第一个插的位置,最后一个的位置, ...
- hdu 4614 Vases and Flowers(线段树:成段更新)
线段树裸题.自己写复杂了,准确说是没想清楚就敲了. 先是建点为已插花之和,其实和未插花是一个道理,可是开始是小绕,后来滚雪球了,跪了. 重新建图,分解询问1为:找出真正插画的开始点和终止点,做成段更新 ...
- HDU 4614 Vases and Flowers (2013多校第二场线段树)
题意摘自:http://blog.csdn.net/kdqzzxxcc/article/details/9474169 ORZZ 题意:给你N个花瓶,编号是0 到 N - 1 ,初始状态花瓶是空的,每 ...
- hdu 4614 Vases and Flowers 线段树
题目链接 一共n个盒子, 两种操作, 第一种是给出两个数x, y, 从第x个盒子开始放y朵花, 一个盒子只能放一朵, 如果某个盒子已经有了, 那么就跳过这个盒子放下面的盒子. 直到花放完了或者到了最后 ...
随机推荐
- 【转】Github 上传代码
版权声明:欢迎转载(^ω^)~不过转载请注明原文出处:http://blog.csdn.net/catglory ლ(╹◡╹ლ) 写在前面: 弄了两小时终于搞定了,把经验整理下,方便我以后上传代码XD ...
- Linux 注意
1. 赋值运算符= 左右之间不能加空格, 其余的都可以加空格, 而这种限制在以下情况, 可以使用空格 let "n = $1" 虽然也是赋值语句, 但是可以使用空格
- gO语言的安装和环境变量的配置
一.Go语言下载 go语言官方下载地址:https://golang.org/dl/ 找到适合你系统的版本下载,本人下载的是windows版本.也可以下载Source自己更深层次研究go语言. 二.G ...
- PHP SPL标准库之SplFixedArray使用实例
SplFixedArray主要是处理数组相关的主要功能,与普通php array不同的是,它是固定长度的,且以数字为键名的数组,优势就是比普通的数组处理更快. 看看我本机的Benchmark测试: i ...
- android设置软键盘搜索键以及监听搜索键点击时发生两次事件的问题解决
在输入框中加入android:imeOptions="actionSearch",调用软键盘时,回车键就会显示搜索二字. 我想在点击搜索时,跳转到下一个页面,但是调用setOnKe ...
- c++程序编码
c++程序中涉及到中文字符的输入输出以及其他操作经常会出现乱码.乱码主要是由于程序的源文件编码.可执行文件编码以及程序运行环境的编码不匹配导致.比如,c++源程序文件编码为GB18030, 在源程序中 ...
- 百度编辑器 无法获取post过去的值
如果你的,表单form是套用 table的话,请一下,要把 form 放在table的最外面.否则获取不到post值
- Global Alignment(全局比对)--从算法(Needleman-Wunsch)到python实现
很早就知道有全局比对和局部比对这两种比对方法,都是用到的动态规划的思想,知道一些罚分矩阵的概念,但一直都没有机会搞透彻,一些算法的细节也不太清楚,也没有亲手编程实现. 现在由于项目需求,需要手动写一个 ...
- iOS 轻量级的数据库leveldb
轻量级的数据库leveldb https://github.com/google/leveldb 一:在iOS下编译leveldb 终端: 1: git clone https://github.co ...
- 为什么MB51本位币金额和采购订单历史本位币金额不一样?
翻译 为什么物料凭证的本位币金额有时和采购订单历史记录物料的本位币金额不一致? 回答: 有2个字段对应FI存放位置.物料凭证的字段(MSEG-DMBER)是存放库存账目金额.采购订单历史(EKBE-D ...