Fast Arrangement
题意:一辆车可坐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;
}