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
AC × 1
AC × 33
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