[第一波模拟\day3\T2]{独立集}(bubble.cpp)
【问题描述】
有一天,一个名叫顺旺基的程序员从石头里诞生了。又有一天,他学会了冒泡排序和独立集。在一个图里,独立集就是一个点集,满足任意两个点之间没有边。于是他就想把这两个东西结合在一起。众所周知,独立集是需要一个图的。那么顺旺基同学创造了一个算法,从冒泡排序中产生一个无向图。
这个算法不标准的伪代码如下:
|
Pascal版本 |
C/C++版本 |
|
procedure bubblesortgraph(n, a[]) : /*输入:点数n,1到n的全排列a。 输出:一个点数为n的无向图G。*/ 创建一个有n个点,0条边的无向图G。 repeat swapped = false for i 从 1 到 n-1 : if a[i] > a[i + 1] : 在G中连接点a[i]和点a[i + 1] 交换a[i]和a[i + 1] swapped = true until not swapped 输出图G。 //结束。 |
void bubblesortgraph(n,a[]) //输入:点数n,1到n的全排列a //输出:一个点数为n的无向图G { 创建一个有n个点,0条边的无向图G。 do{ swapped=false for i 从1 到n-1 if(a[i]>a[i+1]) { 在G中连接点a[i]和点a[i+1] 交换a[i]和a[i+1] swapped =true } }while(swapped); 输出图G。 } //结束。 |
那么我们要算出这个无向图G最大独立集的大小。但是事情不止于此。顺旺基同学有时候心情会不爽,这个时候他就会要求你再回答多一个问题:最大独立集可能不是唯一的,但有些点是一定要选的,问哪些点一定会在最大独立集里。今天恰好他不爽,被他问到的同学就求助于你了。
【输入】
输入包含两行,第一行为N,第二行为1到N的一个全排列。
【输出】
输出包含两行,第一行输出最大独立集的大小,第二行从小到大输出一定在最大独立集的点的编号。
【输入输出样例】
|
bubble.in |
bubble.out |
|
3 3 1 2 |
2 2 3 |
【样例说明】
如上图,顶点1和2一定在最大独立集中,其对应的编号为2和3。
【数据范围】
30%的数据满足 N<=16
60%的数据满足 N<=1,000
100%的数据满足 N<=100,000
【题解】
很经典的操作,求最长上升子序列的不动点和唯一点的交
#include <stdio.h>
#include <string.h>
#define RG register
#define oo 0x7fffffff
inline void read(RG int &x)
{
RG int c = getchar();
while(c < '0' || c > '9') c = getchar();
for(x = 0; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + c - '0';
}
int n, a[100003], d[100003], len, f[100003], g[100003], hash[100003];
int main()
{
freopen("bubble.in", "r", stdin), freopen("bubble.out", "w", stdout);
read(n);
for(RG int i = 1; i <= n; ++i) read(a[i]);
for(RG int i = 1; i <= n; ++i)
{
if(a[i] > d[len]) d[++len] = a[i], f[i] = len;
else
{
RG int L = 1, R = len, mid;
while(L <= R)
{
mid = L + R >> 1;
if(d[mid] >= a[i]) R = mid - 1;
else L = mid + 1;
}
d[L] = a[i];
f[i] = L;
}
}
len = 0, d[0] = oo;
for(RG int i = n; i; --i)
{
if(a[i] < d[len]) d[++len] = a[i], g[i] = len;
else
{
RG int L = 1, R = len, mid;
while(L <= R)
{
mid = L + R >> 1;
if(d[mid] <= a[i]) R = mid - 1;
else L = mid + 1;
}
d[L] = a[i];
g[i] = L;
}
}
for(RG int i = 1; i <= n; ++i)
if(f[i] + g[i] == len + 1) ++hash[f[i]];
printf("%d\n", len);
for(RG int i = 1; i <= n; ++i)
if(f[i] + g[i] == len + 1 && hash[f[i]] == 1)
printf("%d ", i);
fclose(stdin), fclose(stdout);
return 0;
}
[第一波模拟\day3\T2]{独立集}(bubble.cpp)的更多相关文章
- [第一波模拟\day3\T3]{益智游戏}(game.cpp)
[问题描述] 小P和小R在玩一款益智游戏.游戏在一个正权有向图上进行. 小P控制的角色要从A点走最短路到B点,小R控制的角色要从C点走最短路到D点. 一个玩家每回合可以有两种选择,移动到一个相邻节点或 ...
- [第一波模拟\day1\T2]{分班}(divide.cpp)
[题目描述] 小N,小A,小T又大了一岁了. 现在,他们已经是高二年级的学生了.众所周知,高二的小朋友是要进行文理科分班考试的,这样子的话,三个好朋友说不定就会不分在一个班. 于是三个人决定,都考平均 ...
- 【2018.06.26NOIP模拟】T2号码bachelor 【数位DP】*
[2018.06.26NOIP模拟]T2号码bachelor 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的性质 ...
- 模拟赛T2 交换 解题报告
模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...
- 雅礼 noip2018 模拟赛day3 T2
典型的状压思想 设0表示黑球,1表示白球,用一串01序列代表剩下的球的状态,记f[i]表示在i状态下取球的最大期望 那么可以利用记忆化搜索更新,每一层枚举可能拿走的球然后向下搜索,同时记忆化即可 在状 ...
- [第一波模拟\day2\T1] {病毒分裂}(split.cpp)
[题目描述] A 学校的实验室新研制出了一种十分厉害的病毒.由于这种病毒太难以人工制造了,所以专家们在一开始只做出了一个这样的病毒.这个病毒被植入了特殊的微型芯片,使其可以具有一些可编程的特殊性能.最 ...
- NOIP欢乐模拟赛 T2 解题报告
小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...
- 独立集(bubble) 题解
问题描述 有一天,一个名叫顺旺基的程序员从石头里诞生了.又有一天,他学会了冒泡排序和独立集.在一个图里,独立集就是一个点集,满足任意两个点之间没有边.于是他就想把这两个东西结合在一起.众所周知,独立集 ...
- noip模拟6(T2更新
由于蒟弱目前还没调出T1和T2,所以先写T3和T4.(T1T2更完辣! update in 6.12 07:19 T3 大佬 题目描述: 他发现katarina大佬真是太强了,于是就学习了一下kata ...
随机推荐
- C++构造函数与析构函数的解析
创建一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值. 注意,类的数据成员是不能在声明类时初始化的.如果一个类中所有的成员都是公用的,则可以在定义对象时对数据成员进行初始化.如: clas ...
- CSS3向上移动的效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Codeforces Round #544 (Div. 3) D. Zero Quantity Maximization
链接:https://codeforces.com/contest/1133/problem/D 题意: 给两个数组a,b. 同时ci = ai * d + bi. 找到一个d使c数组中的0最多. 求 ...
- Cake slicing UVA - 1629
UVA - 1629 ans[t][b][l][r]表示t到b行,l到r列那一块蛋糕切好的最小值d[t][b][l][r]表示t到b行,l到r列区域的樱桃数,需要预处理 #include<cst ...
- 优先队列 HDOJ 5437 Alisha's Party
题目传送门 题意:一人过生日,很多人排着队送礼物.排队顺序是礼物价值大的优先,如果相等先来的优先.有m次开门,当t个人到了会开门让p个人进门.最后一次让门外的所有人按顺序进门.有q次询问,问第x个进门 ...
- SUSAN角点检测
close all; clear all; I=imread('corner2.gif'); [posX,posY]=susan(I,); figure; imshow(I);hold on; plo ...
- shutil模块详解2
1.shutil.make_archive() 实际上是调用了两个模块来实现压缩打包的功能. zipfile和tarfile两个模块,shutil的两个封装的模块. zip是压缩文件,文件内存会变小, ...
- 洛谷P2763 试题库问题(最大流)
题意 $n$道试题,每道题有多种类别属性 抽取$m$道题组成试卷,要求包含指定的类型 输出方案 Sol 又是一道zz网络流 我的构图长这样,$k_i$表示第$i$道试题需要的数量 #include&l ...
- 【学习笔记】深入理解js原型和闭包(15)——闭包
前面提到的上下文环境和作用域的知识,除了了解这些知识之外,还是理解闭包的基础. 至于“闭包”这个词的概念的文字描述,确实不好解释,我看过很多遍,但是现在还是记不住. 但是你只需要知道应用的两种情况即可 ...
- pre-network android 网络优化预加载框架
网络优化是所有app开发中非常重要的一部分,如果将网络请求前置就是在点击跳转activity之前开始网络加载那么速度将会有质的提升.也就是网络预先加载框框架. 网络预加载框架,监听式网络前置加载框架- ...