답안 #1033979

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1033979 2024-07-25T08:19:18 Z 김은성(#10970) Tiles (BOI24_tiles) C++17
0 / 100
58 ms 26720 KB
#define x first
#define y second
#include <bits/stdc++.h>
using namespace std;
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);
    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));
    }
    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][i] = b[j+1][i] = 0;
        }
    }
    for(i=0; i<=xm; i++){
        int cur = 0;
        for(j=0; j<=ym; j++){
            if(b[i][j]){
                flag=1;
                break;
            }
        }
        if(flag)
            impos[i] = 1;
    }
    int opt = 0;
    for(i=0; i<xm; i++){
        if(!impos[i])
            opt = i+1;
    }
    printf("%d\n", orgx[opt]);
    return 0;
}

Compilation message

Main.cpp: In function 'int main()':
Main.cpp:44:17: warning: unused variable 'd' [-Wunused-variable]
   44 |             int d = (xg[i+1].first - xg[i].first - 2) / 2 * 2;
      |                 ^
Main.cpp:120:13: warning: unused variable 'cur' [-Wunused-variable]
  120 |         int cur = 0;
      |             ^~~
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 Incorrect 1 ms 2652 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 2652 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 10588 KB Output is correct
2 Runtime error 17 ms 15564 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2648 KB Output is correct
2 Incorrect 1 ms 2652 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Runtime error 34 ms 20480 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 58 ms 26720 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 2652 KB Output isn't correct
2 Halted 0 ms 0 KB -