您的位置:首页 > 其它

HDU 3577 Fast Arrangement 线段树 区间更新

2014-06-21 13:03 405 查看
原题链接 

题意:一辆列车只能同时坐K个人 ,Q个人购票从a站到b站,输出成功购得票的人数;

因为 是在 b站下车所以更新操作就只要从   a  --  b-1 就行了。

查询只要查区间的最值 只要最值小于k 顾客就可以成功购票;(渣渣还算和值balabala



#include<stdio.h>
#include<string.h>
#include<math.h>
#define lson l , m ,rt<<1
#define rson m+1, r ,rt<<1|1
const int maxn =1006000;
int sum[maxn<<2],n;
int col[maxn<<2],flag,c[100010];
int max(int a,int b){
return a>b?a:b;
}

void pushup(int rt){
sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
void pushdown(int rt){
if(col[rt]){
sum[rt<<1]+=col[rt];
sum[rt<<1|1]+=col[rt];
col[rt<<1]+=col[rt];
col[rt<<1|1]+=col[rt];
col[rt]=0;
}
}
void update(int L,int R ,int add,int l,int r,int rt){
if(L<=l&&r<=R){
col[rt]+=add;
sum[rt]+=add;
return;
}
pushdown(rt);
int m=(l+r)>>1;
if(L<=m) update(L,R,add,lson);
if(R>m) update(L,R,add,rson);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return sum[rt];
}
pushdown(rt);
int m=(l+r)>>1, ret=0;
if(L<=m) ret=max(ret,query(L,R,lson));
if(R>m) ret=max(ret,query(L,R,rson));
return ret;
}
int main()
{
int t,cas=1;
scanf("%d",&t);
while(t--){
int q,i,j=0,s,t;
memset(sum,0,sizeof(sum));
memset(col,0,sizeof(col));
scanf("%d%d",&n,&q);
for(i=0;i<q;i++){
scanf("%d %d",&s,&t);
t--;
if(query(s,t,1,1000000,1)<n){
update(s,t,1,1,1000000,1);
c[j++]=i+1;

}
}
printf("Case %d:\n",cas++);
for(i=0;i<j;i++)
printf("%d ",c[i]);
printf("\n\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: