NKOJ 3500 独立集(dp)
来源:互联网 发布:javascript focus用法 编辑:程序博客网 时间:2024/05/20 22:03
P3500【2015多校联训6】独立集
问题描述
输入格式
输入包含两行,第一行为 N,
第二行为 1 到 N 的一个全排列
输出格式
输出包含两行,第一行输出最大独立集的大小,第二行从小到大输出一定在最大独立集 的点的编号。
样例输入
3
3 1 2
样例输出
2
2 3
提示
30%的数据满足 N<=16
60%的数据满足 N<=1,000
100%的数据满足 N<=100,000
仔细观察,发现第一问就是最长上升子序列,因为逆序对才会连边,那么没有边相连的点一定是正序的,那么问题就是求最长正序,即最长上升子序列。
考虑第二问,优秀的做法做不来,搞个暴力。
假设以
从
如果讨论时发现某
优秀做法参见THH
代码:
#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>#include<set>#define N 100055using namespace std;set<int>Q[N],R[N];int n,A[N],F[N],B[N],id[N],ans;bool mark[N];int main(){ set<int>::iterator x,y,z; int i,j,k; scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d",&A[i]),id[A[i]]=i; memset(B,60,sizeof(B));B[0]=0;Q[0].insert(0); for(i=1;i<=n;i++) { F[i]=lower_bound(B+1,B+n+1,A[i])-B; B[F[i]]=A[i]; Q[F[i]].insert(A[i]); R[F[i]].insert(i); ans=max(ans,F[i]); } for(i=ans;i>=1;i--) { if(Q[i].size()==1) { x=Q[i].begin(); mark[*x]=1; } x=Q[i].end();x--; y=Q[i-1].lower_bound(*x); for(z=y;z!=Q[i-1].end();z++)R[i-1].erase(R[i-1].find(id[*z])); Q[i-1].erase(y,Q[i-1].end()); x=R[i].end();x--; y=R[i-1].lower_bound(*x); for(z=y;z!=R[i-1].end();z++)Q[i-1].erase(Q[i-1].find(A[*z])); R[i-1].erase(y,R[i-1].end()); } printf("%d\n",ans); for(i=1;i<=n;i++)if(mark[i])printf("%d ",id[i]);}
阅读全文
0 0
- NKOJ 3500 独立集(dp)
- nkoj 3500 独立集
- NKOJ-1979 投票<最大独立点集>
- NKOJ-1569 骑士共存 <最大独立集><染色法建图>
- NKOJ 1314 爬山(背包dp)
- NKOJ 3540 方块游戏(dp)
- NKOJ 1725 数字(数位dp)
- NKOJ 3545 接近(DP+单调队列)
- NKOJ 4191 Trie (状压dp)
- NKOJ 4250 小区划分(dp)
- NKOJ 2409 田忌赛马 (DP)
- NKOJ 2655 (HAOI 2010)计数(数位DP)
- NKOJ 3790 (SDOI 2009)学校食堂 (状压dp)
- NKOJ 1791 Party at Hali-Bula(树状DP)
- NKOJ 1791 Party at Hali-Bula(树状DP)
- NKOJ 3253 (CQOI 2015) 标识设计(状压DP)
- NKOJ 3761 送外卖(最短路+状压dp)
- NKOJ 3768 数列操作(单调队列/栈+DP)
- 实时可靠的开源分布式实时计算系统——Storm
- 两个关联的GridView,点击其中一个,另一个的状态发生变化,联动操作
- 数据结构--堆栈,列表--1
- C#读取xml文件
- Util工具类 对map中含有String类型的日期key值的list进行排序
- NKOJ 3500 独立集(dp)
- 内存泄漏(OOM)产生原因
- Apache ActiveMQ
- MIME
- ubuntu下neo4j的安装
- python的一些基础知识
- JS循环
- 采集页面的图片PHP+js+ajax
- 基于VirtualBox安装CentOS 6系统