社区讨论

求义父调试!!!!

P13514 [KOI 2025 #1] 干草堆参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mhizab7x
此快照首次捕获于
2025/11/03 18:09
4 个月前
此快照最后确认于
2025/11/03 18:09
4 个月前
查看原帖
Splay WA#33#50#51
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int n,m,d[N],l,r,mid,bao,no,ans[N],root,tot;
struct Node{int sum,sz,fa,s[2],val,cnt;};
struct Q{int x,p,id;}q[N];
bool cmp(Q x,Q y){return x.x<y.x||x.x==y.x&&x.p<y.p;}
struct Splay{
	Node f[N];
	void pushup(int x){
		if (!x) return;
		f[x].sum=f[f[x].s[0]].sum+f[f[x].s[1]].sum+f[x].val*f[x].cnt;
		f[x].sz=f[f[x].s[0]].sz+f[f[x].s[1]].sz+f[x].cnt;
	}
	void rotate(int x){
		int y=f[x].fa,z=f[y].fa,c=(f[y].s[1]==x),w=f[x].s[!c];
		if (z) f[z].s[f[z].s[1]==y]=x;f[x].s[!c]=y;f[y].s[c]=w;
		if (w) f[w].fa=y;f[y].fa=x;f[x].fa=z;
		pushup(y);pushup(x);
	}
	void splay(int x,int goal){
		while (f[x].fa!=goal){
			int y=f[x].fa,z=f[y].fa;
			if (z!=goal) (f[y].s[0]==x)^(f[z].s[0]==y)?rotate(x):rotate(y);
			rotate(x);
		}
		if (!goal) root=x;
	}
	void ins(int val){
		int x=root,p=0;
		while (x&&f[x].val!=val) p=x,x=f[x].s[f[x].val>val];
		if (x) f[x].cnt++;
		else{
			x=++tot;f[x].val=val;
			f[x].cnt=1;f[x].fa=p;f[x].sum=val;f[x].sz=1;
			f[x].s[0]=f[x].s[1]=0;
			if (p) f[p].s[f[p].val>val]=x;
		}
		splay(x,0);
	}
	int getval(int k){
		int x=root,ans=0;
		if (!k) return 0;
		if (!x) return 0;
		while (1){
			if (k<=f[f[x].s[0]].sz) x=f[x].s[0];
			else if (k<=f[f[x].s[0]].sz+f[x].cnt){ans+=f[f[x].s[0]].sum+(k-f[f[x].s[0]].sz)*f[x].val;break;}
			else k-=f[f[x].s[0]].sz+f[x].cnt,ans+=f[x].sum-f[f[x].s[1]].sum,x=f[x].s[1];
		}
		splay(x,0);
		return ans;
	}
}T;
signed main(){
	scanf("%lld%lld",&n,&m);
	for (int i=1;i<=n;i++) scanf("%lld",&d[i]);
	for (int i=1;i<=m;i++) scanf("%lld%lld",&q[i].x,&q[i].p),q[i].id=i;
	sort(q+1,q+m+1,cmp);no=0;
	for (int i=1;i<=m;i++){
		while (no+1<=q[i].x) l=0,T.ins(d[++no]);
		r=no;bao=-1;
		while (l<=r){
			int mid=(l+r)>>1;
			if (T.getval(mid)>=q[i].p) bao=mid,r=mid-1;
			else l=mid+1;
		}
		l=(bao==-1?0:bao);ans[q[i].id]=bao;
	}
	for (int i=1;i<=m;i++) printf("%lld\n",ans[i]);
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...