QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#294096#7503. Too Many EdgesAlphaMale06AC ✓1177ms19328kbC++142.5kb2023-12-30 06:09:402023-12-30 06:09:40

Judging History

你现在查看的是最新测评结果

  • [2023-12-30 06:09:40]
  • 评测
  • 测评结果:AC
  • 用时:1177ms
  • 内存:19328kb
  • [2023-12-30 06:09:40]
  • 提交

answer

#include <bits/stdc++.h>

/*
	Oce nas,
	koji si na nebesima,
	da se sveti ime Tvoje,
	da dodje carstvo Tvoje,
	da bude volja Tvoja,
	i na zemlji, kao i na nebu.
	
	Hleb nas nasusni daj nam danas,
	i oprosti nam dugove nase,
	kao sto i mi oprastamo duznicima svojim,
	i ne uvedi nas u iskusenje,
	no izbavi nas od zloga.
	
	Jer je Tvoje Carstvo,
	i sila, i slava,
	u vekove vekova.
	
	Amin.
*/

using namespace std;
typedef vector<int> vc;
typedef vector<vector<int>> vvc;
using ll = long long;
using ld = long double;
#define F first
#define S second
#define pb push_back
#define pf push_front
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define int long long

const int N = 5e4+3;
set<int> adj[N];
set<int> revadj[N];
vector<int> toposorted;
bool mark[N];
int d[N];
map<pair<int, int>, int> asked;
int p[N];
int prevans=0;

void dfs(int v){
	mark[v]=1;
	for(auto to =adj[v].begin(); to!=adj[v].end(); to++){
		int nd=*to;
		if(!mark[nd])dfs(nd);
	}
	toposorted.pb(v);
}

void sortbydist(int n){
	for(int i=1; i<=n; i++){
		d[i]=0;
		mark[i]=0;
		p[i]=0;
	}
	for(int i=1; i<=n; i++){
		if(!mark[i]){
			dfs(i);
		}
	}
	reverse(all(toposorted));
	for(int v : toposorted){
		for(auto to = revadj[v].begin(); to!=revadj[v].end(); to++){
			int nd=*to;
			if(d[nd]+1>=d[v]){
				d[v]=d[nd]+1;
				p[v]=nd;
			}
		}
	}
}

void solve(){
	int n, m;
	cin >> n >> m;
	for(int i=0; i< m; i++){
		int x, y;
		cin >> x >> y;
		adj[x].insert(y);
		revadj[y].insert(x);
	}
	int ans=-1;
	bool ok;
	while(true){
		prevans=max(prevans, ans);
		ok=0;
		toposorted.clear();
		sortbydist(n);
		int mx=0;
		int mxind=0;
		for(int i=1; i<=n; i++){
			if(d[i]>=mx){
				mx=d[i];
				mxind=i;
			}
		}
		vector<int> path;
		while(p[mxind]!=0){
			path.pb(mxind);
			mxind=p[mxind];
		}
		if(path.size()<=prevans){
			cout << "! " << prevans << endl;
			return;
		}
		reverse(all(path));
		for(int i=0; i< path.size(); i++){
			bool yes;
			if(!asked[{mxind, path[i]}]){
				cout << "? " << mxind << " " << path[i] << endl;
				cin >> yes;
				asked[{mxind, path[i]}]=1;
			}
			else yes=1;
			if(!yes){
				ans=i;
				adj[mxind].erase(path[i]);
				revadj[path[i]].erase(mxind);
				ok=1;
				break;
			} 
			mxind=path[i];
 		}
 		if(!ok){
 			prevans=path.size();
 			break;
 		}
	}
	cout << "! " << prevans << endl;
}

signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	solve();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 8492kb

input:

5 5
1 2
1 3
2 5
3 4
4 5
1
0
1
1

output:

? 1 3
? 3 4
? 1 2
? 2 5
! 2

result:

ok Correct answer

Test #2:

score: 0
Accepted
time: 4ms
memory: 8336kb

input:

230 470
212 98
107 123
116 72
158 83
135 111
78 123
221 217
214 203
28 221
229 3
111 127
128 13
125 116
180 78
175 191
182 99
194 6
12 83
209 29
169 129
192 208
145 38
33 86
104 85
145 82
38 82
193 153
109 41
199 194
89 72
161 227
36 177
13 141
173 110
212 77
155 81
87 82
104 172
148 182
170 222
68 ...

output:

? 147 145
? 145 53
? 53 178
? 178 223
? 223 101
? 101 195
? 195 38
? 38 81
? 81 207
? 207 87
? 87 82
? 82 137
? 137 196
? 196 15
? 15 113
? 113 20
? 20 40
? 40 227
? 227 224
? 224 56
? 56 175
? 175 167
? 167 176
? 176 211
? 211 112
? 112 62
? 62 135
? 135 198
? 198 201
? 201 131
? 131 191
? 191 205
...

result:

ok Correct answer

Test #3:

score: 0
Accepted
time: 1177ms
memory: 18996kb

input:

32500 94033
5330 27480
6016 11178
29267 1197
5789 21547
23714 25915
15710 17107
16950 10411
13998 15431
11106 14400
927 25530
18890 3967
11978 17027
2434 683
20135 5988
10802 22709
29179 6971
24499 12498
10977 795
30366 3120
4051 21131
25859 15273
19124 10952
14475 11243
11810 1265
7311 2036
385 158...

output:

? 30795 20050
? 20050 15862
? 15862 1668
? 1668 22076
? 22076 17815
? 17815 28912
? 28912 25379
? 25379 11968
? 11968 31990
? 31990 14693
? 14693 6640
? 6640 17937
? 17937 7124
? 7124 29226
? 29226 28558
? 28558 18098
? 18098 4847
? 4847 4189
? 4189 20645
? 20645 10285
? 10285 9077
? 9077 26952
? 26...

result:

ok Correct answer

Test #4:

score: 0
Accepted
time: 1103ms
memory: 19328kb

input:

36000 90053
30475 13651
22999 24861
5951 9742
17517 23989
18959 6538
19553 11038
25437 54
12236 7008
3442 9514
7624 30567
5054 23318
21048 4679
6580 31177
12845 5309
31293 10448
25535 15480
7341 8165
23069 17566
25018 15241
706 18925
8811 14849
30704 24536
10309 25098
27442 20863
33703 13600
17627 2...

output:

? 27417 18458
? 18458 24103
? 24103 35222
? 35222 31782
? 31782 18244
? 18244 17499
? 17499 23130
? 23130 30211
? 30211 27504
? 30211 12381
? 12381 19943
? 19943 21585
? 21585 22431
? 22431 1814
? 1814 10682
? 10682 20944
? 20944 21255
? 21255 30600
? 30600 19301
? 19301 1165
? 1165 9992
? 9992 3272...

result:

ok Correct answer

Test #5:

score: 0
Accepted
time: 992ms
memory: 17272kb

input:

1000 90666
693 375
340 106
283 416
832 864
597 973
285 987
662 444
384 672
508 47
794 463
24 133
230 954
48 584
540 707
87 218
264 845
586 992
247 597
654 706
306 812
294 386
533 120
999 942
879 981
203 78
678 341
534 577
612 281
509 41
199 567
311 661
936 211
693 750
44 7
334 375
224 859
393 228
45...

output:

? 555 880
? 880 40
? 555 429
? 429 757
? 757 569
? 569 651
? 757 774
? 774 180
? 757 651
? 651 180
? 774 104
? 104 602
? 602 758
? 758 365
? 104 643
? 643 331
? 331 15
? 331 904
? 904 275
? 275 442
? 442 837
? 837 390
? 758 911
? 643 365
? 365 911
? 911 272
? 911 903
? 903 628
? 628 428
? 428 236
? ...

result:

ok Correct answer

Test #6:

score: 0
Accepted
time: 952ms
memory: 18764kb

input:

10000 99884
6716 7602
5917 3638
9554 2505
7904 6893
8915 7173
1819 2730
4845 9714
7482 4797
2183 781
5041 5987
9537 993
8484 3337
346 3291
6062 7613
1286 5687
9991 498
7433 4952
9597 5802
1137 8805
8083 6147
4717 5900
3773 118
3752 9992
9395 8969
1966 9404
2766 6267
1893 404
4181 5691
4387 8020
7127...

output:

? 7209 3286
? 3286 5533
? 3286 275
? 5533 8509
? 275 2954
? 2954 3567
? 3567 9762
? 8509 8293
? 8293 8990
? 8990 6487
? 6487 9659
? 9659 424
? 5533 9660
? 9660 5929
? 9660 3459
? 3459 2255
? 9762 4517
? 4517 9156
? 9156 8726
? 8726 3095
? 3095 432
? 432 5379
? 5379 7849
? 7849 3361
? 5929 7576
? 757...

result:

ok Correct answer

Test #7:

score: 0
Accepted
time: 931ms
memory: 18436kb

input:

40000 99987
234 24171
17105 36233
5533 12466
38544 18454
35367 21436
9444 8046
11745 26615
32997 35770
11004 25416
39988 7619
30595 16666
38275 20547
26230 11888
29603 5464
18435 37346
10469 19694
24129 29204
5336 37947
86 38735
31032 21467
14175 37267
38749 6213
38615 13802
15736 4270
25539 38284
1...

output:

? 19062 27908
? 27908 22029
? 22029 20140
? 22029 39181
? 20140 1478
? 1478 8191
? 8191 567
? 19062 21807
? 21807 20093
? 21807 37248
? 37248 17471
? 39181 405
? 405 18304
? 19062 21953
? 20093 39920
? 39920 29746
? 29746 39368
? 39368 19537
? 19537 33224
? 33224 16727
? 16727 38654
? 18304 9978
? 9...

result:

ok Correct answer