CSU 1807: 最长上升子序列~ 分类讨论
1807: 最长上升子序列~
Time Limit: 5 Sec Memory Limit: 128 MB
Submit: 138 Solved: 17
[Submit][Status][Web Board]
Description
Input
Output
Sample Input
3
0 0 0
4
0 0 0 0
5
1 0 0 4 5
Sample Output
4
9
1
HINT
Source
分析:就是大分类讨论,考虑偏移
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1e5 + ;
const double eps = 1e-;
const double INF = 1e12;
int n,a[N],b[N],m[N];
void solve3(int id){
memset(b,,sizeof(b));
b[id] = a[id];int cnt=;
for(int i=;i<=n;++i){
if(i==id)continue;
++cnt;if(cnt==a[id])++cnt;
b[i]=cnt;
}
for(int i=;i<=n;++i)
if(a[i]&&a[i]!=b[i]){
puts("");
return;
}
puts("");
}
void solve1(int id){
if(a[id+]==id){
for(int i=;i<=n;++i){
b[i]=i;
}
swap(b[id],b[id+]);
for(int i=;i<=n;++i){
if(a[i]&&a[i]!=b[i]){
puts("");return;
}
}
puts("");
return;
}
int r=id,flag=;
for(int i=id+;i<=n;++i){
if(a[i] == )continue;
if(i!=a[i]){
if(!flag&&a[i]==i+)r=i;
else{
puts("");
return;
}
}
if(i==a[i])flag=;
}
int t1 = ,t2 = ;
for(int i= id-;i&&a[i]==;--i)++t1;
for(int i=r+;i<=n&&a[i]==;++i)++t2;
LL ret = 1ll*(t1+)*t2;
printf("%lld\n",ret);
}
void solve2(int id){
if(a[id-]==id){
for(int i=;i<=n;++i){
b[i]=i;
}
swap(b[id],b[id-]);
for(int i=;i<=n;++i){
if(a[i]&&a[i]!=b[i]){
puts("");return;
}
}
puts("");
return;
}
int r=id,flag=;
for(int i=id+;i<=n;++i){
if(a[i]==)continue;
if(i!=a[i]){
if(!flag&&a[i]==i-)r=i;
else{
puts("");
return;
}
}
if(i==a[i])flag=;
}
int t1 = ,t2 = ;
for(int i=id-;i&&a[i]==;--i)++t1;
for(int i=r+;i<=n&&a[i]==;++i)++t2;
LL ret = 1ll*(t2+)*t1;
printf("%lld\n",ret);
}
int main(){
while(~scanf("%d",&n)){
memset(m,-,sizeof(m));
for(int i=;i<=n;++i)scanf("%d",&a[i]),m[a[i]]=i;
bool flag = false;
for(int i=;i<=n;++i){
if(a[i]&&(a[i]-i>||i-a[i]>)){
solve3(i);
flag = true;
break;
}
}
if(flag)continue;
for(int i=;i<=n;++i){
if(a[i]==||a[i]==i)continue;
if(a[i]-i==)solve1(i);
else if(i-a[i]==)solve2(i);
flag = true;
break;
}
if(flag)continue;
int cnt=;LL ret=;
for(int i=;i<=n;++i){
if(a[i]==)++cnt;
else if(cnt){
ret+=1ll*(cnt-)*(cnt-);
cnt=;
}
}
if(cnt)ret+=1ll*(cnt-)*(cnt-);
printf("%lld\n",ret);
}
return ;
}
CSU 1807: 最长上升子序列~ 分类讨论的更多相关文章
- 【模拟】CSU 1807 最长上升子序列~ (2016湖南省第十二届大学生计算机程序设计竞赛)
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1807 题目大意: 给你一个长度为N(N<=105)的数列,数列中的0可以被其他数 ...
- CSU 1225 最长上升子序列并记录其个数
;j<i;j++){ if(h[i] > h[j]){ ) cnt[i]+=cnt[j]; ) len[i] = len[j] + , cnt[i] = cnt[j]; } //身高相同的 ...
- [csu/coj 1078]多个序列的最长公共子序列
题意:给n个序列,同一个序列里面元素互不相同,求它们的最长公共子序列. 思路:任取一个序列,对于这个序列里面的两个数ai,aj(i<j),如果对于其它每一个序列,都出现过ai,aj,且ai在aj ...
- 经典递归问题:0,1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列
0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...
- 最长上升子序列(LIS)模板
最长递增(上升)子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]<a[j],这样最长的子序列称为最长递增(上升)子序列. 考虑两个数a[x ...
- 【动态规划】拦截导弹_dilworth定理_最长递增子序列
问题 K: [动态规划]拦截导弹 时间限制: 1 Sec 内存限制: 256 MB提交: 39 解决: 10[提交][状态][讨论版] 题目描述 张琪曼:“老师,修罗场是什么?” 墨老师:“修罗是 ...
- 算法导论-动态规划(最长公共子序列问题LCS)-C++实现
首先定义一个给定序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果,其形式化定义如下:给定一个序列X = <x1,x2 ,..., xm>,另一个序列Z =<z1,z2 ...
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...
- DP:LCS(最长公共子串、最长公共子序列)
1. 两者区别 约定:在本文中用 LCStr 表示最长公共子串(Longest Common Substring),LCSeq 表示最长公共子序列(Longest Common Subsequence ...
随机推荐
- Linux网络配置出现的问题
网络连接 : 选择桥接模式进入字符界面后,管理员登入后 ifconfig显示eth0和ol,但是不显示静态IP地址,即无inet.地址.广播.掩码 解决方案: 1.使用sudo dhclient e ...
- Sql语句的一些事(二)
与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行 from--where--group by--having--select--order by, from:需要从哪个数据表检索数据 wh ...
- LINUX:Contos7.0 / 7.2 LAMP+R 下载安装Redis篇
文章来源:http://www.cnblogs.com/hello-tl/p/7569108.html 更新时间:2017-09-21 16:09 简介 LAMP+R指Linux+Apache+Mys ...
- 关于使用mongodb中遇到的时间戳雷同的问题
文不对题,实际上不是时间戳,而是我们使用js取当前毫秒数,将他看为时间戳,每次updata的时候,获取当前毫秒数,把它当做create_time的默认值,自动添加到我们的数据库中,数据模型如下 开始的 ...
- 对Kaldi nnet3进行奇异值分解(SVD)以减小模型大小
用处 基于SVD实现模型压缩以适配低功耗平台 根据nnet3bin/nnet3-copy,nnet3-copy或nnet3-am-copy的"--edits-config" ...
- xtu summer individual-4 A - Beautiful IP Addresses
Beautiful IP Addresses Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on Code ...
- 解决在使用Amoeba遇到的问题
最近有同行在使用Amoeba 的过程中多少遇到了一些问题. 总结一下遇到问题的解决方法: 1.读写分离的时候设置的在queryRouter中设置无效? 读写分离配置的优先级别: 1)满足 ...
- MySQL Workbench基本操作
MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具.它是著名的数据库设计工具DBDesigner4的继任者.你可以用MySQL Workbench设计和创建新的数据库图示,建 ...
- Journey CodeForces - 839C
There are n cities and n - 1 roads in the Seven Kingdoms, each road connects two cities and we can r ...
- GNS3模拟的硬件
Hardware emulated by GNS3 Cisco 1700 Series 1700s have one or more interfaces on the motherboard, 2 ...