CF1330B题解
题意:
给定一个长为 \(n\) 序列 \(a\) ,问是否能分成两个排列,并输出方案
(排列:从 \(1—n\) 中选取不同的 \(n\) 个元素组成的序列)
思路:
观察数据范围可以猜出,这题 \(O(n)\) 能解决;
因为两个排列是不重叠的,所以可以考虑分别枚举 \(a_1—a_l\) 是否能组成 \(1—l\) 的排列,\(a_{l+1}—a_n\) 是否能构成排列,那么就用 \(l_i\) 表示 前\(i\) 个数是否能形成一个排列,\(r_i\) 表示后 \(i\) 个数是否能形成排列,当 \(l_i\) 与 \(r_{i+1}\) 同时为真的时候可行,输出 \(i\) 和 \(n-i\) 即可;
此题还有一个重要的难题,就是如何判断是一个排列:
比如判断前 \(i\) 个数是否为排列
- 必然有前 \(i\) 个数的最大值为 \(i\) ;
- 任意小于 \(i\) 的数出现且只出现一次;
当上面两条都成立时必然为一个排列,具体实现见代码。
尽管以上已经为 \(O(n)\) 的可行算法,但是为了实现方便,可以加一些优化:
因为要分成两个排列,所以序列 \(a\) 的最大值 \(maxn\) 必然在一个排列中,\(n-maxn\) 必然存在与另一个排列中,所以一个排列的长度为 \(maxn\),另一个为 \(n-maxn\) ,这说明了最多只存在两种方案;
因为最多只有两种方案,所以若某一数字出现两次以上,必然不存在方案。
代码:
cin>>t;
while(t--)
{
memset(vis,0,sizeof(vis));
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int num=0,maxx=0;
for(int i=1;i<=n;i++)
{
maxx=max(maxx,a[i]);
if(vis[a[i]]) continue;
if(a[i]<=maxx)
vis[a[i]]=1,num++;
if(num==maxx&&num==i) l[i]=true;
}
num=0,maxx=0;
for(int i=n;i>=1;i--)
{
maxx=max(maxx,a[i]);
if(vis[a[i]]) continue;
if(a[i]<=maxx)
vis[a[i]]=1,num++;
if(num==maxx&&num==(n-i+1)) r[i]=true;
}
memset(vis,0,sizeof(vis));
int ans=0;
for(int i=1;i<=n-1;i++)
if(l[i]&&r[i+1]) ans++;
cout<<ans<<endl;
for(int i=1;i<=n-1;i++)
if(l[i]&&r[i+1]) cout<<i<<" "<<n-i<<endl;
}
CF1330B题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 使用ubuntu charmed kubernetes 部署一套生产环境的集群
官方文档: https://ubuntu.com/kubernetes/docs 搭建一个基本的集群 集群ip规划 hostname ip ubuntu-1 10.0.0.10 juju-contro ...
- CUDA 8的混合精度编程
CUDA 8的混合精度编程 Volta和Turing GPU包含 Tensor Cores,可加速某些类型的FP16矩阵数学运算.这样可以在流行的AI框架内更快,更轻松地进行混合精度计算.要使用Ten ...
- Yolov4性能分析(下)
Yolov4性能分析(下) 六. 权重更新 "darknet/src/detector.c"--train_detector()函数中: ...... /* 开始训练网络 */ f ...
- 开源电路分享のFalling Star Board
设计初衷 想自己做个能连网的时钟,结合RT-thread,显示个天气预报什么的,想想就挺有趣的.考虑到当前的芯片价格,和后续的设计,万一还有个啥奇妙的想法呢,就把这个做成了核心板. 一开始就只做了最小 ...
- 【Android漏洞复现】StrandHogg漏洞复现及原理分析_Android系统上的维京海盗
文章作者MG1937 CNBLOG博客:ALDYS4 QQ:3496925334 0x00 StrandHogg漏洞详情 StrandHogg漏洞 CVE编号:暂无 [漏洞危害] 近日,Android ...
- 【工具解析】瑞士军刀bettercap2.X_解析_第二期_内网钓鱼(嗅探)工具编写
/文章作者:Kali_MG1937 CNBLOG博客:ALDYS4 QQ:3496925334/ 第一期: https://www.cnblogs.com/aldys4/p/14877783.html ...
- 【VBA】查找字符串
老婆饼里有老婆吗 Sub test() aaa = "老婆饼里有老婆吗" If InStr(aaa, "老婆") <> 0 Then Debug.p ...
- Python小白的数学建模课-09 微分方程模型
小白往往听到微分方程就觉得害怕,其实数学建模中的微分方程模型不仅没那么复杂,而且很容易写出高水平的数模论文. 本文介绍微分方程模型的建模与求解,通过常微分方程.常微分方程组.高阶常微分方程 3个案例手 ...
- 【模拟7.14】建造游乐园(play)
这题是玄学的数论 首先考虑如何枚举偶数点度的图 可以考虑取出i-1个点 那么成图的数量为2^C(i-1,2) (原因单独取出的i点能平衡已建图中的奇数点,原因是某种性质....) 然后求带联通标号的欧 ...
- 在vue中下拉框切换事件中改新建表单中的一个值,页面不显示
事件中改新建表单中的一个值,页面不显示,当另一个对象值发生改变时,这个页面上的值才会显示 由于新建表单是弹窗,在弹出时会重新给每个字段重新赋值,在赋值时没给这个字段赋值(常见新加功能时,加了一个字段, ...