求助刚才的G
  • 板块学术版
  • 楼主xieziheng
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/8/12 21:43
  • 上次更新2023/11/3 04:11:33
查看原帖
求助刚才的G
401215
xieziheng楼主2023/8/12 21:43

为什么这么写不对呀

#include <bits/stdc++.h>
#define il inline
using namespace std;
typedef long long ll;
const int N=5e5+5;
int n,m,b[N],cur,ans[N];ll h,a[N],s[N];
int tot,root;
struct node{
	int w,siz,cnt,ls,rs;ll v;
	il node(){v=0ll,w=siz=cnt=ls=rs=0;}
}tree[N];
il void pushup(int x){tree[x].siz=tree[tree[x].ls].siz+tree[tree[x].rs].siz+tree[x].cnt;}
il void lrot(int &x){
	int y=tree[x].rs;
	tree[x].rs=tree[y].ls,tree[y].ls=x,tree[y].siz=tree[x].siz;
	pushup(x),x=y;
}
il void rrot(int &x){
	int y=tree[x].ls;
	tree[x].ls=tree[y].rs,tree[y].rs=x,tree[y].siz=tree[x].siz;
	pushup(x),x=y;
}
void insert(int &x,ll val){
	if(!x){
		x=(++tot),tree[x].v=1ll*val,tree[x].w=rand(),tree[x].siz=tree[x].cnt=1;
		return ;
	}
	++tree[x].siz;
	if(tree[x].v==val){++tree[x].cnt;return ;}
	else if(val<tree[x].v){
		insert(tree[x].ls,val);
		if(tree[tree[x].ls].w<tree[x].w) rrot(x);
	}
	else{
		insert(tree[x].rs,val);
		if(tree[tree[x].rs].w<tree[x].w) lrot(x);
	}
}
int del(int &x,ll val){
	if(!x) return 0;
	if(tree[x].v==val){
		if(tree[x].cnt>1){--tree[x].siz,--tree[x].cnt;return 1;}
		if(!tree[x].ls || !tree[x].rs) {x=tree[x].ls+tree[x].rs;return 1;}
		else if(tree[tree[x].ls].w<tree[tree[x].rs].w){rrot(x);return del(x,val);}
		else {lrot(x);return del(x,val);}
	}
	else if(val<tree[x].v){
		int y=del(tree[x].ls,val);
		if(y) --tree[x].siz;
		return y;
	}
	else{
		int y=del(tree[x].rs,val);
		if(y) --tree[x].siz;
		return y;
	}
}
ll querynum(int x,int val){
	if(!x || !val) return 0ll;
	if(val<=tree[tree[x].ls].siz) return querynum(tree[x].ls,val);
	else if(val>tree[tree[x].ls].siz+tree[x].cnt) return querynum(tree[x].rs,val-tree[tree[x].ls].siz-tree[x].cnt);
	else return tree[x].v;
}
int x,y,z;ll u,v,w,sum,sumd;
int main(){
    scanf("%d%d%lld",&n,&m,&h);
    for(int i=1;i<=n;++i) scanf("%lld%d",&a[i],&b[i]);
    for(int i=1;i<=m;++i) insert(root,0ll);
    u=0ll;
    for(int i=1;i<=n;++i){
        u+=1ll*a[i];
        if(u>=h){ans[0]=i-1;break;}
    }
    cur=1;
    for(int i=1;i<=n;++i){
        u=querynum(root,m-cur+1);
        if(s[b[i]]>=u) sumd-=s[b[i]];
        del(root,s[b[i]]),insert(root,s[b[i]]+1ll*a[i]);
        u=querynum(root,m-cur+1);
        if(s[b[i]]+1ll*a[i]>=u) sumd+=s[b[i]]+1ll*a[i];
        sum+=1ll*a[i];
        while(cur<=m && sum-sumd>=h) ans[cur]=i-1,++cur,sumd+=querynum(root,m-cur+1);
        s[b[i]]+=a[i];
        //printf("%d %d %lld\n",i,cur,sumd);
    }
    for(int i=cur;i<=m;++i) ans[i]=n;
    for(int i=0;i<=m;++i) printf("%d ",ans[i]);
    return 0;
}
2023/8/12 21:43
加载中...