2019 March 雅礼 毒瘤题赛 day2 T1(gra.cpp)

题面:

在平面上有n个点,第i个点的坐标为,\left (cos(\frac{2i\pi}{n}) ,sin(\frac{2i\pi}{n}) \right )。由题目名称可知,由于这是一道图论题,所以这n个点形成了一个无向完全图,每两个点之间都有恰好一条边。比较不同的是,边有两种颜色,黑色和白色。你每次可以询问交互库连接某两点之间边的颜色。
zzq希望你帮他选出一棵生成树,这棵生成树要满足,所有边的颜色都相同,并且边两两只在端点处交又(即组成生成树边的平面上的线段除了共端点以外都不相交)。如果有多个解。你可以任意输出一个。可以证明一定有解。

 

Orz zzq神仙。

神仙交互题,考场上硬把这道题做成了计算几何题,只拿了20分暴力(蒟蒻默默溜走……

正解居然如此简洁易懂,完全没有想到。首先n个点构成一个凸多边形,考虑 i 和 i+1 之间边的颜色,如果与 i  和 i-1 的不同就把 i 弹掉,再用 i-1 比较,这是因为无论最后的生成树颜色是什么这个点都可以被加入。我的代码的实现过程用到一个栈,分别记录一下每个点入栈和出栈时候的栈顶是谁,n个点都跑完之后根据栈内剩余的边的颜色决定那些被弹出去的点都与谁连边。由于每个点最多只会进一次栈,出一次栈,所以query()函数调用次数不会超过2*n

考后改AC的代码:

#include<bits/stdc++.h>
#include "gra.hpp"
#define N 100005
int sta[N],top,col[N],now,pre[N],nxt[N];
void tree(int n){
	sta[++top]=1;
	col[2]=query(1,2);
	pre[2]=1;
	sta[++top]=2;
	for(int i=3;i<=n;i++){
		col[i]=query(sta[top],i);
		while(top>1&&col[i]!=col[sta[top]]){
			nxt[sta[top]]=i;
			top--;
			col[i]=query(sta[top],i);
		}
		pre[i]=sta[top];
		sta[++top]=i;
	}
	int fin=col[sta[top]];
	for(int i=1;i<top;++i){
		for(int j=sta[i]+1;j<=sta[i+1];++j)
		if(col[j]==fin)report(j,pre[j]);
		else report(j,nxt[j]);
	}
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值