Submission #1226910

#TimeUsernameProblemLanguageResultExecution timeMemory
1226910AlmontherTraffic (CEOI11_tra)C++20
0 / 100
450 ms63656 KiB
#include<bits/stdc++.h>

#define ll long long
#define co cout<<

using namespace std;
// stuff
const int maxn=3e5+5;
ll n,m,r,r1;
pair<ll,ll>arr[maxn];
vector<ll>v[maxn],curr,v1[maxn];
ll graph[maxn],vis[maxn];
ll north[maxn],south[maxn],can=0,last=0;
void makegraph(ll x){
    if(graph[x]) return;
    graph[x]=1;
    for(auto i:v1[x]) makegraph(i);
}
ll dfs(ll x,ll type){
    if(vis[x]){
        if(vis[x]==2) can=1;
        if(type==0) return -1e18;
        return 1e18;
    }
    vis[x]=1;
    ll smth=-1e18;
    if(type) smth=1e18;
    if(arr[x].first==r) smth=arr[x].second;
    for(auto i:v[x]){
        if(graph[i]==0) continue;
        if(type==0) smth=max(smth,dfs(i,type));
        else smth=min(smth,dfs(i,type));
    }
    vis[x]=2;
    return smth;
}
void solve(){
    cin>>n>>m>>r>>r1;
    vector<pair<ll,ll>>s;
    for(int i=1;i<=n;i++) cin>>arr[i].first>>arr[i].second;
    for(int i=0;i<m;i++){
        ll a,b,c;
        cin>>a>>b>>c;
        v[a].push_back(b);
        v1[b].push_back(a);
        if(c==2){
            v[b].push_back(a);
            v1[a].push_back(b);
        }
    }
    for(int i=1;i<=n;i++) if(arr[i].first==r) makegraph(i);
    for(int i=1;i<=n;i++){
        if(arr[i].first==r&&graph[i]==1) curr.push_back(arr[i].second);
        if(arr[i].first==0&&graph[i]==1) s.push_back({-arr[i].second,i});
    }
    sort(s.begin(),s.end());
    reverse(s.begin(),s.end());
    sort(curr.begin(),curr.end());
    for(int i=0;i<s.size();i++){
        north[s[i].second]=dfs(s[i].second,0);
        if(can) north[s[i].second]=max(north[last],north[s[i].second]);
        can=0;
        if(north[s[i].second]!=-1e18) last=s[i].second;
    }
    memset(vis,0,sizeof(vis));
    for(int i=s.size()-1;i>=0;i--){
        south[s[i].second]=dfs(s[i].second,1);
        if(can) south[s[i].second]=min(south[last],south[s[i].second]);
        can=0;
        if(south[s[i].second]!=1e18) last=s[i].second;
    }
    s.clear();
    for(int i=1;i<=n;i++) if(arr[i].first==0) s.push_back({-arr[i].second,i});
    sort(s.begin(),s.end());
    for(auto i:s){
        if(graph[i.second]==0){
            co "0\n";
            continue;
        }
        ll idx=lower_bound(curr.begin(),curr.end(),north[i.second])-curr.begin();
        ll idx1=lower_bound(curr.begin(),curr.end(),south[i.second])-curr.begin();
        co max(0ll,idx-idx1+1)<<'\n';
    }
}
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int _=1;
    // cin>>_;
    while(_--) solve();
}
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...