# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
121298 | WhipppedCream | Flood (IOI07_flood) | C++17 | 0 ms | 0 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 <bits/stdc++.h>
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")
using namespace std;
#define X first
#define Y second
#define pb push_back
typedef pair<int, int> ii;
typedef long long ll;
const int maxn = 1e5+5;
const int maxm = 2e5+5;
vector< ii > pts[maxn];
map< ii, int> rev;
int n, m;
int px[maxn], py[maxn];
int wu[maxm], wv[maxm];
int used[2*maxm];
int detdir(int u, int v)
{
if(px[u] == px[v])
{
if(py[u]< py[v]) return 1;
return 3;
}
if(px[u]< px[v]) return 0;
return 2;
}
int del[maxm];
int used[maxm];
int trav(int u, int from, int dir, int face)
{
if(u == from) return true;
ii out[4];
for(int i = 0; i< 4; i++) out[i] = {-1, -1};
for(auto kk : pts[u])
{
int v = kk.X, id = kk.Y;
out[(detdir(u, v)+1-dir+4)%4] = kk;
}
int st = -1;
for(int i = 0; i< 4; i++)
{
int v = out[i].X, id = out[i].Y;
if(v == -1) continue;
if(used[id]) continue;
st = i;
break;
}
if(st == -1) return false;
int v = out[st].X, id = out[st].Y;
used[id] = true;
if(trav(v, from, detdir(u, v), face))
{
del[id] = true;
return true;
}
return false;
}
vector<int> adj[2*maxm];
int dist[2*maxn];
bool cmp(int a, int b)
{
return px[wu[a]]< px[wu[b]];
}
int main()
{
scanf("%d", &n);
for(int i = 1; i<= n; i++)
{
scanf("%d %d", &px[i], &py[i]);
rev[ii(px[i], py[i])] = i;
}
for(int i = 1; i<= m; i++)
{
scanf("%d %d", &wu[i], &wv[i]);
if(px[wu[i]] == px[wv[i]])
{
if(py[wu[i]]> py[wv[i]]) swap(wu[i], wv[i]);
}
if(py[wu[i]] == py[wv[i]])
{
if(px[wu[i]]> px[wv[i]]) swap(wu[i], wv[i]);
}
}
vector<int> edges;
for(int i = 1; i<= m; i++)
{
pts[wu[i]].pb(ii(wv[i], i));
edges.pb(i);
}
sort(edges.begin(), edges.end(), cmp);
vector<int> res;
for(int i : edges)
{
if(used[i]) continue;
int u = wu[i], v = wv[i];
trav(v, u, detdir(u, v), 1);
}
for(int i = 1; i<= m; i++)
{
if(!del[i]) res.pb(i);
}
printf("%d\n", res.size());
for(int x : res) printf("%d\n", x);
}