제출 #889791

#제출 시각아이디문제언어결과실행 시간메모리
889791vjudge1Tourism (JOI23_tourism)C++17
17 / 100
4083 ms52556 KiB
#include <bits/stdc++.h> #define ll long long #define str string #define ins insert #define ld long double #define pb push_back #define pf push_front #define pof pop_front() #define pob pop_back() #define lb lower_bound #define ub upper_bound #define endl "\n" #define fr first #define sc second #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() #define sz size() #define bc back() #define ar array #define vll vector<ll> using namespace std; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; template <class _T> bool chmin(_T &x, const _T &y){ if(x>y){ x=y; return true; } return false; } template <class _T> bool chmax(_T &x, const _T &y){ bool flag=false; if (x<y){ x=y;flag|=true; } return flag; } #define ordered_set tree<ll, null_type,less_equal<ll>, rb_tree_tag,tree_order_statistics_node_update> void fre(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);} void start(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } const ll inf=2e18+7; const ll mod=1e9+7; const ll N=1e5+7; const ld eps=1e-9; vector<vll> g(N); vector<pair<ll,ll>> t(N*4,{inf,0}); ll val[N]; void build(ll v,ll tl,ll tr){ if(tl==tr){ t[v]={val[tl],val[tl]}; return; } ll tm=(tl+tr)/2; build(v*2,tl,tm); build(v*2+1,tm+1,tr); t[v]={min(t[v*2].fr,t[v*2+1].fr),max(t[v*2].sc,t[v*2+1].sc)}; } pair<ll,ll> get(ll v,ll tl,ll tr,ll l,ll r){ if(tl>r || tr<l)return {inf,0ll}; if(l<=tl && tr<=r) return t[v]; ll tm=(tl+tr)/2; pair<ll,ll> a=get(v*2,tl,tm,l,r); pair<ll,ll> b=get(v*2+1,tm+1,tr,l,r); return {min(a.fr,b.fr),max(a.sc,b.sc)}; } bool f[2005]; ll go(ll v,ll p){ ll sum=0; for(auto i : g[v]){ if(i==p)continue; sum+=go(i,v); } if(f[v] || sum) return sum+1; return sum; } ll d[N],p[N][20]; ll tin[N],tout[N],tiktak; void dfs(ll v){ tin[v]=++tiktak; for(ll i=1;i<18;i++){ p[v][i]=p[p[v][i-1]][i-1]; } for(auto i :g[v]){ if(i==p[v][0])continue; p[i][0]=v; d[i]=d[v]+1; dfs(i); } tout[v]=++tiktak; } ll lca(ll a,ll b){ ll i; if(d[a]<d[b])swap(a,b); for(i=17;i>=0;i--){ if(d[a]-d[b]>=(1ll<<i)){ a=p[a][i]; } } if(a==b)return a; for(i=17;i>=0;i--){ if(p[a][i]!=p[b][i]){ a=p[a][i]; b=p[b][i]; } } return p[a][0]; } void solve(){ ll i,j; ll n,m,q; ll a,b; cin>>n>>m>>q; bool line=true; for(i=1;i<n;i++){ cin>>a>>b; if(a>b)swap(a,b); if(b-a!=1)line=false; g[a].pb(b); g[b].pb(a); } vector<ll> s(m+1); for(i=1;i<=m;i++)cin>>s[i]; if(n<=2000 && m<=2000 && q<=2000){ for(i=1;i<=q;i++){ memset(f,false,sizeof(f)); cin>>a>>b; for(j=a;j<=b;j++)f[s[j]]=true; cout<<go(s[a],0)<<endl; } return; } if(line){ for(i=1;i<=m;i++)val[i]=s[i]; build(1,1,m); for(i=0;i<q;i++){ cin>>a>>b; pair<ll,ll> x=get(1,1,m,a,b); cout<<x.sc-x.fr+1<<endl; } return; } dfs(1); for(i=1;i<=q;i++){ cin>>a>>b; vector<pair<ll,ll>> v; map<ll,ll> mp; for(j=a;j<=b;j++){ if(!mp[s[j]]) v.pb({tin[s[j]],s[j]}); mp[s[j]]++; } if(v.sz==1){ cout<<1<<endl; continue; } sort(all(v)); ll lc=lca(v[0].sc,v[1].sc),sum=d[v[0].sc]-d[lc]+d[v[1].sc]-d[lc]+1; for(j=2;j<(ll)v.sz;j++){ a=v[i-1].sc; b=v[i].sc; ll cur=lca(a,b); if(cur==a){ sum+=d[b]-d[a]; continue; } ll nlc=lca(lc,b); if(nlc==lc){ sum+=d[b]-d[cur]; }else{ sum+=d[b]-d[nlc]+d[lc]-d[nlc]; lc=nlc; } } cout<<sum<<endl; } } signed main(){ //start(); ll t=1; //cin>>t; while(t--) solve(); return 0; } /* 1 6 5 4 3 2 1 0 */

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

tourism.cpp: In function 'void fre(std::string)':
tourism.cpp:42:27: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   42 | void fre(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);}
      |                    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tourism.cpp:42:64: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   42 | void fre(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);}
      |                                                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...