QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#432726#892. Minimal CutKazemaruWA 2ms12364kbC++142.5kb2024-06-07 15:57:132024-06-07 15:57:14

Judging History

你现在查看的是最新测评结果

  • [2024-06-07 15:57:14]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:12364kb
  • [2024-06-07 15:57:13]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define f(i,j,k) for(int i=j;i<=k;++i)
#define g(i,j,k) for(int i=j;i>=k;--i)
#define pb push_back
int n,m,s,l;
const int N=3e4,M=5e6,inf=2e9,mo=998244353;
struct xyz{int x,y,z;}b[N];
inline bool operator<(xyz a,xyz b){return a.z<b.z;};
struct Kazemaru{
	int rt[N],t;
	struct xds{int ls,rs,t,x;xyz c,d;}a[M];
	struct op{int l,r,c;};vector<op>q[N];
	#define mid (L+R)/2
	inline void New(int&id,int x){if(a[id].x<x)a[++t]=a[id],a[id=t].x=x;}
	inline void Add(int&id,int c,int x){New(id,x);a[id].t+=c;a[id].c.z+=c;a[id].c.x=x;a[id].d=min(a[id].c,a[id].d);}
	inline void xf(int id,int x){Add(a[id].ls,a[id].t,x);Add(a[id].rs,a[id].t,x);a[id].t=0;}
	inline void up(int id){a[id].c=min(a[a[id].ls].c,a[a[id].rs].c);a[id].d=min(a[a[id].ls].d,a[a[id].rs].d);}
	int bt(int L,int R){
		int id=++t;if(L<R)a[id]={bt(L,mid),bt(mid+1,R)};
		a[id].c=a[id].d={0,L,inf};return id;
	}
	void add(int&id,int L,int R,int l,int r,int c,int x){
		if(r<L||R<l)return;New(id,x);
		if(l<=L&&R<=r)return Add(id,c,x);xf(id,x);
		add(a[id].ls,L,mid,l,r,c,x);add(a[id].rs,mid+1,R,l,r,c,x);up(id);
	}
	xyz ask(int id,int L,int R,int l,int r){
		if(r<L||R<l||!id)return{0,0,inf};
		if(l<=L&&R<=r)return a[id].d;xf(id,n);
		return min(ask(a[id].ls,L,mid,l,r),ask(a[id].rs,mid+1,R,l,r));
	}
	#undef mid
	inline void ADD(int u,int v,int w){
		q[1].pb({u,v-1,w});q[u+1].pb({u,v-1,-w});
		q[u+1].pb({v,n,w});q[v+1].pb({v,n,-w});
	}
	inline void init(){
		rt[0]=bt(1,n);q[1].pb({1,n,-inf});
		f(i,1,n){
			rt[i]=rt[i-1];
			sort(q[i].begin(),q[i].end(),[&](op a,op b){return a.c>b.c;});
			for(op e:q[i])add(rt[i],1,n,e.l,e.r,e.c,i);
		}
	}
	inline xyz ASK(int u,int v){xyz a=ask(rt[u],1,n,u,v-1);return{min(a.x,u),a.y,a.z};}
}A,B;
int fa[N],sz[N],x,y,z;
int fifa(int x){return x==fa[x]?x:fa[x]=fifa(fa[x]);}
inline void add(int u,int v,int w){A.ADD(u,v,w);B.ADD(n-v+1,n-u+1,w);}
inline xyz ask(int u,int v){
	xyz a=A.ASK(u,v),b=B.ASK(n-v+1,n-u+1);
	return min(a,(xyz){n-b.y+1,n-b.x+1,b.z});
}
void clc(int l,int r){
	if(l==r)return;xyz e=ask(l,r);b[++m]={l,r,e.z};
	int p=e.x<=l?e.y:e.x-1;clc(l,p);clc(p+1,r);
}
signed main(){
	cin>>n>>m;
	f(i,1,m){
		cin>>x>>y>>z;
		x<y?add(x,y,z):add(y,x,z);
	}m=0;
	A.init();B.init();clc(1,n);
	sort(b+1,b+m+1);
	f(i,1,n)sz[fa[i]=i]=1;
	g(i,m,1){
		x=fifa(b[i].x);y=fifa(b[i].y);
		s=(s+sz[x]*sz[y]%mo*b[i].z)%mo;
		sz[x]+=sz[y];fa[y]=x;
	}
	cout<<(s+n*(n-1)/2*inf)%mo;
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 7752kb

input:

4 2
1 3 2
2 4 2

output:

21067776

result:

ok "21067776"

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 12364kb

input:

79 190
24 30 8372
16 17 3623
47 43 577
47 45 10000
50 49 9644
35 25 882
23 24 1994
54 55 7778
32 33 230
52 53 6078
5 10 8214
25 26 6829
21 22 340
67 68 6066
10 1 8104
9 10 3085
44 43 5659
33 34 5505
7 10 337
12 13 3804
5 1 4735
25 28 6650
61 60 9290
14 6 9857
38 35 6228
48 49 3076
60 59 4972
54 52 4...

output:

844887307

result:

wrong answer 1st words differ - expected: '844859152', found: '844887307'