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;
}
题意:一辆列车只能同时坐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;
}
相关文章推荐
- HDU 3577 Fast Arrangement (线段树区间更新)
- HDU 3577 Fast Arrangement 线段树 区间更新
- HDU 3577 Fast Arrangement(线段树功能:区间更新,查询区间的最大覆盖次数)
- HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )
- HDU-3577-Fast Arrangement-区间更新
- HDU-3577-Fast Arrangement-区间更新
- HDU - 3577 Fast Arrangement (线段树区间修改及查询模板题)
- hdu 3577 Fast Arrangement(区间更新)
- HDU 3577 线段树区间更新
- hdu 3577(线段树区间更新)
- hdu 3577 Fast Arrangement(线段树)
- HDU3577:Fast Arrangement(线段树区间更新+lazy)
- HDU - 3577 Fast Arrangement 线段树
- HDU 3577 Fast Arrangement(区间覆盖+单点查询)
- HDU 3577 Fast Arrangement(线段树)
- hdu 3874 Necklace 线段树单点更新区间求和
- hdu 1698(区间更新线段树)Just a Hook
- hdu 1698 Just a Hook(线段树-区间更新)
- 线段树 hdu 1754 I Hate It 单点更新 区间求最值
- HDU 3308【线段树-query:区间最长单调上升序列,update:结点更新,区间合并】