Submission #2121600
Source Code Expand
#include<bits/stdc++.h>
#define pb(x) push_back(x)
#define all(x) x.begin(), x.end()
#define N 200005
#define LOGN 20
using namespace std;
struct Edge{
int u, v, w;
Edge(int _u, int _v, int _w){ u = _u; v = _v; w = _w; }
Edge(){}
void read(){ scanf("%d%d", &u, &v); u--; v--; }
void print(){ printf("%d %d %d\n", u, v, w); }
};
Edge E[N];
bool operator <(const Edge &e1, const Edge &e2){ return e1.w < e2.w; }
int P[N], size[N], heavyEdge[N], n, m, nodes;
int Find(int x){
if(x == P[x])return x;
return P[x] = Find(P[x]);
}
void Union(int x, int y){ //First one will be the superset any time
x = Find(x);
y = Find(y);
P[y] = x;
size[x] += size[y];
}
vector<Edge> GetMinimumSpanningTree(){
vector<Edge>ans;
int u, v, w;
for(int i = 0; i < n; i++)P[i] = i;
//sort(E, E + m);
for(int i = 0; i < m; i++){
u = E[i].u;
v = E[i].v;
w = E[i].w;
if(Find(u) != Find(v))Union(u, v), ans.pb(E[i]);
}
return ans;
}
int Next[LOGN][N];
int Explore(int u, int v, int heaviest){
int supersetSize = 0;
for(int i = LOGN - 1; i >= 0; i--){
if(Next[i][u] == -1 || heavyEdge[Next[i][u]] > heaviest)continue;
u = Next[i][u];
}
supersetSize += size[u];
for(int i = LOGN - 1; i >= 0; i--){
if(Next[i][v] == -1 || heavyEdge[Next[i][v]] > heaviest)continue;
v = Next[i][v];
}
if(u != v)supersetSize += size[v];
return supersetSize;
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++)E[i].read(), E[i].w = i + 1;
vector<Edge>MST = GetMinimumSpanningTree();
//for(int i = 0; i < n - 1; i++)MST[i].print();
nodes = n;
for(int i = 0; i < n; i++)P[i] = i, size[i] = 1;
for(int i = n; i < 2 * n; i++)P[i] = i, size[i] = 0;
int u, v, w;
memset(Next, -1, sizeof Next);
for(int i = 0; i < MST.size(); i++){
u = MST[i].u;
v = MST[i].v;
w = MST[i].w;
Next[0][Find(u)] = nodes;
Next[0][Find(v)] = nodes;
Union(nodes, Find(u));
Union(nodes, Find(v));
heavyEdge[nodes] = w;
nodes++;
}
//for(int i = 0; i < nodes; i++)printf("node: %d | parent: %d | size: %d | heavyEdge: %d\n", i, Next[0][i], size[i], heavyEdge[i]);
for(int j = 1; j < LOGN; j++){
for(int i = 0; i < nodes; i++){
if(Next[j - 1][i] == -1)continue;
Next[j][i] = Next[j - 1][Next[j - 1][i]];
}
}
int q, z;
scanf("%d", &q);
for(int i = 0; i < q; i++){
scanf("%d%d%d", &u, &v, &z);
u--; v--;
int lo = 1, hi = m, me;
while(lo < hi){
me = lo + (hi - lo)/2;
if(Explore(u, v, me) >= z)hi = me;
else lo = me + 1;
}
printf("%d\n", lo);
}
}
Submission Info
Submission Time |
|
Task |
D - Stamp Rally |
User |
Woreviam |
Language |
C++14 (GCC 5.4.1) |
Score |
1000 |
Code Size |
2740 Byte |
Status |
AC |
Exec Time |
520 ms |
Memory |
22004 KB |
Compile Error
./Main.cpp: In function ‘int main()’:
./Main.cpp:82:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &n, &m);
^
./Main.cpp:124:17: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &q);
^
./Main.cpp:128:30: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d%d", &u, &v, &z);
^
./Main.cpp: In member function ‘void Edge::read()’:
./Main.cpp:15:39: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
void read(){ scanf("%d%d", &u, &v); u--; v--; }
^
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
1000 / 1000 |
Status |
|
|
Set Name |
Test Cases |
Sample |
0_00.txt |
All |
0_00.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 1_18.txt, 1_19.txt, 1_20.txt, 1_21.txt, 1_22.txt, 1_23.txt, 1_24.txt, 1_25.txt, 1_26.txt, 1_27.txt, 1_28.txt, 1_29.txt, 1_30.txt, 1_31.txt |
Case Name |
Status |
Exec Time |
Memory |
0_00.txt |
AC |
6 ms |
18688 KB |
1_00.txt |
AC |
411 ms |
21236 KB |
1_01.txt |
AC |
520 ms |
21236 KB |
1_02.txt |
AC |
458 ms |
22004 KB |
1_03.txt |
AC |
511 ms |
22004 KB |
1_04.txt |
AC |
469 ms |
21748 KB |
1_05.txt |
AC |
497 ms |
21748 KB |
1_06.txt |
AC |
467 ms |
21620 KB |
1_07.txt |
AC |
504 ms |
21620 KB |
1_08.txt |
AC |
450 ms |
21236 KB |
1_09.txt |
AC |
471 ms |
21236 KB |
1_10.txt |
AC |
373 ms |
21236 KB |
1_11.txt |
AC |
333 ms |
21236 KB |
1_12.txt |
AC |
338 ms |
21236 KB |
1_13.txt |
AC |
324 ms |
21236 KB |
1_14.txt |
AC |
365 ms |
21236 KB |
1_15.txt |
AC |
366 ms |
21236 KB |
1_16.txt |
AC |
364 ms |
21236 KB |
1_17.txt |
AC |
430 ms |
21236 KB |
1_18.txt |
AC |
428 ms |
21236 KB |
1_19.txt |
AC |
379 ms |
21236 KB |
1_20.txt |
AC |
417 ms |
21108 KB |
1_21.txt |
AC |
394 ms |
21236 KB |
1_22.txt |
AC |
441 ms |
21236 KB |
1_23.txt |
AC |
433 ms |
21236 KB |
1_24.txt |
AC |
446 ms |
21108 KB |
1_25.txt |
AC |
420 ms |
21236 KB |
1_26.txt |
AC |
396 ms |
21108 KB |
1_27.txt |
AC |
421 ms |
21236 KB |
1_28.txt |
AC |
398 ms |
21236 KB |
1_29.txt |
AC |
443 ms |
21108 KB |
1_30.txt |
AC |
426 ms |
21236 KB |
1_31.txt |
AC |
412 ms |
21108 KB |