[CSP校内集训]C
时间:2019-11-05
本文章向大家介绍[CSP校内集训]C,主要包括[CSP校内集训]C使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意
给一个全排列,小A和小B两人轮流操作,一次操作交换两个数;小B先操作,已知小B每回合交换的数,求最优策略,使得用最少的回合数让排列有序,\((n\leq 10^5)\)
思路
手搓发现操作顺序没有关系,即AB两人交换操作和B先操作、A再操作无区别(这点分情况讨论很好证);
答案满足二分性,因为如果\(x\)时刻排列有序,之后A只需要将B的操作抵消就也是有序的
二分答案\(mid\),先进行一遍B的操作,然后再考虑A怎么操作
将一个无序序列通过交换变成有序序列->一个经典问题(为什么我会想到逆序对啊qwq)
即将\(i\)向\(a_i\)连边,显然会形成一些简单环,答案就是n-所有简单环的数量(每个环相互独立,一个环需要(环的大小-1)步还原)
Code
#include<bits/stdc++.h>
#define N 200005
#define lowbit(x) ((x)&(-(x)))
#define Min(x,y) ((x)<(y)?(x):(y))
#define Max(x,y) ((x)>(y)?(x):(y))
using namespace std;
typedef long long ll;
int n,a[N],b[N],c[N],x[N<<1],y[N<<1];
bool vis[N];
template <class T>
void read(T &x)
{
char c; int sign=1;
while((c=getchar())>'9'||c<'0') if(c=='-') sign=-1; x=c-48;
while((c=getchar())>='0'&&c<='9') x=(x<<1)+(x<<3)+c-48; x*=sign;
}
bool check(int mid)
{
memset(vis,0,sizeof(vis));
memset(c,0,sizeof(c));
memcpy(b,a,sizeof(b));
//b操作了之后才完成
for(int i=1;i<=mid;++i) swap(b[x[i]],b[y[i]]);
int ans=0;
for(int i=1;i<=n;++i)
{
if(!vis[i])
{
vis[i]=1;
int x=b[i];
while(!vis[x]) { vis[x]=1; x=b[x]; ++ans; }
}
}
return ans<=mid;
}
int main()
{
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
read(n);
for(int i=1;i<=n;++i) read(a[i]),++a[i];
for(int i=1,t=2*n;i<=t;++i) read(x[i]),read(y[i]),++x[i],++y[i];
int l=0,r=2*n,ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans<<endl;
return 0;
}
原文地址:https://www.cnblogs.com/Chtholly/p/11799737.html
- list.add(),向List集合插入对象报空指针异常
- 使用angular4和asp.net core 2 web api做个练习项目(三)
- 即学即用系列一:纯函数
- Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File
- React编程思想
- 前台分页,以及类别选择
- 使用angular4和asp.net core 2 web api做个练习项目(二), 这部分都是angular
- 数据库 105道题目整理与吐血总结
- 使用angular4和asp.net core 2 web api做个练习项目(一)
- =.=
- JavaScript经典面试题之for循环click
- 学习docker on windows (1): 为什么要使用docker
- 使用VS Code开发asp.net core (下)
- 使用VS Code开发asp.net core (上)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法