# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
134011 | dragonslayerit | Flood (IOI07_flood) | C++14 | 102 ms | 10636 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 <cstdio>
#include <tuple>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cassert>
const int INF=1e9+7;
struct Point{
int x,y;
Point():x(0),y(0){
}
Point(int x,int y):x(x),y(y){
}
void read(){
scanf("%d %d",&x,&y);
}
bool operator<(Point p)const{
return std::tie(y,x)<std::tie(p.y,p.x);
}
Point operator-(Point p)const{
return Point(x-p.x,y-p.y);
}
double arg()const{
return std::atan2(y,x);
}
}ps[100005];
int elist[400005];
int head[100005];
int prev[100005];
int elist_size=0;
int next[400005];
std::vector<int> dual[100005];
int* cc=elist;
int cc_cnt=0;
int dist[100005];
int first[400005];
int q[100005];
int qh=0,qt=0;
void add(int a){
elist[elist_size]=a;
prev[elist_size]=head[a];
head[a]=elist_size++;
}
int main(){
int N;
scanf("%d",&N);
for(int i=0;i<N;i++){
ps[i].read();
}
std::fill(head,head+N,-1);
int W;
scanf("%d",&W);
for(int i=0;i<W;i++){
int A,B;
scanf("%d %d",&A,&B);
A--,B--;
add(A),add(B);
}
for(int i=0;i<N;i++){
std::vector<std::pair<double,int> > adj;
for(int e=head[i];e!=-1;e=prev[e]){
adj.push_back({(ps[elist[e]]-ps[i]).arg(),e});
}
std::sort(adj.begin(),adj.end());
first[i]=adj[0].second;
/*
std::sort(adj[i].begin(),adj[i].end(),[i](int x,int y){
return (ps[elist[x]]-ps[i]).arg()<
(ps[elist[y]]-ps[i]).arg();});
*/
for(int j=0;j<adj.size();j++){
int k=(j+1)%adj.size();
next[adj[j].second]=adj[k].second^1;
}
}
//elist expires
//cc begins
std::fill(cc,cc+W*2,-1);
for(int i=0;i<W*2;i++){
if(cc[i]==-1){
for(int x=i;cc[x]==-1;x=next[x]){
cc[x]=cc_cnt;
}
cc_cnt++;
}
}
//printf("DUAL: %d vertices\n",cc_cnt);
for(int i=0;i<W*2;i++){
//printf("%d => %d: %d => %d\n",a+1,b+1,cc[i],cc[i^1]);
dual[cc[i]].push_back(cc[i^1]);
}
for(int i=0;i<N;i++){
ps[i].x=i;
}
std::sort(ps,ps+N);
//std::queue<int> q;
std::fill(dist,dist+N,INF);
for(int i=0;i<N;i++){
int root=cc[first[ps[i].x]^1];//cc[adj[ps[i].x][0]^1];
if(dist[root]!=INF) continue;
q[qh++]=root;
dist[root]=0;
while(qh!=qt){
int x=q[qt++];
for(int y:dual[x]){
if(dist[y]==INF){
dist[y]=dist[x]+1;
q[qh++]=y;
}
}
}
}
int survive=0;
for(int i=0;i<W;i++){
if(dist[cc[i*2]]==dist[cc[i*2+1]]){
survive++;
}
}
printf("%d\n",survive);
for(int i=0;i<W;i++){
if(dist[cc[i*2]]==dist[cc[i*2+1]]){
printf("%d\n",i+1);
}
}
}
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... |