• NOIP2023模拟4联测25 B. 多边形


    NOIP2023模拟4联测25 B. 多边形

    题目大意

    给你一个正 n n n 边形,每个点有三种颜色,红、蓝、绿。现在你想要连接 n − 3 n - 3 n3 条对角线,使得这些对角线把整个图形分成了 n − 2 n - 2 n2 个三角形,而且每个三角形三个顶点的颜色两两不同。

    保证每种颜色至少出现过一次且 n n n 边形上相邻的两个点颜色不同。

    输出任意一个连边的方案。

    4 ≤ n ≤ 1 0 6 4\le n\le 10^6 4n106

    思路

    显然,答案没有 I m p o s s s i b l e ! Imposssible! Imposssible!

    如果有一种颜色只出现了一次,就直接把这个点与其他所有除了相邻的点连边就好了

    否则,先找到相邻的三个颜色不一样的点

    设这三个点分别为 l , x , r l , x , r l,x,r l l l 的左边为 l l ll ll r r r 的右边为 r r rr rr

    每次操作。

    如果 l l = = r r ll == rr ll==rr ,连边 ( l , r ) (l , r) (l,r) 然后退出。

    如果 s [ l l ] = = s [ x ] s[ll] == s[x] s[ll]==s[x] ,就连边 ( l , r ) (l , r) (l,r)

    否则如果 s [ r r ] = = s [ x ] s[rr] == s[x] s[rr]==s[x] ,就连边 ( l , r ) (l , r) (l,r)

    否则连边 ( l l , x ) , ( x , r r ) (ll , x) , (x , rr) (ll,x),(x,rr)

    然后更新一下点的编号继续搞

    code

    #include 
    #define fu(x , y , z) for(int x = y ; x <= z ; x ++)
    using namespace std;
    const int N = 1e6 + 5;
    int n , ans1 , ans[N][5] , flg[5] , flg1[5];
    char s[N];
    int lst (int x) { return x == 1 ? n : x - 1; }
    int nxt (int x) { return x == n ? 1 : x + 1; }
    int main () {
        freopen ("polygon.in" , "r" , stdin);
        freopen ("polygon.out" , "w" , stdout);
        scanf ("%d" , &n);
        scanf ("%s" , s + 1);
        int x;
        fu (i , 1 , n) {
            if (s[i] == 'B') x = 1;
            else if (s[i] == 'R') x = 2;
            else x = 3;
            flg[x] ++;
            flg1[x] = i;
        }
        fu (i , 1 , 3) {
            if (flg[i] == 1) { 
                fu (j , 1 , n) {
                    if (flg1[i] == j || nxt(flg1[i]) == j || lst(flg1[i]) == j) continue;
                    printf ("%d %d\n" , flg1[i] , j);
                }
                exit (0);
            }
        }
        int l , r , ll , rr;
        fu (i , 1 , n)
            if (s[lst(i)] != s[nxt(i)] && s[i] != s[lst(i)] && s[i] != s[nxt(i)]) {
                x = i;
                break;
            }
        l = lst(x) , r = nxt(x);
        while (1) {
            ll = lst(l) , rr = nxt(r);
            if (ll == rr) {
                if (s[ll] == s[x]) {
                    ans[++ans1][1] = l;
                    ans[ans1][2] = r;
                    break;
                }
                else {
                    printf ("Impossible!");
                    exit (0);
                }
            }
            if (lst(rr) == ll) 
                break;
            if (s[ll] == s[x]) {
                ans[++ans1][1] = l;
                ans[ans1][2] = r;
                x = l;
                l = ll; 
            }
            else if (s[rr] == s[x]) {
                ans[++ans1][1] = l;
                ans[ans1][2] = r;
                x = r;
                r = rr;
            }
            else {
                ans[++ans1][1] = ll;
                ans[ans1][2] = x;
                ans[++ans1][1] = x;
                ans[ans1][2] = rr;
                l = ll;
                r = rr;
            }
        }
        fu (i , 1 , ans1) {
            printf ("%d %d\n" , ans[i][1] , ans[i][2]);
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
  • 相关阅读:
    CSS学习273~297(HTML5和CSS新特性)
    java计算机毕业设计智慧机场管理系统源码+数据库+系统+部署+lw文档
    【JAVASE开发】带你零基础学JAVA项目(二嗨租车项目篇)
    【架构整洁之道系列】(四)软件架构师与软件架构
    云龙开炮版飞机大战(完整版)
    compact unwind compressed function offset doesn‘t fit in 24 bits
    机器学习实战笔记(二)KNN算法
    python读取.txt文件中某些关键字后面的内容 并根据该数据画图
    Mybatis入门&Mapper开发&注解开发
    最长异或路径(dfs+01trie)
  • 原文地址:https://blog.csdn.net/fzyyyyyyyy/article/details/134084635