首页 > 其他分享 >[CF1508D] Swap Pass

[CF1508D] Swap Pass

时间:2023-10-10 16:57:30浏览次数:38  
标签:CF1508D const int Swap Pass 大环

D - Swap Pass

先将所有\(a_i==i\)的点都直接去掉

考虑将\(i\)向\(a_i\)连边,那么就会形成一个个的环

考虑只有一个环的情况,那么我们任意固定一个点\(x\),一直交换\(a_x\)与\(a_{a_x}\)直到\(a_x==x\),因为所有所有边都交于一点,所以这肯定是合法的

但更普遍的情况是不止有一个环,那么我们考虑交换两个环之间的某两个点的\(a\),那么这样就可以将两个环合成一个大环,然后继续我们刚才的操作即可

但是有可能环与环之间的边与大环里连的边相交了,考虑如何解决

我们选择最左边的最下的点作为极点\(O\),然后将其余点根据极角排序

我们用相邻点连边来解决环与环之间的交换,这个可以用并查集维护

然后从极点进行大环的连边,这样显然不存在相交的边

#include<bits/stdc++.h>
#define pii pair<int,int>
#define pb push_back
using namespace std;
const int N=2e3+5;
struct node{
	int x,y,a,id;
	double angle;
	bool operator < (const node &other) const{
		return angle<other.angle;
	}
}cn[N];
int n,tot,fa[N],to[N];
int find(int x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void merge(int x,int y){
	x=find(x),y=find(y);
	fa[x]=y;
}
vector<pii> op;
int main(){ 
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		++tot,scanf("%d%d%d",&cn[tot].x,&cn[tot].y,&cn[tot].a),cn[tot].id=i;
		if(cn[tot].a==i) --tot; 
		fa[i]=i;
	}
	if(tot==0) return puts("0"),0;
	n=tot;
	int st=1;
	for(int i=2;i<=n;++i) if(cn[i].x<cn[st].x||(cn[i].x==cn[st].x&&cn[i].y<cn[st].y)) st=i;
	swap(cn[1],cn[st]);
	for(int i=2;i<=n;++i) cn[i].angle=atan2(cn[i].x-cn[1].x,cn[i].y-cn[1].y);
	sort(cn+2,cn+n+1);
	for(int i=1;i<=n;++i) merge(cn[i].id,cn[i].a);
	for(int i=2;i<n;++i){
		int a=find(cn[i].id),b=find(cn[i+1].id);
		if(a!=b) merge(a,b),swap(cn[i].a,cn[i+1].a),op.pb({cn[i].id,cn[i+1].id});
		to[cn[i].id]=i;
	}
	to[cn[1].id]=1,to[cn[n].id]=n;
	while(cn[1].a!=cn[1].id){
		int t=to[cn[1].a];
		swap(cn[1].a,cn[t].a),op.pb({cn[1].id,cn[t].id});
	}
	printf("%d\n",op.size());
	for(auto [x,y]:op) printf("%d %d\n",x,y);
	return 0;
}

标签:CF1508D,const,int,Swap,Pass,大环
From: https://www.cnblogs.com/LuoyuSitfitw/p/17755111.html

相关文章

  • AtCoder Regular Contest 166——A - Replace C or Swap AB
    题目描述  中文题目描述每个字符串的长度为N,由A,B和C组成。通过对X执行以下三种操作任意次数(可能为零),确定是否有可能使X与y重合。 操作(1):选择X中的字符C替换为字符A。操作(2):在X中选择字符C替换为字符B。操作(3):选择X中的子字符串AB,替换为BA。更正式地说,选择......
  • MongoDB可视化管理工具-MongoDB Compass【转】
    一、引言在使用MongoDB过程中,如果单单依靠命令行操作MongoDB数据库,效率不高而且查看不方便。因此MongoDB官网提供的一个可视化管理工具,叫MongoDBCompass,它集创建数据库、管理集合和文档、运行临时查询、评估和优化查询、性能图表、构建地理查询等功能为一体,很方便。二、......
  • AES key — encoded in the machine readable zone of a European ePassport
    AESkey—encodedinthemachinereadablezoneofaEuropeanePassport题目地址AESkey—encodedinthemachinereadablezoneofaEuropeanePassport解题过程第一步:补全给出的密钥通过查阅题目附录里提到的文档,可以找到校验位的具体机制,依据解释可求出初始密钥"?......
  • Centos感染挖矿病毒kswapd0
    top查看发现kswapd0占用异常高有一个陌生的用户comp先删除authorized_keys中陌生的key查看root的计划任务(发现没异样)crontab-l查看该用户的计划任务sudo-ucompbash-c'crontab-l'发现删除,顺便删除crontab里面使用的文件和文件夹删除comp用户的进程查看......
  • [JVM]关于swap的理解
    关于swap的理解概念swap就是内存交换的意思。计算机内存分为物理内存和虚拟内存。物理内存就是计算机实际内存的大小;虚拟内存是磁盘空间里开辟出一部分,是虚拟出来的内存空间,所以也叫磁盘缓存。虚拟内存使得计算机在内存不够的情况可以得到部分解决。程序运行的时候会在虚拟内......
  • Mysql 8.0 Navicat连接Mysql报错Authentication plugin ‘caching_sha2_password‘ ca
    1、终端登陆MySQL$mysql-uroot-ppassword#登入mysql2、修改账户密码加密规则并更新用户密码ALTERUSER'root'@'localhost'IDENTIFIEDBY'123456'PASSWORDEXPIRENEVER;#修改加密规则ALTERUSER'root'@'localhost'IDENTIFIEDWITHmysql_nat......
  • 使用BCryptPasswordEncoder类实现数据库密码的加密---简单极了的那种
    1、存储加密的密码,实现数据库加密的操作BCryptPasswordEncoderbCryptPasswordEncoder=newBCryptPasswordEncoder();Stringencode=bCryptPasswordEncoder.encode(password);Useruser=newUser();user.setPassword(encode);2、读取比对数据库信息......
  • This generated password is for development use only. Your security configuration
    问题描述在我加上spring-boot-starter-security的依赖之后,启动项目报出来这样的错误:问题解决在启动类的注解上,加上这么一段代码就ok啦!启动成功:......
  • 什么是 Accessibility 领域的 Bypass Blocks
    Accessibility领域的BypassBlocks是指通过一种或多种方式绕过或规避Web或移动应用程序中的可访问性障碍,以使信息、功能或内容对于所有用户,包括那些具有不同能力或使用不同辅助技术的人,都能够无障碍地访问和使用。这些障碍可能包括视觉、听觉、认知或运动方面的障碍。BypassBlock......
  • 《Upload-Labs》01. Pass 1~13
    @目录索引前言Pass-01题解Pass-02题解总结Pass-03题解总结Pass-04题解Pass-05题解总结Pass-06题解总结Pass-07题解总结Pass-08题解总结Pass-09题解Pass-10题解Pass-11题解Pass-12题解总结Pass-13题解靶场部署在VMware-Win7。靶场地址:https://github.com/c0ny1/upload-lab......