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;
}