Submission #934547

#TimeUsernameProblemLanguageResultExecution timeMemory
934547velislavgarkovTourism (JOI23_tourism)C++14
10 / 100
283 ms41436 KiB
#include <iostream> #include <algorithm> #include <vector> using namespace std; #define endl '\n' const int MAXN=1e5+10; const int BUCK=450; struct Query { int l, r; int ind; bool friend operator < (Query a, Query b) { return a.r>b.r; } }; Query que[MAXN]; vector <int> v[MAXN]; vector <int> arr, isl; int c[MAXN]; int fe[MAXN], le[MAXN], in[MAXN], dep[MAXN], ind[MAXN]; int sp[MAXN][20], stepen[MAXN]; int n, m, q, cnt; bool cmpi(int a, int b) { return in[a]<in[b]; } void dfs(int x, int p) { in[x]=cnt; cnt++; fe[x]=arr.size(); for (auto i:v[x]) { if (i==p) continue; ind[arr.size()]=x; arr.push_back(x); dep[i]=dep[x]+1; dfs(i,x); } le[x]=arr.size(); ind[arr.size()]=x; arr.push_back(x); } void sparce_table() { int kn=arr.size(); for (int i=0;i<kn;i++) sp[i][0]=arr[i]; for (int i=1;(1<<i)<=kn;i++) { for (int j=0;j+(1<<i)-1<kn;j++) { int i1, i2; i1=sp[j][i-1]; i2=sp[j + (1 << (i-1))][i-1]; if (dep[i1]<dep[i2]) sp[j][i]=i1; else sp[j][i]=i2; } } int st=0; for (int i=1;i<=kn;i++) { if ((1 << (st+1))<i) st++; stepen[i]=st; } } int lca(int l, int r) { int st=stepen[r-l+1]; int i1, i2; i1=sp[l][st]; i2=sp[r - (1<<st)+1][st]; if (dep[i1]<dep[i2]) return i1; return i2; } int getdist(int a, int b) { if (in[a]>in[b]) swap(a,b); return dep[a]+dep[b]-2*dep[lca(fe[a],fe[b])]; } int main () { ios::sync_with_stdio(false); cin.tie(nullptr); int a, b; cin >> n >> m >> q; for (int i=0;i<n-1;i++) { cin >> a >> b; v[a].push_back(b); v[b].push_back(a); } cnt=1; dfs(1,-1); sparce_table(); for (int i=1;i<=m;i++) cin >> c[i]; int ans; for (int i=0;i<q;i++) { cin >> que[i].l >> que[i].r; if (!isl.empty()) isl.clear(); for (int j=que[i].l;j<=que[i].r;j++) isl.push_back(c[j]); sort(isl.begin(),isl.end(),cmpi); ans=0; for (int j=1;j<isl.size();j++) ans+=getdist(isl[j-1],isl[j]); if (isl.size()>1) ans+=getdist(isl[0],isl.back()); cout << ans/2+1 << endl; que[i].ind=i; } return 0; }

Compilation message (stderr)

tourism.cpp: In function 'int main()':
tourism.cpp:91:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |         for (int j=1;j<isl.size();j++) ans+=getdist(isl[j-1],isl[j]);
      |                      ~^~~~~~~~~~~
#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...