답안 #598514

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
598514 2022-07-18T12:42:41 Z AGE Transport (COCI19_transport) C++14
26 / 130
558 ms 38104 KB
#include<bits/stdc++.h>
#define F first
#define S second
#define int long long
#define pb push_back

using namespace std;
const int N=2e5+10,M=2e3,mod=1e9+7;
int cost[N],seg[N*4],ans[N];
vector<pair<int,int>>adj[N];
map<pair<int,int>,int>mp;

void dfs(int node,int par){

    for(auto x:adj[node]){

        if(x.F==par)
            continue;

        ans[x.F]=ans[node]+cost[node]-mp[{node,x.F}];
        if(ans[x.F]<0)
            continue;

        dfs(x.F,node);

    }

}

void build(int v,int tl,int tr){

    if(tl==tr){
        seg[v]=ans[tl];
        return ;
    }

    int tm=(tl+tr)/2;

    build(v*2,tl,tm);
    build(v*2+1,tm+1,tr);

    seg[v]=min(seg[v*2],seg[v*2+1]);

}

int get(int v,int tl,int tr,int l,int r){

    if(tl>r||tr<l){
        return 1e18;
    }

    if(tl>=l&&tr<=r)
        return seg[v];

    int tm=(tl+tr)/2;

    return min(get(v*2,tl,tm,l,r),get(v*2+1,tm+1,tr,l,r));

}

int n;
bool ok(int mid,int val,int start){

    if(start+mid-1>n)
        return 0;

    int ans1=get(1,1,n,start,start+mid-1);
    return ans1>=val;

}
main()
{
    int n;
    cin>>n;
        for(int i=1;i<=n;i++)
            cin>>cost[i];

        for(int i=0;i<n-1;i++){
            int x,y,z;
            cin>>x>>y>>z;

            adj[x].pb({y,z});
            adj[y].pb({x,z});
            mp[{x,y}]=z;
            mp[{y,x}]=z;

        }

    if(n<=5000){
        int anss=0;

        for(int i=1;i<=n;i++){

            for(int j=1;j<=n;j++)
                ans[j]=-1e18;

            ans[i]=0;
            dfs(i,0);


            for(int j=1;j<=n;j++)
                if(ans[j]!=1e18&&ans[j]>=0&&i!=j)
                    anss++;

        }

        cout<<anss<<endl;
    }


    else{
       ans[1]=0;

    for(int i=1;i<=n;i++){
        ans[i+1]=ans[i]+cost[i]-mp[{i,i+1}];
    }

    build(1,1,n);
    int anss=0;

    for(int i=1;i<=n;i++){

        int val=ans[i];
        int l=0,r=n+1;

        while(l<r){

            int mid=(l+r+1)/2;
            if(ok(mid,val,i))
                l=mid;
            else
                r=mid-1;

        }

        anss+=l-1;

    }

    reverse(cost+1,cost+n+1);

    ans[0]=0;

    for(int i=1;i<=n;i++){
        ans[i+1]=ans[i]+cost[i]-mp[{n-i+1,n-i}];
    }

    build(1,1,n);

    for(int i=1;i<=n;i++){

        int val=ans[i];
        int l=0,r=n+1;

        while(l<r){

            int mid=(l+r+1)/2;
            if(ok(mid,val,i))
                l=mid;
            else
                r=mid-1;

        }

        anss+=l-1;

    }

    cout<<anss<<endl;
    }
    return 0;
}

Compilation message

transport.cpp:71:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   71 | main()
      | ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 212 ms 5588 KB Output is correct
2 Correct 133 ms 5788 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 558 ms 6304 KB Output is correct
2 Correct 50 ms 5968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 85 ms 13996 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 105 ms 17128 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 151 ms 22272 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 88 ms 14200 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 143 ms 20376 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 184 ms 25340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 314 ms 31848 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 350 ms 38104 KB Output isn't correct
2 Halted 0 ms 0 KB -