Submission #581897

#TimeUsernameProblemLanguageResultExecution timeMemory
581897HunterXDGraph (BOI20_graph)C++17
0 / 100
1 ms316 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double dl; typedef pair<int,int> ii; typedef vector <int> vi; typedef vector <ll> vl; typedef vector<string> vs; typedef vector<bool> vb; typedef vector <char> vc; typedef vector<ii> vii; typedef vector<vi> vvi; typedef vector<vl> vvl; typedef vector<vc> vvc; typedef vector<vs> vvs; typedef pair<ll,ll> pl; typedef double dou; typedef vector<pl> vpl; typedef unsigned long long ull; typedef uint64_t i64; typedef vector<ull> vull; #define f first #define s second #define pb push_back #define sz(x) int((x).size()) #define all(x) begin(x), end(x) #define ts to_string #define lb lower_bound #define ub upper_bound #define yes cout<<'Y'<<'E'<<'S'<<endl #define no cout<<'N'<<'O'<<endl #define nd "\n" void setIO(string name=""){ios_base::sync_with_stdio(0);cin.tie(0);if(sz(name)){freopen((name+".in").c_str(),"r",stdin);freopen((name+".out").c_str(),"w",stdout);}} ll gcd(ll a, ll b) {return b == 0 ? a : gcd(b, a % b);} ll mcm(ll a, ll b) {return (a * b) / gcd(a, b);} bool prime(ll n) {for(int i=2; i<=sqrt(n); i++) if(n%i==0) return false; return true;} struct compii{bool operator()(const ii &a, const ii &b){if(a.f==a.s)return a.s<b.s;return a.f>b.f;}}; bool comp(int a, int b) {return a>b;} ll binpow(ll n, ll x){ll ans=1; while(x){if(x&1){ans*=n;}n*=n; x>>=1;} return ans;} namespace operators { template<typename T1, typename T2>istream& operator>>(istream& in, pair<T1, T2>& x){in >> x.first >> x.second;return in;} template<typename T1, typename T2>ostream& operator<<(ostream& out, pair<T1, T2> x){out << x.first << " " << x.second;return out;} template<typename T1>istream& operator>>(istream& in, vector<T1>& x) {for (auto& i : x) in >> i;return in;} template<typename T1>ostream& operator<<(ostream& out, vector<T1>& x) {for (auto& i : x) out << i << " ";return out;} template<typename T1, typename T2>ostream& operator<<(ostream& out, vector<pair <T1,T2>>& x) {for (auto& i : x) out << i.f << " "<<i.s;return out;} template<typename T1, typename T2>istream& operator>>(istream& in, vector<pair <T1,T2>>& x) {for (auto& i : x) in >> i.f >>i.s;return in;} } using namespace operators; int dx[]= {1,0,-1,0}; int dy[]= {0,1,0,-1}; const int pmod = 998244353; const int mod = 1e9+7; const ll inf=1e18; ll sum(ll a, ll b){ return (( (a+mod) %mod) + ((b+mod)%mod))%mod; } ll multi(ll a, ll b){ return (((a+mod) %mod) * ((b+mod)%mod))%mod; } /// dl x; bool can = true, xfind; vector<bool> seenDFS, seenVAL; vector<pl> my; vector<ll> pending; vector<dl> val; vector< vector<ll> > graphB, graphR; void dfs(ll u, pl next){ pending.pb(u); seenDFS[u] = true; my[u] = next; next.f*= -1; pl nextB = next, nextR = next; nextB.s = 1-next.s; nextR.s = 2-next.s; pl p1, p2; for(auto v: graphB[u]){ if(!seenDFS[v]){ dfs(v, nextB); } else{ if(nextB != my[v]){ if(nextB.f == my[v].f){ can = false; } else{ x = (my[v].s-nextB.s)/( (dl) (nextB.f - my[v].f) ); xfind = true; } } } } for(auto v: graphR[u]){ if(!seenDFS[v]){ dfs(v, nextR); } else{ if(nextR != my[v]){ if(nextR.f == my[v].f){ can = false; } else{ x = (my[v].s-nextR.s)/( (dl) (nextR.f - my[v].f) ); xfind = true; } } } } } void dfs_assign(ll u){ seenVAL[u] = true; val[u] = (dl) (my[u].f*x + my[u].s); for(auto v: graphB[u]){ if(!seenVAL[v]){ dfs_assign(v); } } for(auto v: graphR[u]){ if(!seenVAL[v]){ dfs_assign(v); } } } void calc_res(ll i){ vector<ll> me; for(auto v: pending){ me.pb(my[v].s); } sort(all(me)); x = me[me.size()/2]; dfs_assign(i); } void solve(){ ll n, m; cin >> n >> m; graphB.assign(n+1, vector<ll>()); graphR.assign(n+1, vector<ll>()); val.assign(n+1, 0); seenDFS.assign(n+1, false); seenVAL.assign(n+1, false); my.assign(n+1, {1, 0}); ll a[m], b[m], c[m]; for(ll i = 0; i < m; i++){ cin >> a[i] >> b[i] >> c[i]; if(c[i] == 1){ graphB[a[i]].pb(b[i]); graphB[b[i]].pb(a[i]); } else{ graphR[a[i]].pb(b[i]); graphR[b[i]].pb(a[i]); } } for(ll i = 1; i <= n; i++){ if(!seenDFS[i]){ pending.clear(); xfind = false; dfs(i, {1, 0}); if(xfind){ dfs_assign(i); } else{ calc_res(i); } } } dl dif = 0.0000001; for(ll i = 0; i < m; i++){ dl me; if(c[i] == 1) me = 1 - (val[a[i]]+val[b[i]]); else me = 2 - (val[a[i]]+val[b[i]]); if(abs(me) > dif) can = false; } if(!can){ no; return; } yes; for(ll i = 1; i <= n; i++){ cout << val[i] << " "; } cout << endl; } int main (){ setIO(""); int t = 1; //cin >> t; while(t-->0) solve(); return 0; }

Compilation message (stderr)

Graph.cpp: In function 'void setIO(std::string)':
Graph.cpp:35:88: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 | void setIO(string name=""){ios_base::sync_with_stdio(0);cin.tie(0);if(sz(name)){freopen((name+".in").c_str(),"r",stdin);freopen((name+".out").c_str(),"w",stdout);}}
      |                                                                                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Graph.cpp:35:128: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 | void setIO(string name=""){ios_base::sync_with_stdio(0);cin.tie(0);if(sz(name)){freopen((name+".in").c_str(),"r",stdin);freopen((name+".out").c_str(),"w",stdout);}}
      |                                                                                                                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...