Fast Arrangement HDU - 3577(线段树, 区间更新)

Fast Arrangement

题目链接:HDU - 3577

题意:一辆车可坐k名乘客,一个人可以买区间[a, b]的车票,如果在区间[a,b] 车上人数等于k,就不能买票了;

注意:区间[a,b]的票时a站上车,b站下车,相当于在[a, b-1]区间坐车;

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
struct node{
	int l, r, lazy, cnt;
}tr[maxn<<2];
void updown(int m){
	tr[m].cnt=max(tr[m<<1].cnt, tr[m<<1|1].cnt);
}
void build(int m, int l, int r){
	tr[m].l=l;
	tr[m].r=r;
	tr[m].lazy=0;
	tr[m].cnt=0;
	if(l==r) return;
	int mid=(l+r)>>1;
	build(m<<1, l, mid);
	build(m<<1|1, mid+1, r);
}
void pushdown(int m){
	if(tr[m].lazy){
		tr[m<<1].cnt+=tr[m].lazy;
		tr[m<<1|1].cnt+=tr[m].lazy;
		tr[m<<1].lazy+=tr[m].lazy;
		tr[m<<1|1].lazy+=tr[m].lazy;
		tr[m].lazy=0;
	}
	return;
}
void updata(int m, int l, int r){
	if(tr[m].l==l&&tr[m].r==r){
		tr[m].cnt++;
		tr[m].lazy++;
		return;
	}
	pushdown(m);
	int mid=(tr[m].l+tr[m].r)>>1;
	if(r<=mid) updata(m<<1, l, r);
	else if(l>mid) updata(m<<1|1, l, r);
	else{
		updata(m<<1, l, mid);
		updata(m<<1|1, mid+1, r);
	}
	updown(m);
}
int query(int m, int l, int r){
	if(tr[m].l==l&&tr[m].r==r){
		return tr[m].cnt;
	}
	pushdown(m);
	int mid=(tr[m].l+tr[m].r)>>1;
	int temp;
	if(r<=mid) temp=query(m<<1, l, r);
	else if(l>mid) temp=query(m<<1|1, l, r);
	else{
		temp=max(query(m<<1, l, mid), query(m<<1|1, mid+1, r));
	}	
	return temp;
}
int main(){
	int T, cas=0;
	scanf("%d", &T);
	while(T--){
		int k, Q;
		cas++;
		scanf("%d%d", &k, &Q);
		build(1, 1, 1000000);
		printf("Case %d:\n", cas);
		for(int i=1; i<=Q; i++){
			int a, b;
			scanf("%d%d", &a, &b);
			if(query(1, a, b-1)<k){
				printf("%d ", i);
				updata(1, a, b-1);
			}
		}
		printf("\n\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/sirius_han/article/details/81079599