上一页 1 2 3 4 5 6 7 ··· 17 下一页
摘要: 题意:Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting from 0) Q A B: output the length of the longest consecutive increasing subsequence (LCIS) in [a, b].分析:区间合并类线段树。 las[maxn<<2] 区间左端起最长的序列长度 ras[maxn<<2] 区间右端起最长的序列长度mov[maxn<<2]区间最优值#in 阅读全文
posted @ 2012-09-25 23:39 'wind 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 题意: 一个人有一把剑,剑有一个耐久度m,现在有n个敌人,每个敌人都对应一个ai值和bi值,ai表示 杀掉这个敌人需要消耗ai的的武器耐久度,同时可以获得他的剑并且可以用他的剑杀死bi个敌人, 问最多可以杀掉多少个敌人。分析: 有两种情况: ①只杀 bi为 0 的; ②杀了某个bi不为 0 的敌人,那么所有bi不为 0 的最后都会被杀掉, 这种情况只要枚举多少个bi不为0 的敌人是花自己的耐久度去杀的,找一个最优解 要让用耐久度杀的敌人消耗的耐久度尽可能小,需要实现按照ai排序,找ai最小的每次。#include<cstdio>#include<cstring>#inc 阅读全文
posted @ 2012-09-24 20:46 'wind 阅读(1461) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n+1 个城市编号 0..n,有 m 条无向边,在 0 城市有个警察总部,最多可以派出 k 个逮捕队伍,在1..n 每个城市有一个犯罪团伙, 每个逮捕队伍在每个城市可以选择抓或不抓,如果抓了 第 i 个城市的犯罪团伙,第 i-1 个城市的犯罪团伙就知道了消息 ,如果第 i-1 的犯罪 团伙之前没有被抓,任务就失败,问要抓到所有的犯罪团伙,派出的队伍需要走的最短路是多少。 分析: 最小费用最大流,需要注意的地方在于怎么去保证每个每个城市的团伙仅仅被抓一次,且在抓他之前,第i-1城市的团伙已经被抓。 方法是把拆点后的城市 i 和 i`之间的费用要设成一个很小的负值,这样可以保证该城市一 阅读全文
posted @ 2012-09-24 19:59 'wind 阅读(676) 评论(0) 推荐(0) 编辑
摘要: 题意: 有n 个数从1 到 n 有序排好,对应两种操作: 1 x y p 找出区间【x,y】内与p互质的数的和 2 x c 将第x位置的数变成 c分析: 由于修改的次数比较少,可以先计算出没有修改时候指定区间内与p 互质的数的和,再去根据替换的数去修改, 找出连续数字区间内与p 互质数的和可以先将p分解质因数,然后用容斥原理快速的计算出区间满足条件的数的 和即可。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))#define maxn 400005bool v[maxn];int 阅读全文
posted @ 2012-09-24 18:36 'wind 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 0到 n 个格子,掷骰子走路,求出到终点的数学期望,有飞行的路线。分析: 求出用dp[x]表示走到x这个位置的数学期望假如x能到达6个格子x1,x2,..x6,那么dp[x]中x格子的期望就是它到6个格子的概率 分别乘以6个格子的期望,因为是从后往前推的,所以x1...x6的期望已经知道了x的期望也就能知道了,然后再+1因为要多走一步。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))#define maxn 100005struct node{ int to,next 阅读全文
posted @ 2012-09-22 19:44 'wind 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 头牛,知道了m 对牛之间的关系,问最少还需要知道多少对牛的关系才能确定所有牛之间的关系。分析:n个节点,共有n*(n-1)/2个对应关系,要确定所有关系即确定这 n*(n-1)/2个对应关系, 对于已经给出的m个关系,用传递闭包求出已经确定的关系总数res, 对于剩下的n*(n-1)/2-total个关系,由传递闭包的性质知:如果节点i和节点j之间的关系不确定,那他们之间在原图中时相对独立的,而每次询问的答案又都是 不确定的,所以需要对于这些关系全部进行询问才能知道全序关系节点数比较多,在传递闭包的时候要用邻接表实现.#include<stdio.h>#includ 阅读全文
posted @ 2012-09-20 18:52 'wind 阅读(340) 评论(0) 推荐(0) 编辑
摘要: 题意: 有n 个人走在一条路上,其中一些人可能是一个组的,每个人都说出了自己所在组前方的人数和后方的人数,问最多有多少人说的是真话。分析: dp[i][j] 表示从第 i +1 个人到第 j 个人为一组时的最优值 t[i][j] 表示描述中从第 i +1 个人到第 j 个人为一组的数量 注意的是: t[i][j]的值不可能超过 n-(j-i+1) s[i]保存以第 i 个人为结尾的最优值 转移方程: dp[i][j]=s[i]+t[i][j] s[j] = max (s[j],dp[i][j])#include<stdio.h>#include<string.h>#de 阅读全文
posted @ 2012-09-18 09:38 'wind 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 题意: 有n个城市,有个小偷想从其中一个城市逃到另一个城市,警察想要堵截这个小偷,知道了在每个城市堵截的成本,问如何安排在哪些城市堵截可以使得 小偷一定会被抓住,而且成本最低。分析: 最小割模型,城市有成本限制,需要差点来限制,具体建图方法: 将每个城市 i 拆成两个点 i 和 i + n, 之间连一条容量为该点花费的边,如果 城市 a 和 b 连通,则在 a+n 和 b, b+n 和 a 之间连一条容量为无穷的的边, 这样可以保证最大流量即花费仅受到顶点容量的限制, 如果 起点为 S ,终点为 D ,求出 点S 到 点 D+n 的最大流即为满足条件的最小割。#include<stdio 阅读全文
posted @ 2012-09-18 09:08 'wind 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 题意:给出 n 个木板的重量值和长度 然后每个木板的PDV = 压在他上面的木板的重量值之和-该木板的长度值求所有木板中PDV值最大的最小给出一个 n 表示木板的数量接下来 n 行表示每块木板的重量值和长度值求PDV最大的最小分析:①如果排序为 a b 则a的PDV = sum-wb b的PDV = sum+wa-sb②如果排序为 b a 则b的PDV = sum-sb a的PDV = sum+wb-sa要想第一种方法要想最大值的PDV < 第二种方法最大值则 wa+sa < wb+sb所以排序然后找这种最优方法中的最大值#include<stdio.h>#includ 阅读全文
posted @ 2012-09-18 08:47 'wind 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 题意: 有连续 n 个操作,一开始集合为空,对应有三种操作: add x :如果x 不在集合中,加入 x 到集合中 del x: 如果x 在集合中,删除之 sum: 集合中存在的数排好序之后输出满足 序号%5=3 的数值的和分析:每个区间维护两个数组num[i] i 区间内部不同数值的个数 s[i][5] i 区间内部数值序号对 5 取模后各种情况的和#include<stdio.h>#include<string.h>#include<map>#include<algorithm>using namespace std;#define maxn 阅读全文
posted @ 2012-09-18 08:37 'wind 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 题意: 求 g(g(g(n))) mod 109+ 7 ,其中g(n)=3*g(n-1)+g(n-2), g(0)=0,g(1)=1;分析: 当n 的3的时候内部就超精度了,需要本地暴力找出每层的循环节,最外面的对1000000007取模,找最外层循环节222222224, 在对222222224取模, 找到次一层循环节183120,这样就可以通过三次快速幂求出结果了g(g(g(n)))%1000000007 = g(g(g(n)%183120)%222222224)%1000000007#include<stdio.h>#include<string.h>void m 阅读全文
posted @ 2012-09-17 00:21 'wind 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 F种食物和D种饮料,知道了每种食物和饮料的数量,有n 个人,知道了这些人分别喜欢的食物和饮料,当每个人能够吃到自己喜欢的一个食物和喝到自己喜欢 的一种饮料,他就会开心,问最多能有多少人可以开心。分析:在 源点 和 每种食物之间 连一条边,容量为 食物的数量,将每头牛拆成两个点,将每头牛的第一个点和第二个点之间连一条容量为 1 的边,在每头牛喜欢的食物和该牛的第一个点之间连一条容量为 1 的边,在每头牛喜欢的饮料和该牛的第二个点之间连一条容量为 1 的边,在 汇点 和每种饮料之间连一条容量为饮料数量 的边,求最大流。#include<stdio.h>#include< 阅读全文
posted @ 2012-09-16 18:26 'wind 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 题意:已知有 2*n个敌人,用枪射击n 次,每次消灭2个敌人,消耗的能量为自己所在位置到第一个敌人的距离加上第一个敌人到第二个敌人的距离,问消灭 所有敌人所需要消耗的最少能量是多少。分析:状态DP: 由于每两个敌人消灭的时间不影响答案,所以只需要一维的DP保存所有可能的组合状态即可 转移方程:dp[i] = min (dp[i], dp[i+(1<<i)+(1<<j)]+dis)#include<stdio.h>#include<string.h>#include<math.h>#define clr(x)memset(x,0,siz 阅读全文
posted @ 2012-09-16 09:34 'wind 阅读(338) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了一个数轴,对应两种操作 0 x 在x位置放置一个食物 1 让小强吃掉一个距离它最近的一个食物,如果左右食物距离一样,方向取和上一次的那个一样 小强一开始在位置0,问最后小强经过的最短距离是多少分析: 开两个有限队列,分别保存小强左面食物的位置和右面食物的位置,模拟过程即可。#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>using namespace std;#define maxn 100005#define clr(x)memset(x,0 阅读全文
posted @ 2012-09-15 17:55 'wind 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个变元,给出了 m 个他们中的一些元素的关系,问是否存在合法的取值方案。分析: 典型的2—SAT,在有冲突的取值方案之间连边, x 表是x取真,x+n表示x取假 建图:a and b ==1 , !a->a , !b -> ba and b ==0 , a->!b , b->!a a or b ==1 , !a->b , !b->a a or b ==0 , a->!a , b->!b a xor b ==1 , a->!b,!b->a,!a->b,b->!a a xor b ==0 , a->b,b 阅读全文
posted @ 2012-09-15 13:12 'wind 阅读(257) 评论(0) 推荐(0) 编辑
摘要: 题意:n个点的一棵树,其中有k个敌人所在结点,要破坏一些边使得这 k 个点互不可达,求出破坏边的最小权值和。分析:对于有n个结点的树,删除任意的k (k<=n-1)条边都能将原树分成k+1个部分 按照题意至少需要将原树划分成 k 个部分(此时每部分中都包含一个敌人的点),删除的边数为k-1。 类似kruskal最小生成树的过程,不过此处将边按权值从大到小排列,每次将边加进来时要判断是否会使两个危险的 点连通,是的话这条边就是需要被删除的,否则将它加到树上。#include<stdio.h>#include<string.h>#include<stdlib.h 阅读全文
posted @ 2012-09-15 11:40 'wind 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个物品,每个物品都有一定的价值和花费,而且买的时候自己的钱不能低于那个物品的指标,问最后可以买到的物品的最大价值是多少。分析: 需要对物品按 qi-pi 的值从小到大排序,因为这样可以保证每次更新的状态值从小到大递增,前面更新过的状态不会影响后面更新的状态。#include<stdio.h>#include<string.h>#include<algorithm>#define clr(x)memset(x,0,sizeof(x))#define max(a,b)(a)>(b)?(a):(b)using namespace std;st 阅读全文
posted @ 2012-09-15 08:46 'wind 阅读(644) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个货物,并且知道了每个货物的重量,每次用载重量分别为c1,c2的火车装载,问最少需要运送多少次可以将货物运完。分析: 找出所有状态(1.....(1<<n)-1)中选出可以用两辆车一次运完的状态 把每个状态都看作一个物品,重量为该状态的总重量,价值为 1求解 01 背包,dp[(1<<n)-1]为最优解 转移方程: dp[stat|j]=min(dp[stat|j],dp[j]+1) 注意 stat 和 j 不能有交集#include<stdio.h>#include<string.h>#define clr(x)memset(x 阅读全文
posted @ 2012-09-14 22:10 'wind 阅读(851) 评论(0) 推荐(0) 编辑
摘要: 题意: Alice 和 Bob在一颗树上轮流走,知道了每条边的长度,Alice想走的权值和尽量小,Bob想走尽量大,同时所走的权值和必须在[L, R]这个给定的区间内, Bob先走,问Bob 能得走的最大的权值和是多少? 如果还能走,Alice就不能停下来。分析: dp[r] 表示到节点 r 的最优值,从叶子递归,Alice选每次最小走,Bob选最大走,d[u]表示从跟到节点u的距离, d[u]+dp[t]+cost(u, t) 必须在[L, R]之间才转移#include<stdio.h>#include<string.h>#define INF 0x1f1f1f1f 阅读全文
posted @ 2012-09-13 23:48 'wind 阅读(466) 评论(0) 推荐(0) 编辑
摘要: 题意: 一个有 N 个节点的树形的地图,知道了每条变经过所需要的时间,现在给出时间T,问能不能在T时间内从 1号节点到 N 节点。每个节点都有相对应的价值,而且每个价值只能被取一次,问如果可以从1 号节点走到 n 号 节点的话,最多可以取到的最大价值为多少。分析:先求出从 1 号节点到 n 号节点的最短路,如果花费大于时间 T,则直接输出不符合, 将最短路上的权值全部赋值为 0, 在总时间 T 上减去 最短路的长度,表示最短路已经走过,对其它点进行树形背包求解, 需要注意的是如果不是最短路上的边都要走两次,即走过去还要再走回来, 状态转移方程: dp[i][j]=max(dp[i][j],dp 阅读全文
posted @ 2012-09-13 20:14 'wind 阅读(578) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个电灯泡,知道了每个电灯泡的坐标和覆盖半斤,为最多可以去掉多少电灯泡使得 1,2,3,号电灯泡的灯光任然相连。分析: 分别以 1,2,3为源点求最短路,找到一个点到这三个点的距离和最小值sum,答案即为 n - sum - 1#include<stdio.h>#include<queue>#include<string.h>using namespace std;#define INF 0x1f1f1f1f#define clr(x)memset(x,0,sizeof(x))#define maxn 205struct node{ int t 阅读全文
posted @ 2012-09-13 00:55 'wind 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了一些集合的包含关系,问至少还要知道多少个包含关系才能证明这些集合是相互等价的。分析: 看出是强连通分量的模型就不难了。 最少加多少对关系使得每个集合等价,相当于在图中加入一些边,使得原图任意两个点互达即强连通, 找出这个边数即可。#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) 编辑
摘要: 题意: 有n 个金矿,每个金矿开发需要一定的价值,开发之后可以获得一定的价值,而且一些金矿受到另一些金矿的限制,即开采这个金矿之前要开采 限制它的金矿,问最多可以获得多少价值。分析: 比较明显的最大闭合权图。 建图:如果某个金矿的开发利润为正值,就在源点和该点之间连一条容量为该利润的边 如果某个金矿的开发利润为负值,就在该点和汇点之间连一条容量为该利润绝对值的边 如果某个金矿收到另一个金矿的限制,就在两个金矿之间连一条容量为INF的边。 累计所有正值利润的和 sum,获得的最大利润为sum - maxflow#include<stdio.h>#include<string.h 阅读全文
posted @ 2012-09-11 17:36 'wind 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一些按键顺序和一个字典,问每个按键顺序可以对应字典中多少个单词。分析: 直接模拟之。#include<stdio.h>#include<string.h>#include<string>#include<map>using namespace std;int a[33];void init(){ int i; for(i=0;i<15;i++) a[i]=i/3+2; for(;i<19;i++) a[i]=7; for(;i<22;i++) a[i]=8; for(;i<26;i++) a[i]... 阅读全文
posted @ 2012-09-11 08:27 'wind 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 题意: 已知K,找出 满足等式 X^Z + Y^Z + XYZ = K 的X,Y,Z组合数。分析:固定X,Z,二分枚举Y。#include<stdio.h>#include<string.h>#include<math.h>#define clr(x)memset(x,0,sizeof(x))long long x[50000];int main(){ long long top,i,k,z; while(scanf("%I64d",&k),k) { top=0; clr(x); for(i=1;i*i<=k;i++) .. 阅读全文
posted @ 2012-09-11 08:04 'wind 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了连续的 n 个数的 值,有两种操作: 1 a b kc: adding c to each of Ai which satisfies a <= i <= b and (i - a) % k == 0 2 a :means querying the value of a分析:因为k比价小,可以多个树状数组,根据 i%k的不同建立k 个树状数组,每次修改操作对其中 1 棵树状数组进行操作 每次查询对其中10个树状数组统计结果累加。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0 阅读全文
posted @ 2012-09-10 21:26 'wind 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 题意: 有N 个点的无向图,要去其中 h个地点做事,做事需要先办理护照,之后可以挣一定数量的钱,知道了一开始有的总钱数,和 一些城市之间道路的花费,问可不可以在 指定的 h 个城市打完工,并回到起点 1.分析: 状态DP,直接枚举所有可能状态即可。#include<stdio.h>#include<string.h>#define max(a,b)(a)>(b)?(a):(b)#define INF 0x3f3f3f3fint g[155][155];int dp[1<<16][16];int num[22];int earn[22];int cost 阅读全文
posted @ 2012-09-10 19:00 'wind 阅读(593) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 ··· 17 下一页