답안 #796134

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
796134 2023-07-28T06:50:23 Z Khizri 분수 공원 (IOI21_parks) C++17
5 / 100
1959 ms 64024 KB
#include "parks.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define F first
#define S second
#define INF 1e18
#define all(v) (v).begin(),(v).end()
#define rall(v) (v).rbegin(),(v).rend()
#define pii pair<int,int>
#define pll pair<ll,ll>
#define OK cout<<"Ok"<<endl;
#define MOD (ll)(1e9+7)
const int mxn=2e5+5;
int n,x[mxn],y[mxn],p[mxn],sz[mxn];
int ax[4]={1,1,-1,-1};
int ay[4]={-1,1,1,-1};
vector<pii>vt;
map<pii,int>mp;
int fnd(int u){
    if(p[u]==u) return u;
    return p[u]=fnd(p[u]);
}
void Union(int u,int v){
    u=fnd(u);
    v=fnd(v);
    if(u!=v){
        if(sz[u]>sz[v]) swap(u,v);
        sz[u]+=sz[v];
        p[v]=u;
    }
}
int construct_roads(vector<int> xx, vector<int> yy) {
    n=xx.size();
    if(n==1){
        build({},{},{},{});
        return 1;
    }
    for(int i=0;i<n;i++){
        vt.pb({xx[i],yy[i]});
        mp[{xx[i],yy[i]}]=i+1;
        x[i+1]=xx[i];
        y[i+1]=yy[i];
    }
    //for(int i=1;i<=n;i++){
        //if(!mp[{x[i],y[i]+2}]&&!mp[{x[i],y[i]-2}]&&!mp[{x[i]+2,y[i]}]&&!mp[{x[i]-2,y[i]}]) return 0;
    //}
    sort(all(vt));
    //for(int i=1;i<n;i++){
        //if(abs(vt[i].F-vt[i-1].F)>2||abs(vt[i].S-vt[i-1].S)>2) return 0;
    //}
    set<pii>st;
    for(int i=1;i<=n;i++){
        st.insert({x[i]-1,y[i]-1});
        st.insert({x[i]+1,y[i]-1});
        st.insert({x[i]-1,y[i]+1});
        st.insert({x[i]+1,y[i]+1});
    }
    for(int i=1;i<=n;i++){
        p[i]=i;
        sz[i]=1;
    }
    vector<int>idxl,idxr,posl,posr;
    int cnt=n-1;
    int say=10;
    while(cnt&&say--){
        auto cur=st.begin();
        while(cur!=st.end()){
            auto it=cur++;
            int l=it->F;
            int r=it->S;
            set<int>dif;
            vector<int>idx;
            //cout<<"OK"<<endl;
            for(int i=0;i<4;i++){
                int u=l+ax[i],v=r+ay[i];
                int node=mp[{u,v}];
                if(node>0&&!dif.count(fnd(node))){
                    dif.insert(fnd(node));
                    idx.pb(node);
                }
            }
            //cout<<dif.size()<<endl;
            if(dif.size()==1){
                st.erase(it);
                continue;
            }
            if(dif.size()>2) continue;
            int q=-1,q2=1;
            for(int i=0;i<idx.size();i++){
                for(int j=i+1;j<idx.size();j++){
                    if(abs(x[idx[i]]-x[idx[j]])+abs(y[idx[i]]-y[idx[j]])==2){
                        q=i,
                        q2=j;
                        break;
                    }
                }
            }
            if(q==-1){
                st.erase(it);
                continue;
            }
            idxl.pb(idx[q]-1);
            idxr.pb(idx[q2]-1);
            //cout<<idx[0]<<' '<<idx[1]<<endl;
            posl.pb(l);
            posr.pb(r);
            Union(idx[q],idx[q2]);
            cnt--;
            st.erase(it);
        }
        //cnt--;
    }
    say=10;
    while(cnt&&st.size()){
        auto cur=st.begin();
        while(cur!=st.end()){
            auto it=cur++;
            int l=it->F;
            int r=it->S;
            set<int>dif;
            vector<int>idx;
            //cout<<"OK"<<endl;
            for(int i=0;i<4;i++){
                int u=l+ax[i],v=r+ay[i];
                int node=mp[{u,v}];
                if(node>0&&!dif.count(fnd(node))){
                    dif.insert(fnd(node));
                    idx.pb(node);
                }
            }
            //cout<<dif.size()<<endl;
            if(dif.size()==1){
                st.erase(it);
                continue;
            }
            int q=-1,q2=1;
            for(int i=0;i<idx.size();i++){
                for(int j=i+1;j<idx.size();j++){
                    if(abs(x[idx[i]]-x[idx[j]])+abs(y[idx[i]]-y[idx[j]])==2){
                        q=i,
                        q2=j;
                        break;
                    }
                }
            }
            if(q==-1){
                st.erase(it);
                continue;
            }
            idxl.pb(idx[q]-1);
            idxr.pb(idx[q2]-1);
            //cout<<idx[0]<<' '<<idx[1]<<endl;
            posl.pb(l);
            posr.pb(r);
            Union(idx[q],idx[q2]);
            cnt--;
            st.erase(it);
        }
        //cnt--;
    }
    if(cnt) return 0;
    build(idxl,idxr,posl,posr);
    return 1;
}
/*
cd "c:\Users\User\Desktop\parks (4)\cpp\" ; if ($?) { g++ parks.cpp grader.cpp -o parks } ; if ($?) { .\a.exe }
5
4 4 
4 6 
6 4
4 2
2 4
*/

Compilation message

parks.cpp: In function 'int construct_roads(std::vector<int>, std::vector<int>)':
parks.cpp:91:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |             for(int i=0;i<idx.size();i++){
      |                         ~^~~~~~~~~~~
parks.cpp:92:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |                 for(int j=i+1;j<idx.size();j++){
      |                               ~^~~~~~~~~~~
parks.cpp:139:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  139 |             for(int i=0;i<idx.size();i++){
      |                         ~^~~~~~~~~~~
parks.cpp:140:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  140 |                 for(int j=i+1;j<idx.size();j++){
      |                               ~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 316 KB Output is correct
2 Correct 1 ms 308 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 284 ms 33696 KB Output is correct
10 Correct 19 ms 3524 KB Output is correct
11 Correct 144 ms 16696 KB Output is correct
12 Correct 28 ms 4984 KB Output is correct
13 Correct 85 ms 13100 KB Output is correct
14 Correct 2 ms 596 KB Output is correct
15 Correct 4 ms 944 KB Output is correct
16 Correct 283 ms 33608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 316 KB Output is correct
2 Correct 1 ms 308 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 284 ms 33696 KB Output is correct
10 Correct 19 ms 3524 KB Output is correct
11 Correct 144 ms 16696 KB Output is correct
12 Correct 28 ms 4984 KB Output is correct
13 Correct 85 ms 13100 KB Output is correct
14 Correct 2 ms 596 KB Output is correct
15 Correct 4 ms 944 KB Output is correct
16 Correct 283 ms 33608 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 1 ms 316 KB Output is correct
19 Correct 1 ms 312 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
22 Correct 1 ms 212 KB Output is correct
23 Correct 625 ms 54412 KB Output is correct
24 Incorrect 1 ms 212 KB Solution announced impossible, but it is possible.
25 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 316 KB Output is correct
2 Correct 1 ms 308 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 284 ms 33696 KB Output is correct
10 Correct 19 ms 3524 KB Output is correct
11 Correct 144 ms 16696 KB Output is correct
12 Correct 28 ms 4984 KB Output is correct
13 Correct 85 ms 13100 KB Output is correct
14 Correct 2 ms 596 KB Output is correct
15 Correct 4 ms 944 KB Output is correct
16 Correct 283 ms 33608 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 1 ms 316 KB Output is correct
19 Correct 1 ms 312 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
22 Correct 1 ms 212 KB Output is correct
23 Correct 625 ms 54412 KB Output is correct
24 Incorrect 1 ms 212 KB Solution announced impossible, but it is possible.
25 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 316 KB Output is correct
2 Correct 1 ms 308 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 284 ms 33696 KB Output is correct
10 Correct 19 ms 3524 KB Output is correct
11 Correct 144 ms 16696 KB Output is correct
12 Correct 28 ms 4984 KB Output is correct
13 Correct 85 ms 13100 KB Output is correct
14 Correct 2 ms 596 KB Output is correct
15 Correct 4 ms 944 KB Output is correct
16 Correct 283 ms 33608 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 1 ms 212 KB Output is correct
20 Incorrect 1799 ms 61404 KB Solution announced impossible, but it is possible.
21 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 316 KB Output is correct
2 Correct 1 ms 308 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 284 ms 33696 KB Output is correct
10 Correct 19 ms 3524 KB Output is correct
11 Correct 144 ms 16696 KB Output is correct
12 Correct 28 ms 4984 KB Output is correct
13 Correct 85 ms 13100 KB Output is correct
14 Correct 2 ms 596 KB Output is correct
15 Correct 4 ms 944 KB Output is correct
16 Correct 283 ms 33608 KB Output is correct
17 Correct 704 ms 61028 KB Output is correct
18 Correct 677 ms 60632 KB Output is correct
19 Incorrect 1959 ms 64024 KB Solution announced impossible, but it is possible.
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 316 KB Output is correct
2 Correct 1 ms 308 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 284 ms 33696 KB Output is correct
10 Correct 19 ms 3524 KB Output is correct
11 Correct 144 ms 16696 KB Output is correct
12 Correct 28 ms 4984 KB Output is correct
13 Correct 85 ms 13100 KB Output is correct
14 Correct 2 ms 596 KB Output is correct
15 Correct 4 ms 944 KB Output is correct
16 Correct 283 ms 33608 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 1 ms 316 KB Output is correct
19 Correct 1 ms 312 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
22 Correct 1 ms 212 KB Output is correct
23 Correct 625 ms 54412 KB Output is correct
24 Incorrect 1 ms 212 KB Solution announced impossible, but it is possible.
25 Halted 0 ms 0 KB -