社区讨论

求调RE

P11134【MX-X5-T6】「GFOI Round 1」Abiogenesis参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m515vkfj
此快照首次捕获于
2024/12/23 22:57
去年
此快照最后确认于
2025/11/04 12:25
4 个月前
查看原帖
奇奇怪怪的挂了两个点,报的错没见过,,,
求佬路过调一下。
CPP
#include <bits/stdc++.h>
#define ll long long
#define int long long
#define eps 1e-12
#define db long double
#define ull unsigned long long
#define wr(x,ch) write(x),putchar(ch)
#define lb(x) ((x)&-(x))
#define inf (0x3f3f3f3f3f3f3f3f)
#define il inline
using namespace std;
typedef pair<ll,ll> pai;
#define x first
#define y second
ll read() {
	ll x=0;
	bool f=0;char c=getchar();
	while(!isdigit(c)) f|=c=='-',c=getchar();
	while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return f?-x:x;
}
void write(ll x) {
	if(x<0) putchar('-'),x=-x;
	if(x>=10) write(x/10);
	putchar(x%10^48);
	return ;
}
const int N=2e5+5;
int flag[N],top,cnt,ans,fa[N],n,Min[N],Minn[N];
int get(int x) {return fa[x]==x?x:fa[x]=get(fa[x]);}
struct node {
	int l,r,a,b;
	bool operator<(const node &p) const {
		return b<p.b;
	}
}a[N];
struct VAL {
	int Min,Minc,seMin,seMinc;
	VAL operator+(const VAL &p) const {
		VAL tmp;
		if(Min==p.Min) {
			tmp.Min=Min,tmp.Minc=Minc;
			if(Minc==p.Minc) {
				if(seMin<p.seMin) tmp.seMin=seMin,tmp.seMinc=seMinc;
				else tmp.seMin=p.seMin,tmp.seMinc=p.seMinc;
			} else tmp.seMin=p.Min,tmp.Minc=p.Minc;
		} else if(Min<p.Min) {
			tmp.Min=Min,tmp.Minc=Minc;
			if(seMin<=p.Min||(p.Minc==tmp.Minc&&seMin<=p.seMin)) tmp.seMin=seMin,tmp.seMinc=seMinc;
			else if(p.Minc!=tmp.Minc) tmp.seMin=p.Min,tmp.seMinc=p.Minc;
			else tmp.seMin=p.seMin,tmp.seMinc=p.seMinc;
		} else {
			tmp.Min=p.Min,tmp.Minc=p.Minc;
			if(p.seMin<=Min||(Minc==tmp.Minc&&p.seMin<=seMin)) tmp.seMin=p.seMin,tmp.seMinc=p.seMinc;
			else if(Minc!=tmp.Minc) tmp.seMin=Min,tmp.seMinc=Minc;
			else tmp.seMin=seMin,tmp.seMinc=seMinc;
		}
		return tmp;//?????
	}
};
struct Others {
	struct node {
		VAL v,tag;
	}tr[N<<2];
	void update(int p,VAL tag) {
		tr[p].v=tr[p].v+tag;
		tr[p].tag=tr[p].tag+tag;
		return ;
	}
	void pushdown(int p) {
		if(tr[p].tag.Min!=inf) update(p<<1,tr[p].tag),update(p<<1|1,tr[p].tag),tr[p].tag=(VAL){inf,0,inf,0};
		return ;
	}
	void pushup(int p) {
		tr[p].v=tr[p<<1].v+tr[p<<1|1].v;
		return ;
	}
	void build(int l,int r,int p) {
		tr[p].v=tr[p].tag=(VAL){inf,0,inf,0};
		if(l==r) return ;
		int mid=l+r>>1;build(l,mid,p<<1),build(mid+1,r,p<<1|1);
		return ;
	}
	void add(int s,int t,int l,int r,int p,VAL d) {
		if(s<=l&&r<=t) return update(p,d);
		int mid=l+r>>1;pushdown(p);
		if(s<=mid) add(s,t,l,mid,p<<1,d);
		if(t>mid) add(s,t,mid+1,r,p<<1|1,d);
		return pushup(p);
	}
	VAL ask(int s,int t,int l,int r,int p) {
		if(s<=l&&r<=t) return tr[p].v;
		int mid=l+r>>1;pushdown(p);
		VAL ans=(VAL){inf,0,inf,0};
		if(s<=mid) ans=ans+ask(s,t,l,mid,p<<1);
		if(t>mid) ans=ans+ask(s,t,mid+1,r,p<<1|1);
		return ans;
	}
}T;
void Solve() {
	n=read();
	top=0;
	for(int i=1;i<=n;i++) a[i].l=read(),a[i].r=read(),a[i].a=read(),a[i].b=read(),flag[++top]=a[i].l,flag[++top]=a[i].r;
	sort(flag+1,flag+top+1),top=unique(flag+1,flag+top+1)-flag-1;
	for(int i=1;i<=n;i++) {
		a[i].l=lower_bound(flag+1,flag+top+1,a[i].l)-flag;
		a[i].r=lower_bound(flag+1,flag+top+1,a[i].r)-flag;
	}
	for(int i=1;i<=n;i++) fa[i]=i;
	sort(a+1,a+n+1);//cmpb
	cnt=n,ans=0;
	// for(int i=1;i<=n;i++) printf("%d %d %d %d\n",a[i].l,a[i].r,a[i].a,a[i].b);
	while(cnt>1) {
		int lstcnt=cnt;
		for(int i=1;i<=n;i++) if(fa[i]==i) Min[i]=inf,Minn[i]=0;
		T.build(1,top,1);
		for(int i=1;i<=n;i++) {
			VAL tmp=T.ask(a[i].l,a[i].r,1,top,1);
			if(tmp.Minc==get(i)) {
				if(tmp.seMin+a[i].a+a[i].b<Min[get(i)]) Min[get(i)]=tmp.seMin+a[i].a+a[i].b,Minn[get(i)]=tmp.seMinc;
				//update
			} else {
				if(tmp.Min+a[i].a+a[i].b<Min[get(i)]) Min[get(i)]=tmp.Min+a[i].a+a[i].b,Minn[get(i)]=tmp.Minc;
			}
			T.add(a[i].l,a[i].r,1,top,1,(VAL){a[i].a-a[i].b,get(i),inf,0});
		}
		T.build(1,top,1);
		for(int i=n;i>=1;i--) {
			VAL tmp=T.ask(a[i].l,a[i].r,1,top,1);
			if(tmp.Minc==get(i)) {
				if(tmp.seMin+a[i].a-a[i].b<Min[get(i)]) Min[get(i)]=tmp.seMin+a[i].a-a[i].b,Minn[get(i)]=tmp.seMinc;
				//update
			} else {
				if(tmp.Min+a[i].a-a[i].b<Min[get(i)]) Min[get(i)]=tmp.Min+a[i].a-a[i].b,Minn[get(i)]=tmp.Minc;
			}
			T.add(a[i].l,a[i].r,1,top,1,(VAL){a[i].a+a[i].b,get(i),inf,0});
		}
		// for(int i=1;i<=n;i++) printf("(%d,%d) ",(Min[i]==inf?-1:Min[i]),Minn[i]);puts("");
		for(int i=1;i<=n;i++) 
			if(fa[i]==i) 
				if(Minn[i]&&get(i)!=get(Minn[i])) fa[get(i)]=get(Minn[i]),ans+=Min[i],cnt--;
		if(lstcnt==cnt) {
			puts("-1");
			return ;
		}
	}
	wr(ans,'\n');
	return ;
}
signed main() {
	freopen("data.in","r",stdin);
	freopen("data.out","w",stdout);
	int T=read();
	while(T--) Solve();
    cerr<<clock()*1.0/CLOCKS_PER_SEC<<"\n";
	return 0;
}
/*
g++ a.cpp -o a.exe -std=c++14 -O2 "-Wl,-stack=1234567890";./a.exe

有点极端了
*/

回复

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

正在加载回复...