Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
37767 | LYLAKIOI | 【S】T3 | C++ | 运行超时 | 75 | 1000 MS | 46136 KB | 4179 | 2025-05-08 18:59:20 |
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; typedef __int128 i128; typedef long double db; const int maxn=2e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m,k;ll a[maxn],w[maxn]; vector<pi>E[maxn]; bool cir[maxn]; int tot; struct dsu { int fa[maxn]; int fd(int u){if(u==fa[u])return u;return fa[u]=fd(fa[u]);} bool chk(int x,int y){x=fd(x),y=fd(y);if(x==y)return 0;fa[x]=y;return 1;} }T; int fa[maxn]; void dfs(int u){ for(auto it:E[u]){ if(it.p1==fa[u]||cir[it.p1])continue; fa[it.p1]=u,dfs(it.p1); } } ll ans[maxn]; int vis[maxn],tag[maxn]; i128 dp[maxn][2]; i128 cost[maxn][2]; vector<int>vec; void dfs2(int u,int ban=-1){ vec.p_b(u); vis[u]=1; dp[u][0]=cost[u][0],dp[u][1]=cost[u][1]; for(auto it:E[u]){ int x=it.p1; if(vis[x]||(!tag[x])||x==ban)continue;dfs2(x); if(it.p2)dp[u][0]+=min(dp[x][0],dp[x][1]),dp[u][1]+=dp[x][1]; else dp[u][0]+=dp[x][0],dp[u][1]+=min(dp[x][0],dp[x][1]); } } int bel[maxn]; void dfs3(int u,int o,int ban=-1){ bel[u]=o,vis[u]=1; for(auto it:E[u]){ int x=it.p1; if(vis[x]||(!tag[x])||x==ban)continue; if(it.p2){ if(!o)dfs3(x,dp[x][0]<dp[x][1]?0:1); else dfs3(x,1); } else { if(o)dfs3(x,dp[x][0]<dp[x][1]?0:1); else dfs3(x,0); } } } i128 F(ll x){return k==1?x:(i128)x*(i128)x;}; const i128 inf=(i128)(1e18)*(i128)(1e18); void solve(ll l,ll r,vector<int>nd){ if(nd.empty())return; if(l==r){ for(int i:nd)ans[i]=l; return; }ll mid=l+r>>1;int s=0; for(int p:nd)tag[p]=1,cost[p][0]=(i128)w[p]*F(abs(a[p]-mid)),cost[p][1]=(i128)w[p]*F(abs(a[p]-(mid+1))); for(int p:nd)s+=cir[p]; if(s==tot&&s){ int id=0;for(int p:nd)if(cir[p])id=p; int id2=0,lm=0;for(auto it:E[id])if(cir[it.p1])id2=it.p1,lm=it.p2; auto F=[&](int U,bool tag){ for(int p:nd)vis[p]=0; i128 t=-1; if((!lm)&&(!U))t=cost[id2][1],cost[id2][1]=inf; else if(lm&&U)t=cost[id2][0],cost[id2][0]=inf; dfs2(id,id2); if(tag){ for(int p:nd)vis[p]=0; dfs3(id,U,id2); } if((!lm)&&(!U))cost[id2][1]=t; else if(lm&&U)cost[id2][0]=t; return dp[id][U]; }; if(F(0,0)<F(1,0))F(0,1); else F(1,1); } for(int p:nd)if(!vis[p]){ vec.clear();dfs2(p); for(int q:vec)vis[q]=0; dfs3(p,dp[p][0]<dp[p][1]?0:1); } vector<int>L,R; for(int p:nd){ if(bel[p])R.p_b(p); else L.p_b(p); } for(int p:nd)tag[p]=vis[p]=0; solve(l,mid,L);solve(mid+1,r,R); } void slv(){ n=read(),m=read(),k=read(); up(i,1,n)a[i]=read(); up(i,1,n)w[i]=read(); up(i,1,n)T.fa[i]=i; int cx=0,cy=0; char cw=0; auto link=[](int x,int y,char c){ E[x].p_b(m_p(y,c=='<')),E[y].p_b(m_p(x,c=='>')); }; up(i,1,m){ int x=read(),y=read();char c;scanf("%c",&c); if(!T.chk(x,y))cx=x,cy=y,cw=c; else link(x,y,c); } if(m==n){ dfs(cx); for(int i=cy;i;i=fa[i])cir[i]=1,++tot; link(cx,cy,cw); for(int i=cy;i;i=fa[i])dfs(i); } vector<int>nd; up(i,1,n)nd.p_b(i); ll inf=1e10; up(i,1,n)a[i]*=inf; solve(1,1e15,nd); double res=0; up(i,1,n)res+=w[i]*(F(abs(a[i]-ans[i]))*1.0/F(inf)); res-=0.001; printf("%.3f",res); } int main(){ //freopen("salary.in","r",stdin),freopen("salary.out","w",stdout); slv(); fclose(stdin),fclose(stdout); return 0; } /* 3 2 1 1 2 3 1 1 1 1 2 < 2 3 > */