HDU 4614 线段树+二分查找
Vases and Flowers
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=4614
Problem Description
Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N-1. When she receive some flowers, she will try to put them in the vases, one flower in one vase. She randomly choose the vase A and try to put a flower in the vase. If the there is no flower in the vase, she will put a flower in it, otherwise she skip this vase. And then she will try put in the vase A+1, A+2, ..., N-1, until there is no flower left or she has tried the vase N-1. The left flowers will be discarded. Of course, sometimes she will clean the vases. Because there are too many vases, she randomly choose to clean the vases numbered from A to B(A <= B). The flowers in the cleaned vases will be discarded.
Input
The first line contains an integer T, indicating the number of test cases.
For each test case, the first line contains two integers N(1 < N < 50001) and M(1 < M < 50001). N is the number of vases, and M is the operations of Alice. Each of the next M lines contains three integers. The first integer of one line is K(1 or 2). If K is 1, then two integers A and F follow. It means Alice receive F flowers and try to put a flower in the vase A first. If K is 2, then two integers A and B follow. It means the owner would like to clean the vases numbered from A to B(A <= B).
Output
For each operation of which K is 1, output the position of the vase in which Alice put the first flower and last one, separated by a blank. If she can not put any one, then output 'Can not put any one.'. For each operation of which K is 2, output the number of discarded flowers.
Output one blank line after each test case.
Sample Input
2
10 5
1 3 5
2 4 5
1 1 8
2 3 6
1 8 8
10 6
1 2 5
2 3 4
1 0 8
2 2 5
1 4 4
1 2 3
Sample Output
3 7
2
1 9
4
Can not put any one.
2 6
2
0 9
4
4 5
2 3
题意
有一个初始全为零的序列,支持两种操作:
1.1 x y 从x开始往后找y个为0的位置并赋值为1,找不满没关系。输出未赋值时第一个为零位置和最后一个为零的位置,如果没有一个为零的位置输出 Can not put any one.
2.2 x y 输出x到y的和,并将x到y赋值成0
题解
主要操作就是区间覆盖和区间求和,至于操作一,我们可以二分查找,左区间就是x,有区间r二分,sum[x,r]随r单调不减,我们只要求最左边的sum[x,r]=1和sum[x,r]=y的位置即可,还有些细节可以仔细想想。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x7f7f7f7f
#define N 100050
int n,m;
template<typename T>void read(T&x)
{
ll k=0; char c=getchar();
x=0;
while(!isdigit(c)&&c!=EOF)k^=c=='-',c=getchar();
if (c==EOF)exit(0);
while(isdigit(c))x=x*10+c-'0',c=getchar();
x=k?-x:x;
}
void read_char(char &c)
{while(!isalpha(c=getchar())&&c!=EOF);}
struct Node{int l,r,lazy,sum;};
struct segmentTree
{
Node tr[N<<2];
void push_up(int x);
void push_down(int x);
void bt(int x,int l,int r);
void update(int x,int l,int r,int tt);
int query(int x,int l,int r);
int ef(int k,int x,int l,int r);
}seg;
void segmentTree::push_up(int x)
{
int len=tr[x].r-tr[x].l+1;
if (len>1)tr[x].sum=tr[x<<1].sum+tr[x<<1|1].sum;
if (tr[x].lazy!=-1)tr[x].sum=tr[x].lazy*len;
}
void segmentTree::push_down(int x)
{
if (tr[x].lazy==-1)return;
tr[x<<1|1].lazy=tr[x<<1].lazy=tr[x].lazy;
push_up(x<<1);
push_up(x<<1|1);
tr[x].lazy=-1;
}
void segmentTree::bt(int x,int l,int r)
{
tr[x]=Node{l,r,0,0};
if (l==r)return;
int mid=(l+r)>>1;
bt(x<<1,l,mid);
bt(x<<1|1,mid+1,r);
}
void segmentTree::update(int x,int l,int r,int tt)
{
if (l<=tr[x].l&&tr[x].r<=r)
{
tr[x].lazy=tt;
push_up(x);
return;
}
int mid=(tr[x].l+tr[x].r)>>1;
push_down(x);
if (l<=mid)update(x<<1,l,r,tt);
if (mid<r)update(x<<1|1,l,r,tt);
push_up(x);
}
int segmentTree::query(int x,int l,int r)
{
if (l<=tr[x].l&&tr[x].r<=r)return tr[x].sum;
int mid=(tr[x].l+tr[x].r)>>1,ans=0;
push_down(x);
if (l<=mid)ans+=query(x<<1,l,r);
if (mid<r)ans+=query(x<<1|1,l,r);
return ans;
}
int segmentTree::ef(int k,int x,int l,int r)
{
if (l==r)return l;
int mid=(l+r)>>1;
int tp=mid-x+1-query(1,x,mid);
if (tp<k)return ef(k,x,mid+1,r);
if (tp>=k)return ef(k,x,l,mid);
}
void work()
{
read(n); read(m);
seg.bt(1,0,n-1);
for(int i=1;i<=m;i++)
{
int id,x,y;
read(id); read(x); read(y);
if (id==1)
{
int k=seg.query(1,x,n-1);
if (k==n-x){printf("Can not put any one.\n");continue;}
int ds=seg.ef(1,x,x,n-1);
int dw=seg.ef(min(n-x-k,y),x,x,n-1);
seg.update(1,ds,dw,1);
printf("%d %d\n",ds,dw);
}
if (id==2)
{
printf("%d\n",seg.query(1,x,y));
seg.update(1,x,y,0);
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("aa.in","r",stdin);
#endif
int T;
read(T);
while(T--)work(),printf("\n");
}
HDU 4614 线段树+二分查找的更多相关文章
- L - Vases and Flowers HDU - 4614 线段树+二分
题意 给出一排空花瓶 有两种操作 1是 从A花瓶开始放F朵花 如果当前瓶有花就跳过前往下一个 直到花用完或者 瓶子到了最后一个为止 输出 成功放花的第一个和最后一个 如果没有输出 can not. ...
- 离散化+线段树/二分查找/尺取法 HDOJ 4325 Flowers
题目传送门 题意:给出一些花开花落的时间,问某个时间花开的有几朵 分析:这题有好几种做法,正解应该是离散化坐标后用线段树成端更新和单点询问.还有排序后二分查找询问点之前总花开数和总花凋谢数,作差是当前 ...
- G - Queue HDU - 5493 线段树+二分
G - Queue HDU - 5493 题目大意:给你n个人的身高和这个人前面或者后面有多少个比他高的人,让你还原这个序列,按字典序输出. 题解: 首先按高度排序. 设每个人在其前面有k个人,设比这 ...
- hdu 4614 线段树
思路:当k为1的时候,用二分法查询包含有f个空瓶的上界r,然后更新会方便很多,直接更新区间(a,r)了. #include<iostream> #include<cstdio> ...
- hdu4614 线段树+二分 插花
Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 4267 线段树间隔更新
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K ...
- hdu 3954 线段树 (标记)
Level up Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
随机推荐
- 关于lda算法的一个博客
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html
- jira默认是jira_user用户组的用户有登录jira的权限
场景描述: 今天给jira新建了几个用户组,看着英文的jira_user和jira_developer有点多余,所以就给删掉了.然后后面新建了开发人员和测试人员用户组,进行了人员分配和项目分配,可是突 ...
- Python学习日记(四)——Python基本数据类型梳理(int、str、list、tuple、dict)
数字(int) 1.创建方式 n1 = 123 n2 = int(123) 2.内存分配 #共同用一个内存地址的情况 n1 = 123 n2 = n1 #用两个内存地址的情况 n1 = 123 n2 ...
- redhat7.4安装svn
1.使用yum install subversion出错 已加载插件:langpacks, product-id, search-disabled-repos, subscription-manage ...
- Apache Flink - 命令
$flink命令位置 命令 选项 jar包位置 \ --input 输入文件位置 --out 输出文件位置 ./bin/flink run ./examples/batch/WordCount.jar ...
- ubuntu hadoop安装
参考: https://wangchangchung.github.io/2017/09/28/Ubuntu-16-04%E4%B8%8A%E5%AE%89%E8%A3%85Hadoop%E5%B9% ...
- linux下docker如何指定容器的工作目录?
答: 启动容器时传入-w <work_dir>参数即可,如: docker run -it -w <work_dir> <container_image_name> ...
- String字符串的截取
根据某个字段将字符串分割成绩部分 String str = "string number one 1/9/0"; //将字符串由/ 截取成绩部分 String[] strs = s ...
- Maven项目添加阿里云HBase依赖之后第一行才出现红叉报错“Missing artifact jdk.tools:jdk.tools:jar:1.6”的解决办法
首先是从阿里云上下载了一个样例项目"hbase-demo",然后用eclipse打开,此时eclipse会去下载aliyun.hbase依赖. 等待一段时间后,pom.xml却报错 ...
- python 时间类型