제출 #94289

#제출 시각아이디문제언어결과실행 시간메모리
94289ekremRegions (IOI09_regions)C++98
0 / 100
8085 ms38172 KiB
#include <bits/stdc++.h> #define st first #define nd second #define mp make_pair #define pb push_back #define N 400005 #define M 25005 #define kok 4000 using namespace std; typedef pair < int , int > ii; typedef pair < int , ii > iii; int n, m, q, k, tme, a[N], ne[N], say[N], mi[N], ust[N/kok + 10][M], alt[N/kok + 10][M]; vector < int > g[N]; vector < ii > gez[N]; void bul(int node, int ne, int say, int dur, int kk){ if(a[node] == ne) say++; if(a[node] == dur) ust[kk][ne] += say; for(int i = 0; i < g[node].size(); i++) bul(g[node][i], ne, say, dur, kk); } void bul2(int node, int ne, int say, int dur, int kk){ if(a[node] == ne) say++; if(a[node] == dur) alt[kk][dur] += say; for(int i = 0; i < g[node].size(); i++) bul2(g[node][i], ne, say, dur, kk); } void dfs(int node){ gez[a[node]].pb(mp(++tme, 1)); for(int i = 0; i < g[node].size(); i++) dfs(g[node][i]); gez[a[node]].pb(mp(++tme, -1)); } int main() { // freopen("regions.gir", "r", stdin); // freopen("regions.cik", "w", stdout); scanf("%d %d %d",&n ,&m ,&q); scanf("%d",a + 1); say[a[1]]++; for(int i = 2; i <= n; i++){ int x; scanf("%d %d",&x, a + i); say[a[i]]++; g[x].pb(i); } for(int i = 1; i <= m; i++) if(say[i] >= kok){ mi[i] = ++k; ne[k] = i; } for(int i = 1; i <= k; i++) for(int j = 1; j <= m; j++) if(j != ne[i]){ bul(1, j, 0, ne[i], i); bul2(1, ne[i], 0, j, i); // printf("ust[%d][%d] = %d\n", ne[i], j, ust[i][j]); // printf("alt[%d][%d] = %d\n", ne[i], j, alt[i][j]); } dfs(1); for(int i = 1; i <= m; i++) sort(gez[i].begin(), gez[i].end()); while(q--){ int x, y; scanf("%d %d",&x, &y); if(mi[x]){ printf("%d\n", alt[mi[x]][y]); continue; } if(mi[y]){ printf("%d\n", ust[mi[y]][x]); continue; } vector < iii > z; int sz1 = gez[x].size(), i = 0; int sz2 = gez[y].size(), j = 0; // cout << x << " " << sz1 << " , " << y << " " << sz2 << endl; while(i < sz1 and j < sz2){ if(gez[x][i].st < gez[y][j].st){ z.pb(mp(gez[x][i].st , mp(gez[x][i].nd, x))); i++; } else{ z.pb(mp(gez[y][j].st , mp(gez[y][j].nd, y))); j++; } } while(i < sz1){ z.pb(mp(gez[x][i].st , mp(gez[x][i].nd, x))); i++; } while(j < sz2){ z.pb(mp(gez[y][j].st , mp(gez[y][j].nd, y))); j++; } int crp = 0, ans = 0; for(i = 0; i < z.size(); i++){ if(z[i].nd.nd == x) crp += z[i].nd.st; else ans += crp; } printf("%d\n", ans/2); } return 0; }

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

regions.cpp: In function 'void bul(int, int, int, int, int)':
regions.cpp:23:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[node].size(); i++)
                 ~~^~~~~~~~~~~~~~~~
regions.cpp: In function 'void bul2(int, int, int, int, int)':
regions.cpp:32:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[node].size(); i++)
                 ~~^~~~~~~~~~~~~~~~
regions.cpp: In function 'void dfs(int)':
regions.cpp:38:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[node].size(); i++)
                 ~~^~~~~~~~~~~~~~~~
regions.cpp: In function 'int main()':
regions.cpp:114:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(i = 0; i < z.size(); i++){
              ~~^~~~~~~~~~
regions.cpp:47:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d",&n ,&m ,&q);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:48:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",a + 1);
  ~~~~~^~~~~~~~~~~~
regions.cpp:53:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&x, a + i);
   ~~~~~^~~~~~~~~~~~~~~~~~~
regions.cpp:80:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&x, &y);
   ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...