cf 843 A Sorting by Subsequences [建图]
题面:
思路:
这道题乍一看有点难
但是实际上研究一番以后会发现,对于每一个位置只会有一个数要去那里,还有一个数要离开
那么只要把每个数和他将要去的那个位置连起来,构成了一个每个点只有一个入边一个出边的一张图
那么在这张图里的一个环,就代表着一个满足条件的子序列
所以只要把图建出来以后,统计图中的每一个环就可以了
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
inline int read(){
int re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
int n,first[],cnt,tot;
bool vis[];
struct edge{
int to,next;
}a[];
struct node{
int val,num;
}x[];
priority_queue<int,vector<int>,greater<int> >q[];
bool cmp(node l,node r){
return l.val<r.val;
}
inline void add(int u,int v){
// cout<<u<<ends<<v<<endl;
a[++cnt]=(edge){v,first[u]};first[u]=cnt;
}
void dfs(int u,int now){
// cout<<"dfs "<<u<<ends<<now<<endl;
vis[u]=;q[now].push(u);
int i,v;
for(i=first[u];~i;i=a[i].next){
v=a[i].to;
if(vis[v]) return;
dfs(v,now);
}
}
int main(){
memset(first,-,sizeof(first));
int i,j;
n=read();
for(i=;i<=n;i++){
x[i].val=read();x[i].num=i;
}
sort(x+,x+n+,cmp);
for(i=;i<=n;i++){
add(i,x[i].num);
}
for(i=;i<=n;i++){
if(!vis[i]) dfs(i,++tot);
}
printf("%d\n",tot);
for(i=;i<=tot;i++){
printf("%d",q[i].size());
while(!q[i].empty()) printf(" %d",q[i].top()),q[i].pop();
printf("\n");
}
}
cf 843 A Sorting by Subsequences [建图]的更多相关文章
- CF 843 A. Sorting by Subsequences
A. Sorting by Subsequences You are given a sequence a1, a2, ..., an consisting of different integers ...
- [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)
[Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...
- CF467D Fedor and Essay 建图DFS
Codeforces Round #267 (Div. 2) CF#267D D - Fedor and Essay D. Fedor and Essay time limit per test ...
- poj 3648 2-SAT建图+topsort输出结果
其实2-SAT类型题目的类型比较明确,基本模型差不多是对于n组对称的点,通过给出的限制条件建图连边,然后通过缩点和判断冲突来解决问题.要注意的是在topsort输出结果的时候,缩点后建图需要反向连边, ...
- Codeforces Round #523 (Div. 2) E. Politics(最小费+思维建图)
https://codeforces.com/contest/1061/problem/E 题意 有n个点(<=500),标记第i个点的代价a[i],然后分别在这n个点建两棵树,对于每颗树的每个 ...
- cf 786 B 线段树优化建图
cf 786 B 链接 CF 思路 n个点,3种建边方式,规模\(O(n^2)\) 线段树优化建图 注意 读入的数据好坑啊,说好的v,u变成了u,v. 两棵树,一棵出,一棵入.线段树的作用只不过是按照 ...
- 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流
1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 388 Solved: 212[Submit ...
- 【BZOJ-4289】Tax 最短路 + 技巧建图
4289: PA2012 Tax Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 168 Solved: 69[Submit][Status][Dis ...
- UVa 3487 & 蜜汁建图
题意: 有两家公司都想向政府申请某些资源的使用权,并且他们都提供了一些申请列表,列表中含有申请费用和资源种类,同一家公司的申请列表之间不含有重复的资源.政府只可以完整地接受和拒绝谋一份申请列表,问政府 ...
随机推荐
- cf1151 B
题目连接 : https://codeforces.com/contest/1151/problem/B 可能我想法有问题,我怎么感觉B题的思路不直接想出来的,我想了一会才想出来,感觉不难,但可能有更 ...
- Java构造方法经典例题
1.在程序中,经常要对时间进行操作,但是并没有时间类型的数据.那么,我们可以自己实现一个时间类,来满足程序中的需要. 定义名为MyTime的类,其中应有三个整型成员:时(hour),分(minute) ...
- Vue 恢复初始值的快速方法
vue 中经常定义很多data ,在用户进行一些操作后,需要讲data中的某个对象定义为初始值 例如 form: { title: '', describe: '', inspectionCatego ...
- 51nod——1285 山峰和分段(暴力出奇迹)
要求每段的点数都一样,因此分的段数cnt肯定是n的因子,要求每段都有山峰,因此cnt肯定小于等于山峰数量.分段的宽度d=n/cnt,对山峰数量做一个前缀和,检查一下每一段的山峰数量是否没有增加即可. ...
- yum 安装percona mysql 5.7
Mysql5.7安装准备 1.基础信息: (1)可参考官方文档[https://www.percona.com/doc/percona-server/5.7/installation/yum_repo ...
- Java 批量文件压缩导出,并下载到本地
主要用的是org.apache.tools.zip.ZipOutputStream 这个zip流,这里以Execl为例子. 思路首先把zip流写入到http响应输出流中,再把excel的流写入zip ...
- (82)zabbix如何选择适合的监控类型
zabbix提供十几种监控类型,包括:Zabbix agent, Simple checks, SNMP, Zabbix internal, IPMI, JMX monitoring等等,那我们应该如 ...
- 二十七、MySQL 复制表
MySQL 复制表 如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的. 本章节将为大家介绍如何完 ...
- 十三、MySQL WHERE 子句
MySQL WHERE 子句 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据. 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中. 语法 以下是 ...
- 使用VUE开发
<一>VUE的开发分两种,一种是直接在HTML文件中使用,一种是VUE文件的形式开发 1,首先我们先让 HTML 文件支持 VUE 的语法指令提示 2,File -> Setting ...