# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
254898 |
2020-07-30T19:53:52 Z |
Lawliet |
Bridges (APIO19_bridges) |
C++17 |
|
3000 ms |
11676 KB |
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int MAXN = 100010;
int n, m, q;
int raizQ;
int ans[MAXN];
int indInside[MAXN];
int lastWeight[MAXN];
int anc[MAXN], sz[MAXN];
int U[MAXN], V[MAXN], W[MAXN];
bool mark[MAXN];
bool insideBlock[MAXN];
vector<int> adj[MAXN];
vector<pii> queries;
vector< pair<int,pii> > sweep;
int find(int cur)
{
if( anc[cur] == cur ) return cur;
return anc[cur] = find( anc[cur] );
}
void join(int i, int j)
{
i = find(i); j = find(j);
if( i == j ) return;
if( sz[i] < sz[j] )
swap( i , j );
anc[j] = i;
sz[i] += sz[j];
}
bool isUpdate(int i)
{
int val = queries[i].second;
return ( val > 0 );
}
void initDSU()
{
for(int i = 1 ; i <= n ; i++)
sz[i] = 1, anc[i] = i;
}
int DFS(int cur)
{
mark[cur] = true;
int ans = sz[cur];
for(int i = 0 ; i < (int)adj[cur].size() ; i++)
if( !mark[ adj[cur][i] ] ) ans += DFS( adj[cur][i] );
return ans;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i = 1 ; i <= m ; i++)
scanf("%d %d %d",&U[i],&V[i],&W[i]);
scanf("%d",&q);
raizQ = 1200;
for(int i = 1 ; i <= q ; i++)
{
int type;
scanf("%d",&type);
if( type == 1 )
{
int edge, newW;
scanf("%d %d",&edge,&newW);
queries.push_back( { newW , edge } );
}
if( type == 2 )
{
int s, maxW;
scanf("%d %d",&s,&maxW);
queries.push_back( { maxW , -s } );
}
ans[i - 1] = -1;
}
int lastBlock = (q - 1)/raizQ;
for(int block = 0 ; block <= lastBlock ; block++)
{
//printf("+============================+ Processando bloco %d\n",block);
int L = block*raizQ;
int R = (block + 1)*raizQ - 1;
R = min( R , q - 1 );
for(int i = 1 ; i <= m ; i++)
{
lastWeight[i] = W[i];
insideBlock[i] = false;
}
vector<int> inside;
for(int i = L ; i <= R ; i++)
{
if( isUpdate( i ) )
{
int edge = queries[i].second;
if( !insideBlock[edge] )
{
indInside[edge] = (int)inside.size();
//printf(".. edge = %d\n",edge);
insideBlock[edge] = true;
inside.push_back( edge );
}
}
}
for(int i = 0 ; i < L ; i++)
{
if( isUpdate( i ) )
{
int newW = queries[i].first;
int edge = queries[i].second;
lastWeight[edge] = newW;
}
}
sweep.clear();
for(int i = 1 ; i <= m ; i++)
if( !insideBlock[i] ) sweep.push_back( { lastWeight[i] , { U[i] , V[i] } } );//, printf("Adicionei %d: %d -> %d com peso %d\n",i,U[i],V[i],lastWeight[i]);
for(int i = L ; i <= R ; i++)
{
if( !isUpdate( i ) )
{
int maxW = queries[i].first;
int source = -queries[i].second;
//printf("Achei query %d %d\n",source,maxW);
sweep.push_back( { maxW , { -source , i } } );
}
}
//printf("\n\n\n");
//printf("------- Sweep Algorithm\n");
sort( sweep.begin() , sweep.end() );
reverse( sweep.begin() , sweep.end() );
initDSU();
for(int i = 0 ; i < (int)sweep.size() ; i++)
{
int type = 0;
if( sweep[i].second.first < 0 ) type = 1;
if( type == 0 )//Update
{
int curU = sweep[i].second.first;
int curV = sweep[i].second.second;
//printf("Juntei %d %d\n",curU,curV);
join( curU , curV );
}
if( type == 1 )
{
int maxW = sweep[i].first;
int ind = sweep[i].second.second;
int source = -sweep[i].second.first;
//printf("Respondendo query maxW = %d source = %d ind = %d\n",maxW,source,ind);
vector<int> weightInside;
for(int j = 0 ; j < (int)inside.size() ; j++)
weightInside.push_back( lastWeight[ inside[j] ] );
for(int j = L ; j <= ind ; j++)
{
if( isUpdate( j ) )
{
int newW = queries[j].first;
int edge = queries[j].second;
weightInside[ indInside[edge] ] = newW;
}
}
for(int j = 0 ; j < (int)inside.size() ; j++)
{
//printf("...... Tentando colocar %d -> %d com peso %d\n",U[ inside[j] ],V[ inside[j] ],weightInside[j]);
if( weightInside[j] >= maxW )
{
int curU = find( U[ inside[j] ] );
int curV = find( V[ inside[j] ] );
adj[curU].push_back( curV );
adj[curV].push_back( curU );
}
}
ans[ind] = DFS( find(source) );
mark[ find(source) ] = false;
for(int j = 0 ; j < (int)inside.size() ; j++)
{
if( weightInside[j] >= maxW )
{
int curU = find( U[ inside[j] ] );
int curV = find( V[ inside[j] ] );
mark[curU] = mark[curV] = false;
adj[curU].clear();
adj[curV].clear();
}
}
}
}
}
for(int i = 0 ; i < q ; i++)
if( ans[i] != -1 ) printf("%d\n",ans[i]);
}
Compilation message
bridges.cpp: In function 'int main()':
bridges.cpp:69:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d",&n,&m);
~~~~~^~~~~~~~~~~~~~~
bridges.cpp:72:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d %d",&U[i],&V[i],&W[i]);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:74:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&q);
~~~~~^~~~~~~~~
bridges.cpp:80:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&type);
~~~~~^~~~~~~~~~~~
bridges.cpp:85:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d",&edge,&newW);
~~~~~^~~~~~~~~~~~~~~~~~~~~
bridges.cpp:92:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d",&s,&maxW);
~~~~~^~~~~~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
2688 KB |
Output is correct |
2 |
Correct |
2 ms |
2688 KB |
Output is correct |
3 |
Correct |
94 ms |
3192 KB |
Output is correct |
4 |
Correct |
12 ms |
3072 KB |
Output is correct |
5 |
Correct |
42 ms |
3072 KB |
Output is correct |
6 |
Correct |
39 ms |
3192 KB |
Output is correct |
7 |
Correct |
40 ms |
3072 KB |
Output is correct |
8 |
Correct |
39 ms |
3072 KB |
Output is correct |
9 |
Correct |
45 ms |
3072 KB |
Output is correct |
10 |
Correct |
41 ms |
3192 KB |
Output is correct |
11 |
Correct |
40 ms |
3072 KB |
Output is correct |
12 |
Correct |
41 ms |
3072 KB |
Output is correct |
13 |
Correct |
48 ms |
3072 KB |
Output is correct |
14 |
Correct |
49 ms |
3072 KB |
Output is correct |
15 |
Correct |
44 ms |
3192 KB |
Output is correct |
16 |
Correct |
43 ms |
3072 KB |
Output is correct |
17 |
Correct |
44 ms |
3072 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2369 ms |
7608 KB |
Output is correct |
2 |
Correct |
2363 ms |
7520 KB |
Output is correct |
3 |
Correct |
2356 ms |
7520 KB |
Output is correct |
4 |
Correct |
2325 ms |
7576 KB |
Output is correct |
5 |
Correct |
2348 ms |
7580 KB |
Output is correct |
6 |
Execution timed out |
3056 ms |
6764 KB |
Time limit exceeded |
7 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2122 ms |
6312 KB |
Output is correct |
2 |
Correct |
2204 ms |
4732 KB |
Output is correct |
3 |
Correct |
2870 ms |
6376 KB |
Output is correct |
4 |
Correct |
2202 ms |
6312 KB |
Output is correct |
5 |
Correct |
111 ms |
4204 KB |
Output is correct |
6 |
Correct |
2527 ms |
6312 KB |
Output is correct |
7 |
Correct |
1898 ms |
6320 KB |
Output is correct |
8 |
Correct |
1709 ms |
6368 KB |
Output is correct |
9 |
Correct |
1147 ms |
6376 KB |
Output is correct |
10 |
Correct |
953 ms |
6252 KB |
Output is correct |
11 |
Correct |
1236 ms |
6444 KB |
Output is correct |
12 |
Correct |
987 ms |
6376 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1190 ms |
8360 KB |
Output is correct |
2 |
Correct |
114 ms |
5532 KB |
Output is correct |
3 |
Correct |
158 ms |
8048 KB |
Output is correct |
4 |
Correct |
176 ms |
8048 KB |
Output is correct |
5 |
Correct |
1452 ms |
10788 KB |
Output is correct |
6 |
Correct |
1202 ms |
11616 KB |
Output is correct |
7 |
Correct |
1357 ms |
10768 KB |
Output is correct |
8 |
Correct |
660 ms |
9448 KB |
Output is correct |
9 |
Correct |
661 ms |
9580 KB |
Output is correct |
10 |
Correct |
646 ms |
9352 KB |
Output is correct |
11 |
Correct |
995 ms |
10712 KB |
Output is correct |
12 |
Correct |
977 ms |
10728 KB |
Output is correct |
13 |
Correct |
978 ms |
10720 KB |
Output is correct |
14 |
Correct |
1381 ms |
10764 KB |
Output is correct |
15 |
Correct |
1352 ms |
10848 KB |
Output is correct |
16 |
Correct |
1237 ms |
11488 KB |
Output is correct |
17 |
Correct |
1247 ms |
11676 KB |
Output is correct |
18 |
Correct |
1224 ms |
11492 KB |
Output is correct |
19 |
Correct |
1226 ms |
11488 KB |
Output is correct |
20 |
Correct |
1078 ms |
11232 KB |
Output is correct |
21 |
Correct |
1083 ms |
11152 KB |
Output is correct |
22 |
Correct |
1188 ms |
11520 KB |
Output is correct |
23 |
Correct |
1132 ms |
10080 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2369 ms |
7608 KB |
Output is correct |
2 |
Correct |
2363 ms |
7520 KB |
Output is correct |
3 |
Correct |
2356 ms |
7520 KB |
Output is correct |
4 |
Correct |
2325 ms |
7576 KB |
Output is correct |
5 |
Correct |
2348 ms |
7580 KB |
Output is correct |
6 |
Execution timed out |
3056 ms |
6764 KB |
Time limit exceeded |
7 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
2688 KB |
Output is correct |
2 |
Correct |
2 ms |
2688 KB |
Output is correct |
3 |
Correct |
94 ms |
3192 KB |
Output is correct |
4 |
Correct |
12 ms |
3072 KB |
Output is correct |
5 |
Correct |
42 ms |
3072 KB |
Output is correct |
6 |
Correct |
39 ms |
3192 KB |
Output is correct |
7 |
Correct |
40 ms |
3072 KB |
Output is correct |
8 |
Correct |
39 ms |
3072 KB |
Output is correct |
9 |
Correct |
45 ms |
3072 KB |
Output is correct |
10 |
Correct |
41 ms |
3192 KB |
Output is correct |
11 |
Correct |
40 ms |
3072 KB |
Output is correct |
12 |
Correct |
41 ms |
3072 KB |
Output is correct |
13 |
Correct |
48 ms |
3072 KB |
Output is correct |
14 |
Correct |
49 ms |
3072 KB |
Output is correct |
15 |
Correct |
44 ms |
3192 KB |
Output is correct |
16 |
Correct |
43 ms |
3072 KB |
Output is correct |
17 |
Correct |
44 ms |
3072 KB |
Output is correct |
18 |
Correct |
2369 ms |
7608 KB |
Output is correct |
19 |
Correct |
2363 ms |
7520 KB |
Output is correct |
20 |
Correct |
2356 ms |
7520 KB |
Output is correct |
21 |
Correct |
2325 ms |
7576 KB |
Output is correct |
22 |
Correct |
2348 ms |
7580 KB |
Output is correct |
23 |
Execution timed out |
3056 ms |
6764 KB |
Time limit exceeded |
24 |
Halted |
0 ms |
0 KB |
- |