站外题求助
  • 板块学术版
  • 楼主focus_costan1
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/8 10:31
  • 上次更新2024/7/8 11:36:44
查看原帖
站外题求助
1148600
focus_costan1楼主2024/7/8 10:31

悬5关

题号:HDU 4614

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
	int sum,left,right,lazy;
}tree[200005];
int a[200005];
int n,m;
void pushup(int x){
	tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;
}
void build(int x,int l,int r){
	tree[x].left=l;
	tree[x].right=r;
	if(l==r){
		tree[x].sum=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	pushup(x);
}
void pushdown(int x){
	int la=tree[x].lazy;
	if(la!=0){
		tree[x<<1].sum=la*(tree[x<<1].right-tree[x<<1].left+1);
		tree[x<<1].lazy=la;
		tree[x<<1|1].sum=la*(tree[x<<1|1].right-tree[x<<1|1].left+1);
		tree[x<<1|1].lazy=la;
		tree[x].lazy=0;
	}
}
void update(int x,int from,int to,int v){
	if(from<=tree[x].left&&to>=tree[x].right){
		tree[x].lazy=v;
		tree[x].sum=v*(tree[x].right-tree[x].left+1);
		return ;
	}
	pushdown(x);
	int mid=(tree[x].left+tree[x].right)>>1;
	if(from<=mid){
		update(x<<1,from,to,v);
	}
	if(to>mid){
		update(x<<1|1,from,to,v);
	}
	pushup(x);
}
int query(int x,int l,int r){
	if(l<=tree[x].left&&r>=tree[x].right){
		return tree[x].sum;
	}
	pushdown(x);
	int mid=(tree[x].left+tree[x].right)>>1;
	int ans=0;
	if(l<=mid){
		ans+=query(x<<1,l,r);
	}
	if(r>mid){
		ans+=query(x<<1|1,l,r);
	}
	return ans;
}
int ef(int x,int num){
	int l=x,r=n;
	int ans=0,mid=0;
	while(l<=r){
		mid=(l+r)>>1;
		if(query(1,x,m)>=num){
			ans=m;
			r=m-1;
		}
		else{
			l=m+1;
		}
	}
	return ans;
}
signed main(){
	int t;
	scanf("%lld",&t);
	while(t--){
		scanf("%lld%lld",&n,&m);
		memset(a,0,sizeof a);
		build(1,1,n);
		for(int i=1;i<=m;i++){
			int opt,x,y;
			scanf("%lld%lld%lld",&opt,&x,&y);
			if(opt==1){
				x++;
				int cnt=query(1,x,n);
				if(cnt==0){
					printf("Can not put any one.\n");
				}
				else{
					int l=ef(x,1);
					int r=ef(x,min(y,cnt));
					update(1,l,r,0);
					printf("%d %d\n",l-1,r-1);
				}
			}
			else{
				x++,y++;
				printf("%d\n",y-x+1-query(1,x,y));
				update(1,x,y,1);
			}
		}
	}
	return 0;
}
2024/7/8 10:31
加载中...