Submission #197305

#TimeUsernameProblemLanguageResultExecution timeMemory
197305quocnguyen1012Harbingers (CEOI09_harbingers)C++14
60 / 100
292 ms47052 KiB
#include<bits/stdc++.h> #define mp make_pair #define pb push_back #define taskname "HARBINGERS" using namespace std; typedef long long ll; typedef long double ld; typedef pair<int,int> ii; const int maxn = 1e5 + 5; vector<ii> adj[maxn]; ii a[maxn]; ll f[maxn]; int p[maxn]; ll dep[maxn]; int n; int nTime = 0 , in[maxn] , out[maxn]; struct point{ ll x , y; point(){}; point(ll x , ll y):x(x),y(y){}; point operator - (const point & other){ return point(x - other.x , y - other.y); } ll operator * (const point & other){ return x * other.y - y * other.x; } ll Val(int k){ return x * k + y; } }; bool ccw(point a , point b , point c){ return (a - b) * (c - b) <= 0; } struct convex{ vector<point> p; void add(point now){ if(p.size() && now.x == p.back().x && now.y > p.back().y){ return; } while(p.size() >= 2 && ccw(p[p.size() - 2],p[p.size() - 1],now)) p.pop_back(); p.pb(now); } ll query(int x){ if(p.size() == 0)return 1e18; int l = 0 , h = p.size() - 1; while(l <= h){ int mid = l + h >> 1; if(mid + 1 < p.size() && p[mid].Val(x) >= p[mid + 1].Val(x)){ l = mid + 1; }else{ h = mid - 1; } } return p[l].Val(x); } }s[maxn * 4]; void dfs1(int u , int par){ in[u] = ++nTime; for(auto c : adj[u]){ if(c.first != par){ dfs1(c.first , u); } } out[u] = nTime; } void update(int x , int l , int r , int L , int R , point now){ if(L > r || l > R)return; if(L <= l && r <= R){ s[x].add(now); return; } int mid = l + r >> 1; update(x * 2 , l , mid , L , R , now); update(x * 2 + 1 , mid + 1 , r , L , R , now); } ll query(int x , int l , int r , int pos , int k){ if(l == r)return s[x].query(k); int mid = l + r >> 1; if(mid >= pos)return min(s[x].query(k),query(x*2,l,mid,pos,k)); return min(s[x].query(k),query(x*2+1,mid+1,r,pos,k)); } void dfs(int u,int par){ f[u] = 1e18; if(u == 1)f[u] = 0; else{ f[u] = query(1,1,n,in[u],a[u].second) + a[u].first + dep[u] * a[u].second; } update(1,1,n,in[u],out[u],point(-dep[u],f[u])); for(ii c : adj[u]){ if(c.first == par)continue; dep[c.first] = dep[u] + c.second; dfs(c.first , u); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); if(fopen(taskname".IN","r")){ freopen(taskname".IN","r",stdin); freopen(taskname".OUT","w",stdout); } cin >> n; for(int i = 1 ; i < n ; ++i){ int u , v , c;cin >> u >> v >> c; adj[u].pb(mp(v,c));adj[v].pb(mp(u,c)); } for(int i = 2 ; i <= n ; ++i)cin >> a[i].first >> a[i].second; dfs1(1,0); dfs(1,0); for(int i = 2 ; i <= n ; ++i)cout << f[i] << " "; }

Compilation message (stderr)

harbingers.cpp: In member function 'll convex::query(int)':
harbingers.cpp:49:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
             int mid = l + h >> 1;
                       ~~^~~
harbingers.cpp:50:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             if(mid + 1 < p.size() && p[mid].Val(x) >= p[mid + 1].Val(x)){
                ~~~~~~~~^~~~~~~~~~
harbingers.cpp: In function 'void update(int, int, int, int, int, point)':
harbingers.cpp:76:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int mid = l + r >> 1;
               ~~^~~
harbingers.cpp: In function 'll query(int, int, int, int, int)':
harbingers.cpp:82:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int mid = l + r >> 1;
               ~~^~~
harbingers.cpp: In function 'int main()':
harbingers.cpp:104:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen(taskname".IN","r",stdin);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
harbingers.cpp:105:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen(taskname".OUT","w",stdout);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...