# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
238103 | m3r8 | Flood (IOI07_flood) | C++14 | 365 ms | 65536 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 <stdio.h>
#include <set>
#include <utility>
#include <vector>
#include <queue>
#define N 100100
#define W N*2
#define ii std::pair<int,int>
ii pp[N];
ii wl[W];
std::vector<int> adj[N];
unsigned short zone[N<<2];
unsigned short path[N];
std::set<unsigned short> sadj[W];
bool usedW[W];
bool used[N];
int tbl[4] = {2,1,0,3};
int cnt = 1;
int ccnt = 0;
std::queue<ii> que;
std::vector<int> erg;
void cc(int v){
ccnt = 0;
que.push({v,0});
while(que.size()){
ii akk = que.front();que.pop();
used[akk.first] = 1;
for(auto i: adj[akk.first]){
if(akk.first == wl[i].first)usedW[ccnt++]=i;
if(!used[wl[i].first]){
que.push({wl[i].first,0});
};
if(!used[wl[i].second]){
que.push({wl[i].second,0});
};
};
};
};
void ccp(int ip){
int p;
int on;
int a,b;
int tprev;
int tnxt;
int prev;
int nxt;
int idx;
que.push({ip,0});
while(que.size()){
ii akk = que.front();que.pop();
zone[akk.first] = cnt;
p = akk.first >> 2;
on = akk.first % 4;
tprev = (on+3)%4;
tnxt = (on+1)%4;
prev = tprev + (p << 2);
nxt = tnxt + (p << 2);
for(auto i: adj[p]){
idx = wl[i].first;
if(wl[i].first == p)idx = wl[i].second;
a = pp[idx].first - pp[p].first == 0;
if(a)b = pp[idx].second - pp[p].second < 0;
else b = pp[idx].first - pp[p].first < 0;
a = b * 2 + a;
if(tbl[on] == a){
nxt = tprev + (idx << 2);
};
if((tbl[on] + 1)%4 == a){
prev = tnxt + (idx << 2);
};
};
if(!zone[prev])que.push({prev,0});
if(!zone[nxt])que.push({nxt,0});
};
};
int main(void){
int n;
scanf("%d",&n);
for(int i = 0;i<n;i++){
scanf("%d %d",&(pp[i].first),&(pp[i].second));
};
int w;
scanf("%d",&w);
int a,b;
for(int i = 0;i<w;i++){
scanf("%d %d",&a,&b);
a--;
b--;
adj[a].push_back(i);
adj[b].push_back(i);
wl[i].first = a;
wl[i].second = b;
if(pp[a] > pp[b]){
wl[i].first = b;
wl[i].second = a;
};
};
int mnid;
ii mn;
int prcnt = 1;
for(int i = 0;i<n;i++){
if(!used[i]){
cc(i);
if(ccnt){
mn = pp[wl[usedW[0]].first];
mnid = wl[usedW[0]].first;
for(int j = 0;j<ccnt;j++){
int pid = wl[usedW[j]].first;
if(pp[pid] < mn){
mn = pp[pid];
mnid = pid;
};
for(int k = 0;k<4;k++){
if(!zone[k + (pid << 2)]){
ccp(k + (pid << 2));
cnt++;
};
};
pid = wl[usedW[j]].second;
if(pp[pid] < mn){
mn = pp[pid];
mnid = pid;
};
for(int k = 0;k<4;k++){
if(!zone[k + (pid << 2)]){
ccp(k + (pid << 2));
cnt++;
};
};
};
for(int k = 0;k<ccnt;k++){
int j = usedW[k];
if(pp[wl[j].second].second - pp[wl[j].first].second == 0){
sadj[zone[2 + (wl[j].first << 2)]].insert(zone[3 + (wl[j].first << 2)]);
sadj[zone[3 + (wl[j].first << 2)]].insert(zone[2 + (wl[j].first << 2)]);
//if(zone[2 + (wl[j].first << 2)] != zone[1 + (wl[j].second << 2)])printf("error\n");
//if(zone[3 + (wl[j].first << 2)] != zone[0 + (wl[j].second << 2)])printf("error\n");
}else{
sadj[zone[1 + (wl[j].first << 2)]].insert(zone[2 + (wl[j].first << 2)]);
sadj[zone[2 + (wl[j].first << 2)]].insert(zone[1 + (wl[j].first << 2)]);
//if(zone[1 + (wl[j].first << 2)] != zone[0 + (wl[j].second << 2)])printf("error\n");
//if(zone[2 + (wl[j].first << 2)] != zone[3 + (wl[j].second << 2)])printf("error\n");
};
};
que.push({zone[(mnid << 2)],1});
path[zone[(mnid << 2)]] = 1;
while(que.size()){
ii akk = que.front();que.pop();
for(auto nxt: sadj[akk.first]){
if(!path[nxt]){
path[nxt] = akk.second + 1;
que.push({nxt,akk.second + 1});
};
};
};
for(int j = prcnt;j<cnt;j++){
sadj[j].clear();
};
prcnt = cnt;
};
};
};
for(int i = 0;i<w;i++){
if(pp[wl[i].second].second - pp[wl[i].first].second == 0){
if(path[zone[2 + (wl[i].first << 2)]] == path[zone[3 + (wl[i].first << 2)]]){
erg.push_back(i+1);
};
}else{
if(path[zone[1 + (wl[i].first << 2)]] == path[zone[2 + (wl[i].first << 2)]]){
erg.push_back(i+1);
};
};
};
printf("%d\n",erg.size());
for(auto i : erg){
printf("%d\n",i);
};
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... |