[杂题]:C/c(二分答案)
题目传送门(内部题54)
输入格式
第一行一个整数表示$n$。
第二行$n$个整数表示初始序列。(这行原题没有,是我加的)
接下来$2n$行每行两个整数,分别表示$X_i,Y_i$。
数据保证至少存在一种方案使得游戏在$2n$轮之内完成。
输出格式
一个整数表示小$A$最少需要进行的轮数。
样例
样例输入:
3
1 0 2
1 2
0 2
0 0
0 1
0 2
1 2
样例输出:
2
数据范围与提示
样例解释:
最优方案为第一轮中交换下标为$0$和$1$的元素,第二轮交换下标为$0$和$0$的元素,也就是不改变这个排列。
数据范围:
对于前$20\%$的数据:
$n\leqslant 10$
对于前$40\%$的数据:
$n\leqslant 2,000$
对于所有数据:
$1\leqslant n\leqslant 200,000$
题解
首先,来看着道题的两条特殊性质:
$\alpha.$如果在小$B$换之前这个序列就已经排好序了,那么小$A$可以把它再换回来。
$\beta.$如果答案为$k$,那么小$A$可以让小$B$先都换完了再都换回来,举个例子,比方说$1,2,3$三个数,小$A$要交换$1,3$,现在小$B$交换了$1,2$,那么我们无非就是将需要交换的位置改变,内容并不需要改变。
这样,答案就满足单调性了,我们考虑二分答案,至于$judge$,上面已经提到了一部分,下面主要讲一下小$A$应该如何换,我们只需要从左往右扫,如果现在位置上的数不是应该有的数,我们换过来就好了。
下面代码中给出了两种不同的$judge$方式。
其实我们在$n$步之内一定能换过来,所以下面的代码只读了前$n$步。
时间复杂度:$\Theta(n\log n)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n;
int a[200001],b[200001],pos[200001];
int l[500000],r[500000];
bool judge(int x)
{
for(int i=1;i<=n;i++)b[i]=a[i];
for(int i=1;i<=x;i++)swap(b[l[i]],b[r[i]]);
for(int i=1;i<=n;i++)pos[b[i]]=i;
int res=0;
for(int i=1;i<=n;i++)
if(b[i]!=i)
{
res++;
pos[b[i]]=pos[i];
swap(b[pos[i]],b[i]);
}
if(res<=x)return 1;
return 0;
}
bool judge(int x)
{
for(int i=1;i<=n;i++)b[i]=a[i];
for(int i=1;i<=x;i++)swap(b[l[i]],b[r[i]]);
int res=0;
for(int i=1;i<=n;i++)
while(b[i]!=i)
{
res++;
swap(b[i],b[b[i]]);
}
if(res<=x)return 1;
return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]++;
}
for(int i=1;i<=n;i++)
{
scanf("%d%d",&l[i],&r[i]);
l[i]++;r[i]++;
}
int lft=0,rht=n;
while(lft<rht)
{
int mid=(lft+rht)>>1;
if(judge(mid))rht=mid;
else lft=mid+1;
}
printf("%d",lft);
return 0;
}
rp++
[杂题]:C/c(二分答案)的更多相关文章
- BZOJ_4590_[Shoi2015]自动刷题机_二分答案
BZOJ_4590_[Shoi2015]自动刷题机_二分答案 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题 ...
- BZOJ4590 SHOI2015自动刷题机(二分答案)
二分答案,分别往尽量小的和尽量大的二分即可. #include<iostream> #include<cstdio> #include<cmath> #includ ...
- Codeforces Round #402 (Div. 2) D题 【字符串二分答案+暴力】
D. String Game Little Nastya has a hobby, she likes to remove some letters from word, to obtain anot ...
- 【bzoj2653】【middle】【主席树+二分答案】
Description 一个长度为 n 的序列 a ,设其排过序之后为 b ,其中位数定义为 b[n/2] ,其中 a,b 从 0 开始标号 , 除法取下整. 给你一个长度为 n 的序列 s .回答 ...
- BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Submit: 1388 Solved: 860 [Submit][Stat ...
- 二分答案:Poweroj2461-入门基础之二分答案(二分法的应用)
传送门:点击打开链接 入门基础之二分答案 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 179 Accepted: 33 Page V ...
- HDU 5884 Sort(二分答案+计算WPL的技巧)
Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- LuoguP2115 [USACO14MAR]破坏Sabotage【二分答案】By cellur925
本来是想找一道生成树的题做的...结果被洛咕的标签骗到了这题...结果是二分答案与生成树一点mao关系都没有.... 题目大意:给你一个序列,请你删去某一个$l~r$区间的值($2<=i< ...
- [杂题]:B/b(二分答案)
题目传送门(内部题53) 输入格式 第二行$2$个整数表示$n,m$.接下来$m$行每行两个整数,描述一个点对$(x_i,y_i)$. 输出格式 一个整数,表示最短距离. 样例 样例输入: 6 21 ...
随机推荐
- Vagrant 手册之 box - 版本
原文地址 从 Vagrant 1.5 版本起,box 开始支持版本.这运行创建 box 的人提交更新,使用 box 的人检查更新.更新 box 并查看变更记录. 对于 Vagrant 新手,box 版 ...
- SqlServer 索引和视图
Ø 索引 1. 什么是索引 索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度. 2. 索引分类 数据库中索引主要分为两类:聚集索引和非聚集索引.SQL Serv ...
- 剑指offer第二版面试题5:从尾到头打印链表(JAVA版)
题目描述: 输入一个链表,从尾到头打印链表每个节点的值.返回新链表. import java.util.Stack; //定义链表结构 class ListNode { int value; List ...
- onblur和onkeyup事件
onblur:事件会在对象失去焦点时发生 提示:onblur 相反事件为onfocus事件 . onkeyup: 事件会在键盘按键被松开时发生. 提示:与onkeyup 事件相关的事件发生次序: on ...
- 20190823 尚硅谷MySQL核心技术
背景 视频时间:2017.09 MySQL版本:5.5 MySQL基础 命令行启动.停止MySQL: net start MySQL(这里是注册的服务名称) net stop MySQL 命令行连接M ...
- Python 学习笔记21 CMD执行测试用例
使用CMD命令执行测试用例 当我们在ride中设计好测试用例后,我们可以使用ride的界面工具来选择和运行测试用例. 系统也会提供比较好的报告和日志的浏览功能. 但是这样的自动化,毕竟是需要手工介入的 ...
- Windows下Nginx的启动、停止、重启等命令
Windows下Nginx的启动.停止等命令 在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动.停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍. 假设 ...
- vue基础介绍及使用
1.vue基本使用 vm:el / data v:v-model / {{ }} 1. 引入Vue.js 2. 创建Vue对象 el : 指定根element(选择器) data : 初始化数据(页面 ...
- Linux学习之文件搜索命令
一.文件搜索命令locate locate 文件名 在后台数据库中按文件名搜索,搜索速度最快 /var/lib/mlocate #locate命令所搜索的后台数据库(数据库不会实时刷新,所以新建的文件 ...
- nginx的4层负载均衡配置
前言:所谓四层就是基于IP+端口的负载均衡:七层就是基于URL等应用层信息的负载均衡:同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡. 换句换说,二层负载均衡会通过一个虚拟MAC地 ...