社区讨论

45pts求调,WA了4个点,做法应该是对的

P9030 [COCI 2022/2023 #1] Berilij参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhizlwcy
此快照首次捕获于
2025/11/03 18:18
4 个月前
此快照最后确认于
2025/11/03 18:18
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define mp make_pair
#define fi first
#define se second
#define lb lower_bound
#define fr front()
#define pii pair<int,int>
#define db double
#define pdi pair<int,double>
#define INF 2e9
using namespace std;

int n,m;
db eps=1e-4;
struct point{
    db x,y;
}p[100005];

db dis(point a,point b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

vector<pdi> g[100005];
vector<int> now;
int px,py,flag;
int vis[100005],vis2[100005],pos,ns,nowsz;
db c[100005],b[100005],ans[100005],t,fn[100005];
stack<pdi> st;

void work(int bg,int ed,db sum){
    int top=0;
    while(!st.empty()){
        int u=st.top().fi;
        db val=st.top().se;st.pop();
        if(u==ed)break;fn[++top]=val;
    }
    fn[++top]=sum;int x=1;
    for(int i=1;i<=top;i++){
        ans[bg]+=x*fn[i];
        x=-x;
    }
    ans[bg]/=2;ans[bg]=abs(ans[bg]);
    //cout<<bg<<" "<<ans[bg]<<"\n";
}

void pdfs(int u){
    now.push_back(u);vis[u]=1;
    for(auto i:g[u]){
        if(vis[i.fi])continue;
        pdfs(i.fi);
    }
}

void dfs3(int u){
    //cout<<u<<"\n";
    vis[u]=1;int nxt=-c[u];
    for(auto i:g[u]){
        if(vis[i.fi]&&c[i.fi]==c[u]){
            flag=1;pos=u;
            work(u,i.fi,i.se);
            return;
        }
        if(vis[i.fi])continue;
        st.push(mp(i.fi,i.se));
        c[i.fi]=nxt;dfs3(i.fi);
        if(flag)return;
    }
    st.pop();
}

void dfs2(int u){
    vis2[u]=1;
    for(auto i:g[u]){
        if(!vis2[i.fi])ans[i.fi]=i.se-ans[u];
        else if(abs(ans[i.fi]+ans[u]-i.se)>eps){cout<<"NE";exit(0);}
        if(vis2[i.fi])continue;dfs2(i.fi);
    }
}

void dfs1(int u){
    int nxt=-c[u];vis[u]=1;
    for(auto i:g[u]){
        if(vis[i.fi]&&abs(b[u]+b[i.fi]-i.se)>eps){cout<<"NE";exit(0);}
        if(vis[i.fi])continue;
        b[i.fi]=i.se-b[u];dfs1(i.fi);
    }
}

void solve2(){
    db l=-INF,r=INF;
    for(auto i:now){
        if(c[i]<0)r=min(r,b[i]);
        if(c[i]>0)l=max(l,-b[i]);
    }
    //if(l-r>eps)cout<<l<<" "<<r<<"\n";
    //if(l-r>eps){cout<<"NE";exit(0);}
    for(auto i:now)t+=1.0*c[i]*b[i];t=-t/(1.0*(db)now.size());
    if(t-l>=-eps&&r-t>=-eps){
        for(auto i:now)ans[i]=c[i]*t+b[i];
        return;
    }
    if(abs(t-l)<abs(t-r))t=l;else t=r;
    for(auto i:now)ans[i]=c[i]*t+b[i];
}

signed main(){
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>p[i].x>>p[i].y;
    for(int i=1;i<=m;i++){
        int a,b;cin>>a>>b;
        g[a].push_back(mp(b,dis(p[a],p[b])));
        g[b].push_back(mp(a,dis(p[a],p[b])));
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            now.clear();
            c[i]=1;ns=0;flag=0;t=0;pos=0;
            while(!st.empty())st.pop();
            pdfs(i);nowsz=now.size();
            for(auto j:now)vis[j]=0;
            st.push(mp(i,0));dfs3(i);
            if(flag)dfs2(pos);
            else {for(auto j:now)vis[j]=0;dfs1(i);solve2();}
        }
    }
    double neps=1e-4;
    for(int i=1;i<=n;i++){
        if(ans[i]<=-neps){cout<<"NE";return 0;}
    }
    cout<<"DA"<<"\n";
    for(int i=1;i<=n;i++){
        cout<<fixed<<setprecision(10)<<ans[i]<<"\n";
    }
}

回复

0 条回复,欢迎继续交流。

正在加载回复...