답안 #1034042

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1034042 2024-07-25T09:00:24 Z 김은성(#10970) Tiles (BOI24_tiles) C++17
0 / 100
62 ms 29696 KB
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef long long ll;
int a[1009][1009], b[1009][1009];
bool impos[1009];
int orgx[600009];
ll ccw(pair<ll, ll> p, pair<ll, ll> q, pair<ll, ll> r){
    return (q.x-p.x)*(r.y-p.y) + (r.x-p.x)*(q.y-p.y);
}
int main(){
    int n, xm, ym = 1000, i, j;
    scanf("%d %d", &n, &xm);
    vector<pair<int, int> > p(n), p1(n);
    vector<pair<int, int> > xg, yg;
    for(i=0; i<n; i++){
        scanf("%d %d", &p[i].x, &p[i].y);
        xg.push_back(make_pair(p[i].x, i));
        yg.push_back(make_pair(p[i].y, i));
    }
    p1= p;
    for(i=0; i<n; i++){
        if(ccw(p[i], p[(i+1)%n], p[(i+2)%n]) < 0){
            for(i=0; i<n/2; i++)
                swap(p[i], p[n-1-i]);
            for(i=0; i<n; i++){
                xg[i].second = n-1-xg[i].second;
                yg[i].second = n-1-yg[i].second;
            }
            break;
        }
    }
    xg.push_back(make_pair(0, -1));
    yg.push_back(make_pair(0, -1));
    sort(xg.begin(), xg.end());
    sort(yg.begin(), yg.end());
    int prev = -1;
    for(i=0; i<=600006; i++)
        orgx[i] = i;
    int prev_orgg = -1;
    for(i=0; i<n; i++){
        int orgg = xg[i+1].first, now = xg[i+1].first;
        if(xg[i+1].first - xg[i].first >= 4 || prev_orgg == orgg){
            int d = (xg[i+1].first - xg[i].first - 2) / 2 * 2;
            int temp = xg[i+1].first - (xg[i+1].first - xg[i].first - 2) / 2 * 2;
            if(prev_orgg == orgg)
                temp = xg[i].first;
            orgx[temp] = xg[i+1].first;
            now = temp;
            xg[i+1].first = temp;
            //printf("orgg=%d temp=%d\n", orgg, temp);
            if(xg[i+1].second != -1)
                p[xg[i+1].second].x = temp;
        }
        else
            orgx[xg[i+1].first] = xg[i+1].first;
        for(int x=prev+1; x<=now; x++){
            orgx[x] = orgg- (now-x);
            //printf("orgx[%d]=%d\n", x, orgx[x]);
        }
        prev_orgg = orgg;
        //printf("prev=%d now=%d\n", prev, now);
        prev = now;
    }
    xm = xg.back().first;
    prev_orgg = -1;
    for(i=0; i<n; i++){
        int orgg = yg[i+1].first;
        if(yg[i+1].first - yg[i].first >= 4 || prev_orgg == orgg){
            int temp = yg[i+1].first - (yg[i+1].first - yg[i].first - 2) / 2 * 2;
            if(prev_orgg == orgg)
                temp = yg[i].first;
            yg[i+1].first = temp;
            p[yg[i+1].second].y = temp;
        }
        prev_orgg = orgg;
    }
    for(i=0; i<n; i++){
        int x1 = p[i].first, y1 = p[i].second;
        int x2 = p[(i+1)%n].first, y2 = p[(i+1)%n].second;
        //printf("(%d, %d)\n", p[i].first, p[i].second);
        if(y1 == y2){
            if(x1 < x2){
                for(j=x1; j<x2; j++)
                    a[j][y1]--;
            }
            else{
                for(j=x1-1; j>=x2; j--)
                    a[j][y2]++;
            }
        }
    }
    for(i=0; i<=xm; i++){
        for(j=0; j<=ym; j++){
            a[i][j] += (j==0 ? 0 : a[i][j-1]);
           //printf("%d", a[i][j]);
            b[i][j] = a[i][j];
        }
        //printf("\n");
    }
    bool flag = 0;
    for(i=0; i<=ym; i++){
        int cur = 0;
        bool flag = 0;
        for(j=0; j<=xm; j++){
            if(!a[j][i]){
                if(cur%2==1)
                    flag = 1;
                cur = 0;
            }
            else
                cur++;
            if(flag || cur%2)
                impos[j] = 1;
            if(cur%2)
                b[j+1][i] = 0;
        }
    }
    for(i=0; i<=xm; i++){
        int cur = 0;
        for(j=0; j<=ym; j++){
            if(!b[i][j]){
                if(cur%2 == 1){
                    flag = 1;
                    break;
                }
                cur = 0;
            }
            else
                cur++;
        }
        if(flag)
            impos[i] = 1;
    }
    int opt = 0;
    for(i=0; i<xm; i++){
        if(!impos[i])
            opt = i+1;
    }
    int res = orgx[opt];
    //int n, xm, i, j, x, y;
    //scanf("%d %d", &n, &xm);
    vector<pair<int, int> > pp;
    pp.push_back(make_pair(0, 0));
    for(i=0; i<n-1; i++){
        int x2 = p1[i].x, y2 = p1[i].y;
        if(pp.size() >= 2 && ((pp[pp.size()-2].x == pp[pp.size()-1].x && pp.back().x==x2) ||
              (pp[pp.size()-2].y == pp[pp.size()-1].y && pp.back().y==y2)))
            pp.pop_back();
        pp.push_back(make_pair(x2, y2));
    }
    opt = 0;
    for(i=0; i<pp.size(); i++){
        //printf("x=%d y=%d\n", p[i].x, p[i].y);
        if(pp[i].x%2==0 && pp[i].y%2==0)
            opt= pp[i].x;
        else{
            opt = pp[i].x/2*2;
            break;
        }
    }
    assert(res== opt);
    printf("%d\n", opt);
    return 0;
}

Compilation message

Main.cpp: In function 'int main()':
Main.cpp:45:17: warning: unused variable 'd' [-Wunused-variable]
   45 |             int d = (xg[i+1].first - xg[i].first - 2) / 2 * 2;
      |                 ^
Main.cpp:154:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  154 |     for(i=0; i<pp.size(); i++){
      |              ~^~~~~~~~~~
Main.cpp:14:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   14 |     scanf("%d %d", &n, &xm);
      |     ~~~~~^~~~~~~~~~~~~~~~~~
Main.cpp:18:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |         scanf("%d %d", &p[i].x, &p[i].y);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Runtime error 3 ms 5212 KB Execution killed with signal 6
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Runtime error 3 ms 5212 KB Execution killed with signal 6
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 10588 KB Output is correct
2 Runtime error 16 ms 15980 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 4 ms 5468 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Runtime error 36 ms 22104 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 62 ms 29696 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Runtime error 3 ms 5212 KB Execution killed with signal 6
4 Halted 0 ms 0 KB -