?????
查看原帖
?????
1271837
yiming1123楼主2025/8/1 17:28

这是一篇整体二分的代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define lint long long
#define inl inline

inl lint read(){
	lint x=0;int f=1;char c=getchar();
	while(c<'0' or c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0' and c<='9'){x=(x<<3)+(x<<1)+c-48;c=getchar();}
	return x*f;
}

const int N=5e4+5,M=N*2,INF=1e9+7;
int n,m;

struct tree{
	int l,r,len;
	lint siz,upd;
}t[N*4];

struct node{
	int l,r,opt;
	lint k;
}Q[M],LE[M],RI[M];

inl void push_up(int u){
	t[u].siz=t[u<<1].siz+t[u<<1|1].siz;
	return ;
}

inl void push_down(int u){
	if(!t[u].upd) return ;
	t[u<<1].siz+=t[u<<1].len*t[u].upd;
	t[u<<1].upd+=t[u].upd;
	
	t[u<<1|1].siz+=t[u<<1|1].len*t[u].upd;
	t[u<<1|1].upd+=t[u].upd;
	t[u].upd=0;
	return ;
}

inl void build(int u,int l,int r){
	t[u].l=l,t[u].r=r,t[u].len=r-l+1;
	if(l==r) return ;
	int mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	return ;
}

inl void update(int u,int l,int r,int val){
	if(l<=t[u].l and t[u].r<=r){
		t[u].siz+=t[u].len*val*1ll;
		t[u].upd+=val;
		return ;
	}
	push_down(u);
	int mid=t[u].l+t[u].r>>1;
	if(l<=mid) update(u<<1,l,r,val);
	if(r>mid) update(u<<1|1,l,r,val);
	push_up(u);
	return ;
}

inl lint query(int u,int l,int r){
	lint res=0;
	if(l<=t[u].l and t[u].r<=r){
		res+=t[u].siz;
		return res;
	}
	push_down(u);
	int mid=t[u].l+t[u].r>>1;
	if(l<=mid) res+=query(u<<1,l,r);
	if(r>mid) res+=query(u<<1|1,l,r);
//	push_up(u);
	return res;
}

int ans[N];

inl void solve(int l,int r,int L,int R){
	if(l>r or L>R) return ;
	if(l==r){
		for(int i=L;i<=R;++i) if(Q[i].opt) ans[Q[i].opt]=l;
		return ;
	}
	int mid=l+r>>1;
	int cntl=0,cntr=0;
	for(int i=L;i<=R;++i){
		if(Q[i].opt){
			lint V=query(1,Q[i].l,Q[i].r);
			if(Q[i].k<=V){
				RI[++cntr]=Q[i];
			}
			else{
				Q[i].k-=V;
				LE[++cntl]=Q[i];
			}
		}
		else{
			if(Q[i].k>=mid){
				update(1,Q[i].l,Q[i].r,1);
				RI[++cntr]=Q[i];
			}
			else{
				LE[++cntl]=Q[i];
			}
		}
	}
	for(int i=1;i<=cntr;++i) if(!RI[i].opt) update(1,RI[i].l,RI[i].r,-1);
	for(int i=1;i<=cntl;++i) Q[L+i-1]=LE[i];
	for(int i=1;i<=cntr;++i) Q[L+i-1+cntl]=RI[i];
	solve(l,mid,L,L+cntl-1),solve(mid+1,r,L+cntl,R);
	return ;
}

int OO,HH;

int main(){
	n=read(),m=read();
	for(int i=1;i<=m;++i){
		OO=read();
		Q[i].l=read(),Q[i].r=read(),Q[i].k=read();
		if(OO==1) Q[i].opt=0;
		else Q[i].opt=++HH;
	}
	build(1,1,n);
	solve(-INF,INF,1,m);
	for(int i=1;i<=HH;++i){
		printf("%d\n",ans[i]-1);
	}
	return 0;
}

注意看输出:

printf("%d\n",ans[i]-1);

:::align{center} -1 ::: 但是A了。不懂,求解答。

2025/8/1 17:28
加载中...