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 ...
随机推荐
- <Redis> 入门四 Jedis操作Redis
pom依赖 <dependencies> <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> < ...
- linux netstat-查看Linux中网络系统状态信息
博主推荐:更多网络测试相关命令关注 网络测试 收藏linux命令大全 netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况. 语法 netstat(选项) ...
- PHP:压缩 Zip
文章来源:http://www.cnblogs.com/hello-tl/p/7661222.html <?php # 文件字符集 header("Content-type: text ...
- virtualenvwrapper.sh: There was a problem running the initialization hooks. If Python could not import the module virtualenvwrapper.hook_loader, check that virtualenvwrapper.........(解决办法)
Linux(ubuntu)上python2与python3共存环境下,安装virtualenvwrapper后, 其环境变量被自动设置为VIRTUALENVWRAPPER_PYTHON=/usr/bi ...
- 【BZOJ 2118】 墨墨的等式(Dijkstra)
BZOJ2118 墨墨的等式 题链:http://www.lydsy.com/JudgeOnline/problem.php?id=2118 Description 墨墨突然对等式很感兴趣,他正在研究 ...
- git-github 提示Permission denied (publickey) (windows)
这种绝大多数情况是由于公钥设置的问题. 1.生成公钥 参考地址:https://help.github.com/articles/generating-a-new-ssh-key-and-adding ...
- 慕课笔记利用css进行布局【三列布局】
三个div中间自适应,两侧固定大小 <html> <head> <title>三列布局</title> <style type="tex ...
- java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.views.login_jsp
背景:SpringBoot的项目配置了对jsp的支持,走控制器就报这个错误.相关配置如下: <!-- JSP BEGIN --> <dependency> <groupI ...
- 洛谷P1710地铁涨价
题目背景 本题开O2优化,请注意常数 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地 ...
- JDBC操作MySQL出现:This result set must come from a statement that was created with a result set type of ResultSet.CONCUR_UPDATABLE, ...的问题解决
错误如下: This result set must come from a statement that was created with a result set type of ResultSe ...