hdu4614 二分法+段树
意甲冠军:给你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 二分法+段树的更多相关文章
- 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 ...
- ZOJ 1610 间隔染色段树
要长8000仪表板.间染色的范围,问:最后,能看到的颜色,而且颜色一共有段出现 覆盖段 数据对比水 水可太暴力 段树: #include "stdio.h" #include ...
- HDU 1394 Minimum Inversion Number (数据结构-段树)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 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& ...
- BZOJ 2588 Count on a tree (COT) 是持久的段树
标题效果:两棵树之间的首次查询k大点的权利. 思维:树木覆盖树,事实上,它是正常的树木覆盖了持久段树. 由于使用权值段树可以寻求区间k大,然后应用到持久段树思想,间隔可以做减法.详见代码. CODE: ...
- lintcode-439-线段树的构造 II
439-线段树的构造 II 线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间.start和end都是整数,并按照如下的方式赋值: 根节点的 start ...
- lintocde-247-线段树的查询 II
247-线段树的查询 II 对于一个数组,我们可以对其建立一棵 线段树, 每个结点存储一个额外的值 count 来代表这个结点所指代的数组区间内的元素个数. (数组中并不一定每个位置上都有元素) 实现 ...
- lintcode-203-线段树的修改
203-线段树的修改 对于一棵 最大线段树, 每个节点包含一个额外的 max 属性,用于存储该节点所代表区间的最大值. 设计一个 modify 的方法,接受三个参数 root. index 和 val ...
- lintcode-202-线段树的查询
202-线段树的查询 对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max,值为该节点所代表的数组区间start到end内的最大值. 为Se ...
随机推荐
- php实现合并两个排序的链表(很多情况下新建数组装东西比连东西逻辑快很多)($cur=$cur->next;的理解)
php实现合并两个排序的链表(很多情况下新建数组装东西比连东西逻辑快很多)($cur=$cur->next;的理解) 一.总结 $cur=$cur->next;这句话需要好好理解 指$cu ...
- 使用C#版本的gdal库打开hdf文件
作者:朱金灿 来源:http://blog.csdn.net/clever101 最近应同事的请求帮忙研究下使用C#版的gdal库读取hdf文件,今天算是有一点成果,特地做一些记录. 首先是编译C#版 ...
- 【30.36%】【codeforces 740D】Alyona and a tree
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 建立简单的服务器端程序 分类: B1_JAVA 2013-10-08 21:53 503人阅读 评论(0) 收藏
参考自core java package com.lujinhong.corejava; import java.io.IOException; import java.io.InputS ...
- source insight -i failed reason
双击.c调用sourceinsight.exe -i "路径" 如果路径太长就会新开一个窗口,测试相同文件,不同路径现象不同.
- Effective Java读书笔记——第三章 对于全部对象都通用的方法
第8条:覆盖equals时请遵守通用的约定 设计Object类的目的就是用来覆盖的,它全部的非final方法都是用来被覆盖的(equals.hashcode.clone.finalize)都有通用约定 ...
- 为什么说 C/C++ 不适合做 Web 开发?(成本高,容易出错,apache等工具分担了大部分工作)
因为大家在讨论用C#.Java,做出来的项目的时候,用C++的人们还在讨论语言特性 每种语言都有特定适用范围,对应着某类问题.web开发的重头戏不是计算,而是与用户交互和发送sql语句,当然以脚本语言 ...
- UUIDUtils工具类
原理是根据自身的操作系统和电脑硬件生成的一个32位的随机字符串,如果是一台电脑使用的话,一年不会重复,经过java之后貌似编程了36位,多了4个"-",下面是代码实现: impor ...
- ajax传递list集合
原文链接:https://blog.csdn.net/qq_37936542/article/details/79277495 一:ajax传递List<String>类型的数据 js代码 ...
- Oracle数据库零散知识03
21,存储过程,简化复杂操作,增加数据独立性,提高安全性,提高性能 与函数创建对比: create or replace function fun_01(v_01 in number) return ...