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