社区讨论
求义父调试!!!!
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 条回复,欢迎继续交流。
正在加载回复...