• 2023NOIP A层联测19 多边形


    题目大意

    有一个正 n n n边形,每个点的颜色为红色、蓝色、绿色中的一种,保证每种颜色至少出现一次且 n n n边形上相邻的两个点颜色不同。你想要连接 n − 3 n-3 n3条对角线,使得对角线把图分成 n − 2 n-2 n2三角形,并且每个三角形的三个顶点的颜色两两不同。

    请输出任意一个合法的方案,有 n − 3 n-3 n3行,每行两个正整数 x , y x,y x,y,表示一条对角线。如果不存在合法方案,则输出 I m p o s s i b l e ! Impossible! Impossible!

    样例输入

    6
    RBRGBG
    
    • 1
    • 2

    样例输出

    2 6
    3 5
    3 6
    
    • 1
    • 2
    • 3

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


    题解

    如果一个颜色只出现了一次,则因为相邻的两个点颜色不同,我们直接将这个点与所有其他点连接即可。

    否则,一定会出现相邻三个点颜色两两不同,直接将这三个点划分为一个三角形,并删除中间那个点即可。可以发现,始终满足相邻的两个点颜色不同,所以这样做之后还是满足条件、可以继续删下去的。

    当第一次出现有一种颜色只出现了一次的情况时,按上面所说,我们直接将这个点与所有其他点连接即可。

    我们可以用链表来维护没有被删除的点,然后一路删下去即可。因为每种颜色至少出现一次,而且一直都不会出现两个点颜色相同的情况,所以在出现有一种颜色只出现一次的情况之前,总会出现相邻三个点颜色两两不同,总能一直删下去。那么, 就不会有无解的情况。

    时间复杂度为 O ( n ) O(n) O(n)

    code

    #include
    using namespace std;
    const int N=1000000;
    int n,ct[3],v[N+5],l[N+5],r[N+5],z[N+5];
    char s[N+5];
    struct node{
    	int x,y;
    };
    vector<node>ans;
    void del(int i){
    	z[i]=1;
    	r[l[i]]=r[i];l[r[i]]=l[i];
    }
    void solve(){
    	int bz=0;
    	for(int i=1;i<=n;i++){
    		if(!z[i]&&ct[v[i]]==1){
    			bz=i;break;
    		}
    	}
    	for(int i=1;i<=n;i++){
    		if(!z[i]&&i!=bz&&l[i]!=bz&&r[i]!=bz){
    			ans.push_back((node){bz,i});
    		}
    	}
    	for(int i=0;i<ans.size();i++){
    		printf("%d %d\n",ans[i].x,ans[i].y);
    	}
    }
    int main()
    {
    //	freopen("polygon.in","r",stdin);
    //	freopen("polygon.out","w",stdout);
    	scanf("%d",&n);
    	scanf("%s",s+1);
    	for(int i=1;i<=n;i++){
    		if(s[i]=='R') v[i]=0;
    		else if(s[i]=='G') v[i]=1;
    		else v[i]=2;
    		++ct[v[i]];
    	}
    	for(int i=1;i<=n;i++){
    		l[i]=i-1;r[i]=i+1;
    	}
    	l[1]=n;r[n]=1;
    	if(ct[0]==1||ct[1]==1||ct[2]==1){
    		solve();return 0;
    	}
    	for(int i=1;;i=r[i]){
    		while(v[l[l[i]]]+v[l[i]]+v[i]==3){
    			--ct[v[l[i]]];
    			ans.push_back((node){l[l[i]],i});
    			del(l[i]);
    			if(ct[0]==1||ct[1]==1||ct[2]==1){
    				solve();return 0;
    			}
    		}
    	}
    	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
  • 相关阅读:
    Creator 2.4.x 分享游戏图片
    【附源码】计算机毕业设计SSM图书管理系统
    问题1.用PGP解密出keybox.xml,过程中报“Can‘t check signature: No public key”如图,这个正常吗?如何解决?
    Spring AOP 实现方式与应用
    K8s 部署 Nginx
    基于java人脸识别考勤签到系统设计与实现毕业设计毕设作品
    µC/OS-II---两个系统任务
    java毕业设计广告投放mybatis+源码+调试部署+系统+数据库+lw
    pg 字符相关操作
    记一次神奇的 pipe 错误
  • 原文地址:https://blog.csdn.net/tanjunming2020/article/details/134083172