제출 #602332

#제출 시각아이디문제언어결과실행 시간메모리
602332inksamuraiUzastopni (COCI15_uzastopni)C++17
80 / 160
19 ms33032 KiB
#include <bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=0;i<n;i++) #define rng(i,c,n) for(int i=(c);i<n;i++) #define per(i,n) for(int i=n-1;i>=0;i--) #define fi first #define se second #define pb push_back #define sz(a) (int)a.size() #define vec(...) vector<__VA_ARGS__> #define _3aFGabX ios::sync_with_stdio(0),cin.tie(0) typedef long long ll; using pii=pair<int,int>; using vi=vector<int>; void print(){cout<<'\n';} template<class h,class...t> void print(const h&v,const t&...u){cout<<v<<' ',print(u...);} // e bitset<100> usd,evsl[10000][100],evsr[10000][100]; signed main(){ _3aFGabX; int n; cin>>n; vi a(n); rep(i,n){ cin>>a[i]; a[i]-=1; } vec(vi) adj(n); rep(i,n-1){ int u,v; cin>>u>>v; u-=1,v-=1; adj[u].pb(v); adj[v].pb(u); } vec(vec(bitset<100>)) evsl(n,vec(bitset<100>)(100)),evsr; evsr=evsl; bitset<100> usd; auto dfs=[&](auto self,int v,int par)->void{ // if(v==2) print("hi"); vi ls,rs; bitset<100> tmpl,tmpr; usd[a[v]]=1; // print(v,a[v],usd[4]); for(auto &u:adj[v]){ if(u==par or usd[a[u]]) continue; self(self,u,v); if(a[u]<a[v]){ // goes left ls.pb(u); }else{ // goes right rs.pb(u); } } // print(sz(ls)); // please don't tle because of this tmpl=0; tmpl[a[v]]=1; for(int i=a[v]-1;i>=0;i--){ if(tmpl[i+1]){ for(auto &u:ls){ tmpl|=evsl[u][i]; } } } tmpr=0; tmpr[a[v]]=1; for(int i=a[v]+1;i<100;i++){ if(tmpr[i-1]){ for(auto &u:rs){ // if(v==0) print(u,evsr[u][i]); tmpr|=evsr[u][i]; } } } // if(v==2){ // print(tmpr,"hi"); // } for(int i=0;i<100;i++){ if(tmpr[i]){ evsl[v][i]|=tmpl; } if(tmpl[i]){ evsr[v][i]|=tmpr; } } usd[a[v]]=0; }; dfs(dfs,0,-1); int res=0; for(int i=0;i<100;i++){ if(evsl[0][i].count()){ // print(i,evsl[0][i]); res+=evsl[0][i].count(); } } print(res); }
#Verdict Execution timeMemoryGrader output
Fetching results...