cf 843 A Sorting by Subsequences [建图]

题面:

传送门

思路:

这道题乍一看有点难

但是实际上研究一番以后会发现,对于每一个位置只会有一个数要去那里,还有一个数要离开

那么只要把每个数和他将要去的那个位置连起来,构成了一个每个点只有一个入边一个出边的一张图

那么在这张图里的一个环,就代表着一个满足条件的子序列

所以只要把图建出来以后,统计图中的每一个环就可以了

Code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7 inline int read(){
 8     int re=0,flag=1;char ch=getchar();
 9     while(ch>‘9‘||ch<‘0‘){
10         if(ch==‘-‘) flag=-1;
11         ch=getchar();
12     }
13     while(ch>=‘0‘&&ch<=‘9‘) re=(re<<1)+(re<<3)+ch-‘0‘,ch=getchar();
14     return re*flag;
15 }
16 int n,first[100010],cnt,tot;
17 bool vis[100010];
18 struct edge{
19     int to,next;
20 }a[200010];
21 struct node{
22     int val,num;
23 }x[100010];
24 priority_queue<int,vector<int>,greater<int> >q[100010];
25 bool cmp(node l,node r){
26     return l.val<r.val;
27 }
28 inline void add(int u,int v){
29 //    cout<<u<<ends<<v<<endl;
30     a[++cnt]=(edge){v,first[u]};first[u]=cnt;
31 }
32 void dfs(int u,int now){
33 //    cout<<"dfs "<<u<<ends<<now<<endl;
34     vis[u]=1;q[now].push(u);
35     int i,v;
36     for(i=first[u];~i;i=a[i].next){
37         v=a[i].to;
38         if(vis[v]) return;
39         dfs(v,now);
40     }
41 }
42 int main(){
43     memset(first,-1,sizeof(first));
44     int i,j;
45     n=read();
46     for(i=1;i<=n;i++){
47         x[i].val=read();x[i].num=i;
48     }
49     sort(x+1,x+n+1,cmp);
50     for(i=1;i<=n;i++){
51         add(i,x[i].num);
52     }
53     for(i=1;i<=n;i++){
54         if(!vis[i]) dfs(i,++tot);
55     }
56     printf("%d\n",tot);
57     for(i=1;i<=tot;i++){
58         printf("%d",q[i].size());
59         while(!q[i].empty()) printf(" %d",q[i].top()),q[i].pop();
60         printf("\n");
61     }
62 }

原文地址:https://www.cnblogs.com/dedicatus545/p/8455281.html

时间: 2024-11-06 07:18:51

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. It is required to split this sequence into the maximum number of subsequences such that after sorting integers in each of them in increasing order,

SPOJ 839 Optimal Marks 最小割 经典 按位建图

胡伯涛论文中的一题,经典建模,由于二进制每一位异或不会相互影响,所以我们把问题转换模型,按位处理. 即已知一些点的标号0/1(还有些可以自己任意改),和一些边,边权定义为两端点标号的异或,要求边权和最小的标号方案. 我们联想到最小割求的是从源到汇容量最小的边权和. 建图: 标号为1的和源点相连,容量INF,标号为0的和汇点相连,容量INF,这些边是不能割掉的(这些点标号已经明确) 原图相连的边,连边,容量为1.(若将此边割掉,则两端点一个为0,一个为1,割为1) 跑完最大流后,在残量网络中dfs

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)

题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给出火警位置所在的交叉路口 和 一个或多个消防站所处的交叉路口位置.输出要求按消防站到火警位置所需时间从小到大排列,输出信息包括消防站位置(初始位置),火警位置(目标位置),所需时间,最短路径上每个交叉路口. 题解:反向建图,从火警位置求一次最短路,求最短路时记录路径,按时间从小到大输出. 1 #in

HDU5772 String problem 最大权闭合图+巧妙建图

题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得分) 第二类:原串中的n个点每个点拆出一个点,第i个点权值为 –a[s[i]] (表示要花费) 第三类:对于10种字符拆出10个点,每个点的权值为  -(b[x]-a[x]) 那么我们可以得到一个关系图 ,对于第一类中的点Pij,如果想要选择Pij,你就必须要选中第二类中的点i和j,对于第二类中的点

4205: 卡牌配对 最大流+建图技巧

很明显该题应该是二分图最大匹配,但该题不可能N^2建图,那么我们要怎么办呢?而且有三个属性. 注意到 Ai <= 200 而且 200 以内的质数只有49个,那么我们就可以对着仅有的49个质数下毒手了.很明显如果 Ai 与 Aj 不互质的话, 两者应该有一个共同质因子. B和C同理. 那么我们可以在S集和T集中间建3层质因子的墙,分别为A和B, B和C, C和A. 只有当 Ai 被第 x 个质因子整除, Bi 被第 y 个质因子整除时, 我们从 i 往 P[0][x][y] 连边. 其他同理.

HDU5669 Road 分层最短路+线段树建图

分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) ?的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维护整个图, 连边时候找到对应区间,把线段树的节点之间连边.这样可以大大缩减边的规模,然后再跑分层图最短路就可以了. 但是这样建图,每一次加边都要在O(logn)个线段树节点上加边,虽然跑的非常快,但是复杂度仍然是不科学的. 为了解决边的规模的问题,开两棵线段树,连边时候可以新建一个中间节点,在对应区

HDU3572Task Schedule(最大流 ISAP比较快)建图方法不错

Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5007    Accepted Submission(s): 1636 Problem Description Our geometry princess XMM has stoped her study in computational geometry t

POJ 2112 最大流+二分+(建图:最重要的)

Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 12521   Accepted: 4524 Case Time Limit: 1000MS Description FJ has moved his K (1 <= K <= 30) milking machines out into the cow pastures among the C (1 <= C <= 200) co