求调fhq答案随机问题
  • 板块学术版
  • 楼主mayike
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/1 15:18
  • 上次更新2024/8/1 15:42:01
查看原帖
求调fhq答案随机问题
1039406
mayike楼主2024/8/1 15:18

题目:CF702F

不知道为什么,答案老是随机,但没调出来。

#include<bits/stdc++.h>
using namespace std;
mt19937 rd(time(0));
const int N=2e5+5;
int n,m,b[N],ans[N],tot,rt;
struct no{
	int c,q;
}a[N];
bool cmp(no x,no y){
	return x.q==y.q?x.c<y.c:x.q>y.q;
}
struct ab{
	unsigned int pro;
	int key,v,x,id,ans,l,r;
}tr[N];
int _new(int key,int id){
	tr[++tot]={rd(),key,0,0,id,0,0,0};
	return tot;
}
void pushdown(int p){
	if(tr[p].v){
		if(tr[p].l){
			tr[tr[p].l].v+=tr[p].v;
			tr[tr[p].l].ans+=tr[p].v;
		}
		if(tr[p].r){
			tr[tr[p].r].v+=tr[p].v;
			tr[tr[p].r].ans+=tr[p].v;
		}
		tr[p].v=0;
	}
	if(tr[p].x){
		if(tr[p].l){
			tr[tr[p].l].x+=tr[p].x;
			tr[tr[p].l].key-=tr[p].x;
		}
		if(tr[p].r){
			tr[tr[p].r].x+=tr[p].x;
			tr[tr[p].r].key-=tr[p].x;
		}
		tr[p].x=0;
	}
}
void split(int p,int k,int &l,int &r){
	if(!p)l=r=0;
	else{
		pushdown(p);
		if(tr[p].key<k){
			l=p;
			split(tr[p].r,k,tr[p].r,r);
		}
		else{
			r=p;
			split(tr[p].l,k,l,tr[p].l);
		}
	}
}
int merge(int l,int r){
	if(!l||!r)return l|r;
	if(tr[l].pro<=tr[r].pro){
		pushdown(l);
		tr[l].r=merge(tr[l].r,r);
		return l;
	}
	pushdown(r);
	tr[r].l=merge(l,tr[r].l);
	return r;
}
void dfs(int u){
	pushdown(u);
	if(tr[u].l)dfs(tr[u].l);
	if(tr[u].r)dfs(tr[u].r);
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i].c>>a[i].q;
	sort(a+1,a+1+n,cmp);
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>b[i];
		rt=merge(rt,_new(b[i],i));
	}
	int p1,p2,p3,p4,p5,p6;
	for(int i=1;i<=n;i++){
		split(rt,2*a[i].c,p1,p2);
		tr[p2].v++;
		tr[p2].ans++;
		tr[p2].x+=a[i].c;
		tr[p2].key-=a[i].c;
		split(p1,a[i].c,p3,p4);
		while(p4){
			tr[p4].key-=a[i].c;
			tr[p4].ans++;
			pushdown(p4);
			int x=merge(tr[p4].l,tr[p4].r);
			tr[p4].l=tr[p4].r=0;
			split(p3,tr[p4].key,p5,p6);
			p3=merge(merge(p5,p4),p6);
			p4=x;
		}
		rt=merge(p3,p2);
	}
	dfs(rt);
	for(int i=1;i<=tot;i++)ans[tr[i].id]=tr[i].ans;
	for(int i=1;i<=m;i++)cout<<ans[i]<<" ";
	return 0;
}
2024/8/1 15:18
加载中...