제출 #334967

#제출 시각아이디문제언어결과실행 시간메모리
334967DymoHarbingers (CEOI09_harbingers)C++14
20 / 100
441 ms65540 KiB
#include<bits/stdc++.h>
using namespace std;


#define pb    push_back
#define eb   emplace_back
#define ll  long long
#define pll pair<ll,ll>
#define ff first
#define ss second
#define endl "\n"
const ll maxn=1e5+10;
const ll mod =1e9+7 ;
const ll base=3e18;
bool ktu=false;
struct Line {
	mutable ll k, m, p;
	bool operator<(const Line& o) const { return k > o.k; }
	bool operator<(ll x) const { return p < x; }
};

struct tk : multiset<Line, less<>> {
	static const ll inf = LLONG_MAX;
	ll div(ll a, ll b) {
		return a / b - ((a ^ b) < 0 && a % b); }
	bool isect(iterator x, iterator y) {
		if (y == end()) return x->p = inf, 0;
		if (x->k == y->k) x->p = x->m > y->m ? inf : -inf;
		else x->p = div(y->m - x->m, x->k - y->k);
		return x->p >= y->p;
	}
	void add(ll k, ll m) {
		auto z = insert({k, m, 0}), y = z++, x = y;
		while (isect(y, z)) z = erase(z);
		if (x != begin() && isect(--x, y)) isect(x, y = erase(y));
		while ((y = x) != begin() && (--x)->p >= y->p)
			isect(x, erase(y));
	}
	ll query(ll x) {
		if (empty()) return base;
		auto l = *lower_bound(x);
		return l.k * x + l.m;
	}
};
vector<pll> adj[maxn];

ll dep[maxn];
ll siz[maxn];
tk st[4*maxn];
ll par[maxn];

ll get1(ll id,ll left,ll right,ll x,ll y,ll t )
{
    if (x>right||y<left) return base;
    if (x<=left&&y>=right)
    {
       /* if (ktu)
        {
            cout <<"WTF"<<" "<<id<<" "<<st[id].query(t)<<endl;
        }*/
        return st[id].query(t);
    }
    ll mid=(left+right)/2;
    return min(get1(id*2,left,mid, x, y,t ),get1(id*2+1,mid+1, right, x, y,t ));
}
void update(ll id,ll left,ll right,ll x,ll y,ll pos)
{
    if (pos>right||pos<left) return ;
   /* if (pos==1)
    {
        cout <<left<<" "<<right<<" "<<x<<" "<<y<<" "<<id<<endl;
    }*/
    st[id].add(x,y);
    if (left==right) return;
    ll mid=(left+right)/2;
    if (mid>=pos) update(id*2,left,mid,x, y, pos);
    else update(id*2+1, mid+1, right, x, y, pos);
}

void dfs(ll u,ll par1)
{
    siz[u]=1;

    for (auto p:adj[u])
    {
        ll h=p.ff;
        if (h==par1) continue;
        dep[h]=dep[u]+p.ss;

        par[h]=u;
        dfs(h,u);
        siz[u]+=siz[h];

    }
}


ll dp[maxn];
ll cntnw=0;
ll nchain=1;
ll chainhead[maxn];
ll chainid[maxn];
ll id[maxn];


void hld(ll u )
{
    if (!chainhead[nchain])
        chainhead[nchain]=u;
    cntnw++;
    chainid[u]=nchain;
    id[u]=cntnw;
    ll nxt=-1;
    for (auto p:adj[u])
    {
        ll to=p.ff;
        if (to==par[u]) continue;
        if (nxt==-1||siz[nxt]<siz[to])
        {
            nxt=to;

        }
    }
    if (nxt!=-1)
    {
        hld(nxt);

    }
    for (auto p:adj[u])
    {
        ll to= p.ff;
        if (to==par[u]) continue;
        if (to==nxt)
            continue;
        nchain++;
        hld(to);
    }


}

ll get(ll l,ll r,ll x)
{
   return get1(1,1,cntnw,l,r,x);
}
void dosth(ll u,ll a ,ll x)
{
    ll p=chainid[u];
    ll chk= chainid[a];
    ll p1=u;
    dp[p1]=base;
    while (1)
    {
        if (p==chk)
        {
            dp[p1]=min(dp[p1],get(id[a],id[u],x));
            break;
        }
         dp[p1]=min(dp[p1],get(id[chainhead[p]],id[u],x));
        u=par[chainhead[p]];
        p=chainid[u];
    }
}

ll s[maxn];
ll v[maxn];

void dfs1(ll u)
{
    if (u==1)
    {
        dp[u]=0;
    }
    else
    {
        dosth(u,1,-v[u]);
       /* if (u==2)
        {
            cout <<q[u]+dep[u]*p[u]<<" "<<dp[u]<<endl;
        }*/
        dp[u]=(dp[u]+v[u]*dep[u]+s[u]);
    }

    update(1,1,cntnw,dep[u],dp[u],id[u]);
 //   cout <<dp[u]<<" "<<u<<endl;
   for (auto p:adj[u])
   {
      ll to=p.ff;
      if (to==par[u]) continue;
      dfs1(to);
   }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    if (fopen("harbingers.in", "r"))
    {
        freopen("harbingers.in", "r", stdin);
        freopen("harbingers.out", "w", stdout);
    }
    ll n;
     cin>>n ;
     for (int i=1;i<=n-1;i++)
     {
         ll x, y, d;
          cin>> x>> y>> d;
          adj[x].pb(make_pair(y,d));
          adj[y].pb(make_pair(x,d));
     }
     dfs(1,0);
     hld(1);
     for (int i=2;i<=n;i++)
     {
         cin>>s[i]>>v[i];

     }
     dfs1(1);
     for (int i=2;i<=n;i++)
     {
         cout <<dp[i]<<" ";
     }





}

컴파일 시 표준 에러 (stderr) 메시지

harbingers.cpp: In function 'int main()':
harbingers.cpp:200:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
  200 |         freopen("harbingers.in", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
harbingers.cpp:201:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
  201 |         freopen("harbingers.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...