이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include <chrono>
#define f first
#define s second
#define pb push_back
using namespace std;
typedef long long ll;
typedef long double ld;
namespace RANDOM
{
ll Time()
{
return chrono::system_clock().now().time_since_epoch().count();
}
mt19937 rnd(Time());
}
using namespace RANDOM;
const int N = 1e5 + 100;
struct tree1
{
int l, r;
tree1 *L, *R;
int sm;
void push()
{
if (l == r) return;
int mdl = (l + r) >> 1;
if (L == NULL) L = new tree1(l, mdl);
if (R == NULL) R = new tree1(mdl + 1, r);
}
tree1(int _l, int _r)
{
l = _l;
r = _r;
sm = 0;
L = NULL, R = NULL;
};
void insert(int x)
{
push();
if (l > x || r < x) return;
sm++;
if (l == r) return;
L -> insert(x);
R -> insert(x);
}
int sum(int x)
{
push();
if (l > x) return 0;
if (r <= x) return sm;
return L -> sum(x) + R -> sum(x);
}
};
struct tree
{
int l, r;
tree *L, *R;
tree1 *chain;
tree(int _l, int _r)
{
l = _l;
r = _r;
L = NULL;
R = NULL;
chain = NULL;
}
void push()
{
if (chain == NULL) chain = new tree1(1, N);
if (l == r) return;
int mdl = (l + r) >> 1;
if (L == NULL) L = new tree(l, mdl);
if (R == NULL) R = new tree(mdl + 1, r);
}
void insert(int x, int y)
{
push();
if (r < x || l > x) return;
chain -> insert(y);
if (l == r) return;
push();
L -> insert(x, y);
R -> insert(x, y);
}
int sum(int x, int y)
{
push();
if (l > x) return 0;
if (r <= x) return chain -> sum(y);
return L -> sum(x, y) + R -> sum(x, y);
}
};
vector <int> a[N];
vector <int> b[N];
int kol;
int sz[N];
bool mrk[N];
ll ans = 0;
int k;
int Kol(int x, int y)
{
if (mrk[x]) return 0;
int sum = 1;
for (int i = 0; i < a[x].size(); i++)
if (a[x][i] != y) sum += Kol(a[x][i], x);
sz[x] = sum;
return sum;
}
int Find_Centroid(int x, int y)
{
for (int i = 0; i < a[x].size(); i++)
if (a[x][i] != y && !mrk[a[x][i]] && sz[a[x][i]] > kol / 2) return Find_Centroid(a[x][i], x);
return x;
}
void Rec(int x, int y, int sz, int mx, vector <pair<int, int> > *vc)
{
if (mrk[x]) return;
vc -> pb({sz, mx});
for (int i = 0; i < a[x].size(); i++)
if (a[x][i] != y) Rec(a[x][i], x, sz + 1, max(mx, b[x][i]), vc);
}
void Calc_Ans(int x)
{
vector <pair<int, int> > nom[a[x].size()];
int m = a[x].size();
for (int i = 0; i < m; i++) Rec(a[x][i], x, 1, b[x][i], &nom[i]);
for (int i = 0; i < m; i++)
{
for (int j = 0; j < nom[i].size(); j++) ans += (nom[i][j].s - nom[i][j].f) >= k;
}
tree *c = new tree(1, N);
for (int i = 0; i < m; i++)
{
for (int j = 0; j < nom[i].size(); j++)
if (nom[i][j].s - nom[i][j].f - k > 0) ans += c -> sum(nom[i][j].s - nom[i][j].f - k, nom[i][j].s);
for (int j = 0; j < nom[i].size(); j++) c -> insert(nom[i][j].f, nom[i][j].s);
}
c = new tree(1, N);
for (int i = m - 1; i >= 0; i--)
{
for (int j = 0; j < nom[i].size(); j++) ans += c -> sum(nom[i][j].s - nom[i][j].f - k, nom[i][j].s);
for (int j = 0; j < nom[i].size(); j++) c -> insert(nom[i][j].f, nom[i][j].s);
}
}
void Centroid(int x)
{
if (mrk[x]) return;
kol = Kol(x, x);
x = Find_Centroid(x, x);
mrk[x] = 1;
Calc_Ans(x);
for (int i = 0; i < a[x].size(); i++) Centroid(a[x][i]);
}
int main()
{
int n;
cin >> n >> k;
for (int i = 0; i < n - 1; i++)
{
int x, y, z;
cin >> x >> y >> z;
a[--x].pb(--y);
a[y].pb(x);
b[x].pb(z);
b[y].pb(z);
}
Centroid(0);
cout << ans * 2;
}
컴파일 시 표준 에러 (stderr) 메시지
Main.cpp: In function 'int Kol(int, int)':
Main.cpp:122:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
122 | for (int i = 0; i < a[x].size(); i++)
| ~~^~~~~~~~~~~~~
Main.cpp: In function 'int Find_Centroid(int, int)':
Main.cpp:130:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
130 | for (int i = 0; i < a[x].size(); i++)
| ~~^~~~~~~~~~~~~
Main.cpp: In function 'void Rec(int, int, int, int, std::vector<std::pair<int, int> >*)':
Main.cpp:139:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
139 | for (int i = 0; i < a[x].size(); i++)
| ~~^~~~~~~~~~~~~
Main.cpp: In function 'void Calc_Ans(int)':
Main.cpp:150:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
150 | for (int j = 0; j < nom[i].size(); j++) ans += (nom[i][j].s - nom[i][j].f) >= k;
| ~~^~~~~~~~~~~~~~~
Main.cpp:155:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
155 | for (int j = 0; j < nom[i].size(); j++)
| ~~^~~~~~~~~~~~~~~
Main.cpp:157:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
157 | for (int j = 0; j < nom[i].size(); j++) c -> insert(nom[i][j].f, nom[i][j].s);
| ~~^~~~~~~~~~~~~~~
Main.cpp:162:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
162 | for (int j = 0; j < nom[i].size(); j++) ans += c -> sum(nom[i][j].s - nom[i][j].f - k, nom[i][j].s);
| ~~^~~~~~~~~~~~~~~
Main.cpp:163:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
163 | for (int j = 0; j < nom[i].size(); j++) c -> insert(nom[i][j].f, nom[i][j].s);
| ~~^~~~~~~~~~~~~~~
Main.cpp: In function 'void Centroid(int)':
Main.cpp:174:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
174 | for (int i = 0; i < a[x].size(); i++) Centroid(a[x][i]);
| ~~^~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |