45分求助,以及一个问题
查看原帖
45分求助,以及一个问题
400195
EqufixSN-Equfix楼主2022/1/17 10:42

RT,我下载了第二个数据,发现我的输出小了,并且如果我把我得出错误答案的边在输入时删去,得到的答案竟然不一样??

代码基本同island,只是改了输入以及统计答案,线段树应该没有问题

调了1天多了脑子没了

#include<bits/stdc++.h>
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define int long long
#define mod (998244353)
#ifndef ONLINE_JUDGE
#pragma GCC optimize(2)
#endif
using namespace std;
namespace IO{
	inline int read(){
		int n=0;
		int s=1;
		char x;
		while((x=getchar())<'0'||x>'9')
			if(x=='-')
				s=-1;
		while(x>='0'&&x<='9'){
			n=(n<<1)+(n<<3)+(x^48),
			x=getchar();
		}
		return n*s;
	}
	void write(char x){
		putchar(x);
	}
	void write(const char *x){
		for(;*x;++x)
			putchar(*x);
	}
	void write(char *x){
		for(;*x;++x)
			putchar(*x);
	}
	void write(signed x){
		if(x<0)putchar('-'),x=-x;
		if(x>9)write(x/10);
		putchar('0'+x-x/10*10);
	}
	void write(long long x){
		if(x<0)putchar('-'),x=-x;
		if(x>9)write(x/10);
		putchar('0'+x-x/10*10);
	}
	void write(double x){
		printf("%lf",x);
	}
	template<typename type1,typename type2,typename ...typen>
	void write(type1 a1,type2 a2,typen ...an){
		write(a1);
		write(a2,an...);
	}
}// namespace IO
inline long long max(long long a,long long b){return a>b?a:b;}
inline long long min(long long a,long long b){return a>b?b:a;}
// stop
struct Edge{
	int to,nxt;
	long long v;
	Edge(){}
	Edge(int _to,int _nxt,long long _v):to(_to),nxt(_nxt),v(_v){}
}edge[2000002];
int head[1000001],tot=1;
void add(int a,int b,int c){
	edge[++tot]=Edge(b,head[a],c),head[a]=tot;
	edge[++tot]=Edge(a,head[b],c),head[b]=tot;
}
int c[2000001];
long long p[2000001];
long long x[2000001];
struct Node{
	int l,r;
	long long m,a;
	#define l(p) tree[p].l
	#define r(p) tree[p].r
	#define m(p) tree[p].m
	#define a(p) tree[p].a
	#define lson (p<<1)
	#define rson (p<<1|1)
}tree[8000001];
inline void push_up(int p){m(p)=max(m(lson),m(rson));}
inline void push_down(int p){
	if(!a(p))return;
	m(lson)+=a(p),a(lson)+=a(p);
	m(rson)+=a(p),a(rson)+=a(p);
	a(p)=0;
}
void build(int p,int l,int r){
	l(p)=l,r(p)=r,a(p)=0;
	if(l==r){
		m(p)=x[l];
		return;
	}
	int mid=(l+r)>>1;
	build(lson,l,mid);
	build(rson,mid+1,r);
	push_up(p);
}
void change(int p,int l,int r,long long x){
	if(l<=l(p)&&r(p)<=r){
		a(p)+=x,m(p)+=x;
		return;
	}
	push_down(p);
	if(r(lson)>=l)change(lson,l,r,x);
	if(l(rson)<=r)change(rson,l,r,x);
	push_up(p);
}
long long ans;
void find(int p,int l,int r){
	if(l<=l(p)&&r(p)<=r){
		ans=max(ans,m(p));
		return;
	}
	push_down(p);
	if(r(lson)>=l)find(lson,l,r);
	if(l(rson)<=r)find(rson,l,r);
}
vector<int>e[1000001];
int dfn[1000001],low[1000001],TM;
int sta[1000001],top,cnt;
bool vis[1000001];
void tarjin(int i,int fa){
	dfn[i]=low[i]=++TM;
	sta[++top]=i,vis[i]=1;
	for(int j=head[i];j;j=edge[j].nxt)
		if((j^1)!=fa){
			int v=edge[j].to;
			if(!dfn[v])tarjin(v,j),low[i]=min(low[i],low[v]);
			else low[i]=min(low[i],dfn[v]);
		}
	if(low[i]==dfn[i]){
		cnt++;
		while(1){
			e[cnt].pb(sta[top]);
			vis[sta[top]]=0;
			top--;
			if(sta[top+1]==i)break;
		}
	}
}
int n;
bool incir[1000001];
void init(){
	for(int i=1;i<=n;i++)
		if(!dfn[i])
			tarjin(i,0);
	for(int i=1;i<=cnt;i++)
		if(e[i].size()>1)
			for(int j=0;j<e[i].size();j++)
				incir[e[i][j]]=1;
}
long long dfs(int i,int fa){
	long long maxm=0;
	for(int j=head[i];j;j=edge[j].nxt){
		int v=edge[j].to;
		if(v==fa||incir[v])continue;
		maxm=max(dfs(v,i)+edge[j].v,maxm);
	}
	return maxm;
}
long long mem[1000001];
long long bfs(int i){
	long long maxm=0;
	int son=0;
	queue<int>que;
	que.push(i);
	mem[i]=-1;
	vector<int>used;
	while(!que.empty()){
		int x=que.front();
		used.pb(x);
		que.pop();
		if(mem[x]>maxm)maxm=mem[x],son=x;
		for(int j=head[x];j;j=edge[j].nxt){
			int v=edge[j].to;
			if(mem[v]||incir[v])continue;
			mem[v]=max(0,mem[x])+edge[j].v;
			que.push(v);
		}
	}
	for(int i=0;i<used.size();i++)mem[used[i]]=0;
	if(!son)return 0;
	maxm=0;
	que.push(son),mem[son]=-1;
	while(!que.empty()){
		int x=que.front();
		que.pop();
		maxm=max(maxm,mem[x]);
		for(int j=head[x];j;j=edge[j].nxt){
			int v=edge[j].to;
			if(mem[v]||(x==i&&incir[v]))continue;
			mem[v]=max(mem[x],0)+edge[j].v;
			que.push(v);
		}
	}
	for(int i=0;i<used.size();i++)mem[used[i]]=0;
	return maxm;
}
map<pair<int,int>,int>mapt;
long long work(){
	long long sum=0;
	for(int i=1;i<=cnt;i++)
		if(e[i].size()>1){
			long long maxm=0;
			int op=e[i].size();
			x[1]=0;
			for(int j=1;j<op;j++){
				long long qwq;
				qwq=mapt[mp(e[i][j],e[i][j-1])];
				// if(qwq==0)puts("WA");
				x[j+1]=x[op+j+1]=c[j+1]=c[op+j+1]=qwq;
			}
			c[op+1]=x[op+1]=mapt[mp(e[i][0],e[i][op-1])];
			// cout<<x[1]<<" ";
			for(int j=2;j<=2*op;j++)x[j]+=x[j-1];
			// cout<<"\n";
			for(int j=0;j<op;j++){
				maxm=max(maxm,bfs(e[i][j]));
				long long qwq=dfs(e[i][j],0);
				// cout<<j<<" "<<qwq<<"\n";
				p[j+1]=p[j+op+1]=qwq;
				x[j+1]+=qwq;
				x[j+op+1]+=qwq;
			}
			// cout<<"\n";
			// if(maxm<=146064780875ll)cout<<"giao";
			build(1,1,2*op);
			int minm=1e18;
			for(int j=1;j<=op;j++){
				// cout<<c[j]<<" "<<p[j]<<"\n";
				change(1,j,2*op,-c[j]);
				// if(j==132)
				// 	for(int x=j;x<=j+op+3;x++){
				// 		ans=0;
				// 		find(1,x,x);
				// 		cout<<ans<<"\n";
				// 	}
				ans=0;
				find(1,j+1,j+op-1);
				minm=min(minm,max(maxm,p[j]+ans));
				// cout<<p[j]<<" "<<ans<<"\n";
				// if(p[j]+ans==146064780875ll)cout<<j<<" "<<p[j]<<" "<<e[i][j-1]<<" "<<e[i][j-2]<<"\n";
			}
			sum+=minm;
			// cout<<maxm<<"\n";
		}
	return sum;
}
signed main(){
	using namespace IO;
	// define int long long
	n=read();
	// int flag=0;
	for(int i=1;i<=n;i++){
		int u=read(),q=read(),w=read();
		// if((u==746&&q==741)||(u==741&&q==746)){
		// 	flag++;
		// 	continue;
		// }
		mapt[mp(q,u)]=mapt[mp(u,q)]=w;
		add(u,q,w);
	}
	// cout<<flag<<"\n";
	// cout<<bfs(1);
	// return 0;
	init();
	long long x=work();
	// write(x);
	// cout<<x<<"\n";
	write(x/2,'.',((x%2)?5:0));
	return 0;
}
2022/1/17 10:42
加载中...