HDU 4614 Vases and Flowers [二分 + 线段树]
http://acm.hdu.edu.cn/showproblem.php?pid=4614
题意:Alice有n个花瓶,编号0~n-1,她经常会收到花。
两种操作:
1,每次她收到F朵花的时候,她都会从第A个花瓶开始找最前面的F个空花瓶把花放入,如果没有那么多瓶那她就把多余的花扔掉。此操作输出此次放花的第一个和最后一个花瓶编号。
2,有时她会选一个区间
思路:有花记0 没花记1,则第一个放花的花瓶就是使得
另外就是区间set,没什么好说的。
注,题中编号是从0~n-1,代码中编号从1~n,需转换一下。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define MID int mid = (L+R)>>1;
#define CHD int lc = node<<1,rc = node<<1|1;
#define debug(x) cout<<"debug "<<x<<endl;
const int maxn = 50001<<2;
int n,m;
struct sgt{
int sum[maxn];
int setv[maxn];
void init(){
setv[1] = 1;
}
void maintain(int node,int L,int R){
CHD;
if(setv[node] >= 0)sum[node] = setv[node]*(R-L+1);
else if(L != R) sum[node] = sum[lc]+sum[rc];
}
void pushDown(int node){
CHD;
if(setv[node] >= 0){
setv[lc] = setv[rc] = setv[node];
setv[node] = -1;
}
}
int query(int from,int to,int node,int L,int R){
maintain(node,L,R);
if(from <= L && R <= to){
return sum[node];
} else {
pushDown(node);
MID;CHD;
int ans = 0;
if(from <= mid) ans += query(from,to,lc,L,mid);
else maintain(lc,L,mid);
if(to > mid) ans += query(from,to,rc,mid+1,R);
else maintain(rc,mid+1,R);
return ans;
}
}
void update(int from,int to,int val,int node,int L,int R){
if(from <= L && R <= to){
setv[node] = val;
} else {
MID;CHD;
pushDown(node);
if(from <= mid) update(from,to,val,lc,L,mid);
else maintain(lc,L,mid);
if(to > mid) update(from,to,val,rc,mid+1,R);
else maintain(rc,mid+1,R);
}
maintain(node,L,R);
}
void run(){
int tp,f,v;
while(m--){
scanf("%d%d%d",&tp,&f,&v);
++f;//代码中编号从1开始
if(tp == 1){
int ans1,ans2;
int tmp = query(f,n,1,1,n);
if(tmp == 0){
printf("Can not put any one.\n");
continue;
}
if(tmp < v)v = tmp;//多的扔掉
int L = f,R = n;
while(L < R){
MID;
int tmp = query(f,mid,1,1,n);
if(tmp < 1){
L = mid+1;
} else {
R = mid;
}
}
ans1 = L;
L = f,R = n;
while(L < R){
MID;
if(query(f,mid,1,1,n) < v){
L = mid+1;
} else {
R = mid;
}
}
ans2 = R;
update(ans1,ans2,0,1,1,n);
printf("%d %d\n",ans1-1,ans2-1);//题中编号从0开始
} else {
++v;
int ans = query(f,v,1,1,n);
update(f,v,1,1,1,n);
printf("%d\n",v-f+1-ans);
}
}
}
}tree;
int main(){
int T;
cin>>T;
while(T--){
tree.init();
scanf("%d%d",&n,&m);
tree.run();
printf("\n");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。