이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |