意甲冠军:给你1-n花瓶   。起初,所有的空,今天,有两种操作模式,

1:从花瓶a開始插入b朵花          假设不能插进去  输出字符串  否则输出最多插入的起点和终点;

2:把a-b的花瓶清空   输出处理花的个数;

结构体数组num【i】表示节点i空瓶的数目

线段树   開始deal函数对整个树初始化,update()更新函数 find()查询区间有多少个空瓶;     对于操作1    关键点是找到起点和终点   这里用二分  在【a,n】进行二分,

先二分起点       注意左右区间的变换(wa了好多次==)   然后在起点和n之间二分终点   最后更新  输出     对于操作2     直接查询就可以;

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std; #define LL(x) (x<<1)
#define RR(x) ((x<<1)|1)

struct
node
{
int
cont;
}
num[50000*4];
int
deal(int L,int R,int point)
{

num[point].cont=R-L+1;
if(
L==R) return 0;
int
mid=(L+R)/2;
deal(L,mid,LL(point));
deal(mid+1,R,RR(point));
return
0;
}
int
update(int L,int R,int left,int right,int point,int k)
{
if(
L==left&&R==right)
{
if(
k==1) num[point].cont=R-L+1;
else
num[point].cont=0;
return
0;
}
int
mid=(L+R)/2;
if(
num[point].cont==R-L+1)
{

num[LL(point)].cont=mid-L+1;
num[RR(point)].cont=R-mid;
}
if(
num[point].cont==0)
{

num[LL(point)].cont=0;
num[RR(point)].cont=0;
}
if(
right<=mid)
{

update(L,mid,left,right,LL(point),k);
}
else if(
left>mid)
{

update(mid+1,R,left,right,RR(point),k);
}
else
{

update(L,mid,left,mid,LL(point),k);
update(mid+1,R,mid+1,right,RR(point),k);
}

num[point].cont=num[LL(point)].cont+num[RR(point)].cont;
return
0;
}
int
find(int L,int R,int left,int right,int point)
{
if(
L==left&&R==right)
return
num[point].cont;
int
sum=0;
int
mid=(L+R)/2;
if(
num[point].cont==R-L+1) return right-left+1;
if(
num[point].cont==0) return 0;
if(
right<=mid) sum+=find(L,mid,left,right,LL(point));
else if(
left>mid) sum+=find(mid+1,R,left,right,RR(point));
else
{

sum+=find(L,mid,left,mid,LL(point));
sum+=find(mid+1,R,mid+1,right,RR(point));
}
return
sum;
}
int main()
{
int
n,m,k,i,j,T,a,b;
scanf("%d",&T);
while(
T--)
{

scanf("%d%d",&n,&m);
deal(1,n,1);
for(
i=1;i<=m;i++)
{

scanf("%d%d%d",&k,&a,&b);
if(
k==1)
{

a+=1;
int
cont=find(1,n,a,n,1);
if(
cont==0) printf("Can not put any one.\n");
else
{
int
left,right,mid;
int
star,end;
left=a;
right=n;
while(
left<=right)
{

mid=(left+right)/2;
if(
find(1,n,left,mid,1)>0)
{

right=mid-1;
star=mid;
}
else
left=mid+1; }
if(
cont<=b)
{

left=a;
right=n;
while(
left<=right)
{

mid=(left+right)/2;
if(
find(1,n,mid,right,1)>0)
{

left=mid+1;
end=mid;
}
else
right=mid-1;
}

//end=right;
}
else
{

left=a;
right=n;
while(
left<=right)
{

mid=(left+right)/2;
if(
find(1,n,star,mid,1)>=b)
{

right=mid-1;
end=mid;
}
else
left=mid+1;
}

//end=left;
}
printf("%d %d\n",star-1,end-1);
update(1,n,star,end,1,-1);
}
}
else
{

printf("%d\n",b-a+1-find(1,n,a+1,b+1,1));
update(1,n,a+1,b+1,1,1);
} }

printf("\n");
}
return
0;
}

hdu4614 二分法+段树的更多相关文章

  1. BZOJ-3212 Pku3468 A Simple Problem with Integers 裸线段树区间维护查询

    3212: Pku3468 A Simple Problem with Integers Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1278 Sol ...

  2. ZOJ 1610 间隔染色段树

    要长8000仪表板.间染色的范围,问:最后,能看到的颜色,而且颜色一共有段出现 覆盖段 数据对比水   水可太暴力 段树: #include "stdio.h" #include ...

  3. HDU 1394 Minimum Inversion Number (数据结构-段树)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  4. PKU A Simple Problem with Integers (段树更新间隔总和)

    意甲冠军:一个典型的段树C,Q问题,有n的数量a[i] (1~n),C, a, b,c在[a,b]加c Q a b 求[a,b]的和. #include<cstdio> #include& ...

  5. BZOJ 2588 Count on a tree (COT) 是持久的段树

    标题效果:两棵树之间的首次查询k大点的权利. 思维:树木覆盖树,事实上,它是正常的树木覆盖了持久段树. 由于使用权值段树可以寻求区间k大,然后应用到持久段树思想,间隔可以做减法.详见代码. CODE: ...

  6. lintcode-439-线段树的构造 II

    439-线段树的构造 II 线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间.start和end都是整数,并按照如下的方式赋值: 根节点的 start ...

  7. lintocde-247-线段树的查询 II

    247-线段树的查询 II 对于一个数组,我们可以对其建立一棵 线段树, 每个结点存储一个额外的值 count 来代表这个结点所指代的数组区间内的元素个数. (数组中并不一定每个位置上都有元素) 实现 ...

  8. lintcode-203-线段树的修改

    203-线段树的修改 对于一棵 最大线段树, 每个节点包含一个额外的 max 属性,用于存储该节点所代表区间的最大值. 设计一个 modify 的方法,接受三个参数 root. index 和 val ...

  9. lintcode-202-线段树的查询

    202-线段树的查询 对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max,值为该节点所代表的数组区间start到end内的最大值. 为Se ...

随机推荐

  1. 【35.02%】【codeforces 734A】Vladik and flights

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  2. android开发音乐播放器--Genres和Art album的获取

    最近在做一个项目,其中涉及到音乐播放器.当用到Genres和Art album时花费了一些时间才搞定,今天把方法草草列出,以供自己以后忘记时查看,也希望可以帮助碰到同样问题的道友!! 一.Genres ...

  3. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)

    js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...

  4. [tmux] Manage terminal workspaces using session naming

    It's a lot easier to manage your tmux session when they have sensible names. We'll cover: How to cre ...

  5. js把其他类型转化成字符串

    js把其他类型转化成字符串 一.总结 一句话总结:类型转换中的强制类型转换分为类型转换函数和类型名强制.js后一种和其它语言不同,是类型类的构造方法.String() 二.js把其他类型转化成字符串 ...

  6. Git提交到多个远程仓库(多看两个文档)

    Git提交到多个远程仓库(多看两个文档) 一.总结 一句话总结: 二. Git提交到多个远程仓库(多看两个文档) 有两种做法,先看第一种 一.通过命令行进行操作 例如我有下面两个仓库: Mybatis ...

  7. SWIFT学习笔记04

    1.在实际编译时,Swift 编译器会优化字符串的使用.使实际的复制仅仅发生在绝对必要的情况下,这意味着您将字符串作为值类型的同一时候能够获得极高的性能. 2.for character in &qu ...

  8. [Ramda] Create an Array From a Seed Value with Ramda's unfold

    In this lesson we'll look at how you can use Ramda's unfold function to generate a list of values ba ...

  9. Android招財进宝手势password的实现

    这几个月都是在做招財进宝项目.一个高收益低风险的理財APP,有兴趣的能够下载玩玩.收益不错哦! ! ! 招財进宝下载地址:http://8.shengpay.com/ 前段时间因产品需求,做了一个手势 ...

  10. Oracle数据库分页查询的几种实现方法

    没有Sql Server有top那么好用,但是Oracle含有隐藏的rownum列可以灵活使用,使实现分页效果,pageSize默认10行 方法一: select * from test where ...