# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
51612 | model_code | Flood (IOI07_flood) | C++98 | 158 ms | 18208 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int n, m;
typedef long long llint;
typedef pair<int,int> par;
const int dx[4] = { 1, 0, -1, 0 };
const int dy[4] = { 0, -1, 0, 1 };
struct tocka {
int x, y;
int komponenta;
par link[4];
int regija[4];
tocka() {
komponenta = -1;
for( int i = 0; i < 4; ++i ) link[i] = par(-1,-1);
for( int i = 0; i < 4; ++i ) regija[i] = -1;
}
};
vector<tocka> tocke;
struct regija {
int vrijeme_poplave;
llint povrsina;
vector<int> niz;
regija() {
povrsina = 0;
vrijeme_poplave = -1;
}
};
int smjer( int a, int b ) {
if( tocke[a].y == tocke[b].y )
if( tocke[a].x < tocke[b].x ) return 0; else return 2;
else
if( tocke[a].y > tocke[b].y ) return 1; else return 3;
}
void bfs( int x, int k ) {
queue<int> Q;
tocke[x].komponenta = k;
for( Q.push( x ); !Q.empty(); Q.pop() ) {
x = Q.front();
for( int i = 0; i < 4; ++i ) {
int y = tocke[x].link[i].first;
if( y != -1 && tocke[y].komponenta == -1 ) {
tocke[y].komponenta = k;
Q.push( y );
}
}
}
}
void obidji( int i, int j, regija &R, int id ) {
R.niz.push_back( i );
while( tocke[i].regija[j] == -1 ) {
tocke[i].regija[j] = id;
int k = tocke[i].link[j].first;
R.povrsina += (tocke[i].x - tocke[k].x) * (llint) tocke[i].y;
R.niz.push_back( k );
i = k;
for( j = (j+3)%4; tocke[i].link[j].first == -1; j = (j+1)%4 );
}
if(R.povrsina < -R.povrsina) R.povrsina *= -1;
}
int main( void ) {
scanf( "%d", &n );
for( int i = 0; i < n; ++i ) {
tocka t;
scanf( "%d%d", &t.x, &t.y );
tocke.push_back( t );
}
scanf( "%d", &m );
for( int i = 0; i < m; ++i ) {
int a, b;
scanf( "%d%d", &a, &b ); --a; --b;
tocke[a].link[smjer(a,b)] = par(b,i);
tocke[b].link[smjer(b,a)] = par(a,i);
}
int broj_komponenti = 0;
for( int i = 0; i < n; ++i )
if( tocke[i].komponenta == -1 )
bfs( i, broj_komponenti++ );
vector<int> vanjska_regija( broj_komponenti, -1 );
vector<regija> regije;
for( int i = 0; i < n; ++i )
for( int j = 0; j < 4; ++j )
if( tocke[i].link[j].first != -1 && tocke[i].regija[j] == -1 ) {
int R = regije.size();
regije.push_back( regija() );
obidji( i, j, regije[R], R );
int &vanjska = vanjska_regija[ tocke[i].komponenta ];
if( vanjska == -1 ) vanjska = R;
if( regije[R].povrsina > regije[vanjska].povrsina ) vanjska = R;
}
queue<int> Q;
for( int i = 0; i < broj_komponenti; ++i ) {
if( vanjska_regija[i] == -1 ) continue;
regije[ vanjska_regija[i] ].vrijeme_poplave = 0;
Q.push( vanjska_regija[i] );
}
for( ; !Q.empty(); Q.pop() ) {
int R = Q.front();
for( int i = 1; i < regije[R].niz.size(); ++i ) {
int a = regije[R].niz[i];
int b = regije[R].niz[i-1];
int S = tocke[a].regija[smjer(a,b)];
if( regije[S].vrijeme_poplave == -1 ) {
regije[S].vrijeme_poplave = regije[R].vrijeme_poplave + 1;
Q.push( S );
}
}
}
vector<int> rjesenje;
for( int a = 0; a < n; ++a )
for( int i = 0; i < 4; ++i ) {
int b = tocke[a].link[i].first;
if( b == -1 || b < a ) continue;
if( regije[tocke[a].regija[smjer(a,b)]].vrijeme_poplave ==
regije[tocke[b].regija[smjer(b,a)]].vrijeme_poplave )
rjesenje.push_back( tocke[a].link[i].second );
}
printf( "%d\n", rjesenje.size() );
for( vector<int>::iterator it = rjesenje.begin(); it != rjesenje.end(); ++it )
printf( "%d\n", *it + 1 );
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |