摘要: 题意: 知道了一些集合的包含关系,问至少还要知道多少个包含关系才能证明这些集合是相互等价的。分析: 看出是强连通分量的模型就不难了。 最少加多少对关系使得每个集合等价,相当于在图中加入一些边,使得原图任意两个点互达即强连通, 找出这个边数即可。#include<stdio.h>#include<string.h>#define maxn 20002#define clr(x)memset(x,0,sizeof(x))struct node{ int to,next;}e[1000000];int tot;int head[maxn];void add(int s,int 阅读全文
posted @ 2012-09-12 23:07 'wind 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 只cat和 m只dog,有 c 个小朋友,知道了每个小朋友喜欢的动物和不喜欢的动物,现在可以将其中一些动物移走,如果剩下的动物中有 某个小朋友喜欢的而没有他不喜欢的,这个小朋友就会很高兴,问最多可以让多少小朋友高兴。分析: 二分图最大独立集,如果某个小朋友和另一个小朋友有冲突即其中一个小朋友喜欢的动物是另一个小朋友讨厌的,或者他讨厌的是另一个小朋友 喜欢的话,就在两个小朋友之间连一条边,求出最大匹配, 最大独立集= 总权- 最大匹配/2(因为有重复)#include<stdio.h>#include<string.h>#define clr(x)mems 阅读全文
posted @ 2012-09-12 21:52 'wind 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了一段序列的值,有m 个询问,输出询问区间内不同数字的和。分析:可以用离线的方法记录所有的询问,并按每个询问右区间的值排序,然后逐个插入数值,如果某个数值之前出现过,就将之前那个位置上的那个 数删除,并在新的位置上插入数值,如果当前插入数值的序号等于某个询问的右区间,就统计该询问区间的不同数值的值,由于数值比较大,需 要进行离散化,离散化可以用 hash 或 二分,将每个值映射到一个较小的数值上,以便用数组标记。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<alg 阅读全文
posted @ 2012-09-12 18:13 'wind 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个数,从做到到右依次为1..n,有m 组操作,每次输入一个值k,讲序列中的第k大元素取出,问最后取到的数字的和为多少。分析: 线段树,num[] 表示该区间有多少个数。#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define clr(x)memset(x,0,sizeof(x))#define maxn 270000int num[maxn<<3];void creat(int l,int r,int rt){ if(l==r 阅读全文
posted @ 2012-09-12 13:00 'wind 阅读(160) 评论(0) 推荐(0) 编辑