社区讨论
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 条回复,欢迎继续交流。
正在加载回复...