- 博客(25)
- 资源 (2)
- 收藏
- 关注
原创 ZOJ 3696 Alien's Organ / 泊松分布
有遇到 奇葩的 前所未闻的东西 记一下观察事物平均发生m次的条件下,实际发生x次的概率P(x)p(k)=(y^k) / (k!) * e^(-y)吊炸天 这种东西做梦都想不到平均每天生产的λ 个,每天生产不超过n的可能性代码参考别人的#include #include #include int main(){ int T; int a; double b;
2014-01-31 16:04:16 1755
原创 UVa 11361 Investigating Div-Sum Property / 数位DP
先上代码 以后再说#include #include const int maxn = 110;int dp[maxn][maxn][maxn];int ok(int x, int k){ if(x < 10) return x / k; int a = x; int b = 1; int l = 0; while(a) { l++; a /= 10; b
2014-01-30 18:39:27 1213
原创 LA 3211 Now or later / 2-SAT
每架飞机只能在E L 这2个时间点降落 每2架并且降落的时间间隔必须大于等于p才算安全 目标使p尽量大二分时间间隔 做2-SAT 有解说明可行xi = true 表示选择E false 选择L如果 abs(Ei - Ej) 建图 上模版#include #include #include #include using namespace std;const int
2014-01-28 16:37:54 1343
原创 UVa 11077 Find the Permutations / 置换
把一个排列p变成1,2,...,n可以反过来看成1,2,...,n到p把p分解乘循环 如果一个循环有n个元素 需要n-1次交换dp[i][j] = dp[i-1][j] + dp[i-1][j-1] * (i-1); 代表i个元素 交换j次变成1,2,...,n,的种数对于元素i 他可以自己成为一个循环那么交换次数不变 种数+1 就是 dp[i-1][j]
2014-01-25 21:11:10 1415
原创 LA 4287 Proving Equivalences / 强连通分量
给你一些命题 求最小还需要几次可以证明所有的命题都等价一个强连通分量里面的题目都是等价的 只需缩点后 对于DAG图 入读为0和出度为0的点 两者之中最大值就是答案如果只有1个强连通分量 那么无需证明了#include #include #include #include using namespace std;const int maxn = 20010;vector G
2014-01-25 14:32:48 1149
原创 UVa 10870 Recurrences / 矩阵快速幂
给你一个数列的前d项 第n项(n > d) f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n - 3) + ... + ad f(n - d), for n > d.n很大 可以构造一个矩阵f(n) = A*f(n-1)例如n=50 1 0 0 0 f[1]
2014-01-24 21:42:23 1036
原创 LA 3641 Leonardo's Notebook / 置换
给出26个大写字母组成 字符串B问是否存在一个置换A使得A^2 = B书上的证明结论2个长度为n的相同循环相乘 n为奇数时结果为1个长度为n的循环 n为偶数时分裂成2个长度为n/2的循环倒过来对于一个长度为n为奇数的循环B都能找到一个长度为n的循环A使得A^2 = B 对应任意2个长度为n的不相交循环B,C 都能找到一个长度为2n的循环A 使得A^2 = BC所以对于B=(1,
2014-01-24 16:32:56 1151
原创 LA 2965 Jurassic Remains / 中途相遇法
求尽量多的字符串 每种大写字母出现偶数次每个字符串可以看成一个长度为26 出现奇数次对应位置为1 偶数为0就是求一些字符串 他们的异或为0n最大为242^24超时可以枚举前一半n/2所以的子集 存在map里然后枚举后一半看是否有和它相同的 相同的异或就为0枚举一半时间可以接受#include #include #include using namespace
2014-01-24 13:11:04 1303
原创 UVa 2678 Subsequence / 二分
求长度最短的连续序列 它的和大于等于s 输出长度枚举起点和终点会超时求出前缀和 都是正整数 所以前缀和是递增的如果对于前缀和 sum[i]要使得长度最小 那么应该找出最大的j 使得 sum[i]-sum[j]>=s sum[j] #include #include #include using namespace std;const int maxn = 1000
2014-01-23 23:11:42 1137
原创 LA 3905 Meteor / 区间扫描
求哪一时刻 框框里的点最多 每个点在做运动(在边框上不算)求出每个点经过框框的区间 在2维坐标系以x表示 是开区间 因为区间边上不算 假设有一条竖线从左到右扫描过去 也就是求哪一时刻扫描线相交的区间最多可以设cnt = 0每遇到左区间++右区间--求最大的cnt 然后一个区间右端点与一个区间的左区间相同 要先算右区间因为是开区间书上的代码#include #include
2014-01-23 21:25:42 1218
原创 UVa 11549 Calculator Conundrum / floyd判圈算法
可以用map 或者set 新学了一个floyd判圈算法就是比如2个赛跑 第二个比第一个速度快1倍 圆形跑道可以追上第一个人 这里就另k1做一次next k2做2次next 如果k1 == k2 就break 说明出现循环了代码是书上的
2014-01-23 18:15:14 1141
原创 UVa 11825 Hackers’ Crackdown / 状态压缩DP
代码就是书上的 这题太神了 太好了直接看书吧孩子 书上讲的蛮好的2进制枚举子集还是很巧妙的a[i]表示的树中1的地方表示相连 所有1组成一个集合cover[i]表示a[i]的组合 比如i = 6 就是 110 就是a[1] a[2]2个集合的并集dp[i]表示集合i做多终止几项服务for(int s0 = s; s0; s0 = (s0-1)&s)s0 枚举了s的子集
2014-01-23 14:05:20 1121
原创 2014台州学院ACM集训队寒假练习赛2
I Network和上次组队赛G题一样 裸的求无向图的割顶 我也只会简单的大白书上有算法讲解#include #include #include #include #include using namespace std;const int maxn = 110;vector G[maxn];bool iscnt[maxn];int pre[maxn];int l
2014-01-20 17:27:06 2134
原创 UVa 11235 Frequent values / RMQ or 线段树
连续相同的数为一段 cnt[i] 为第i段出现次数对于每次询问l,r判断l,r,分别属于哪一段 比如说是 x,y 那么求x+1 到y-1段的RMQ 另外x,y分别还有一部分 别忘记RMQ 线段树都可以解RMQ#include #include #include #include using namespace std;const int maxn = 100010
2014-01-20 13:41:49 1056
原创 LA 3938 "Ray, Pass me the dishes!" / 线段树单点更新
中间有一个| 我写成了|| 查了好几个小时 我日每次询问一段区间最大和的起始和终点坐标 x,y x y 尽量小对于某个节点 最大和要么是左子树的最大和 要么是右子树的最大值 要么是左右各有最后一中情况要保存最大前缀和最大后缀 取左子树的最大后缀和右子树的最大前缀#include #include #include #include #include #include
2014-01-19 21:32:10 1134
原创 LA 4329 Ping pong / 树状数组
求可以举行多少场比赛 要求每场比赛3个人 裁判在中 技能值要在2个选手中间 位置(下标)也要在2个人中间对于 ai 如果从1到i-1 有x个数小于ai (有I-1-x比ai大)从i+1到n有y个比ai小(有i-n-y个比ai大)那么对于ai 符合的有x*(i-n-y)+(i-1-x)*y求x,y可以从头和从尾扫描2边用树状数组统计 计数排序那样对于ai cnt[a[i]] = 1#in
2014-01-19 13:37:18 964
原创 LA 3027 Corporative Network / 并查集
2种操作 I u v 把u的父节点设为v 距离为fabs(u-v)%1000 E u求u到根节点的距离设dis[i] 为i节点到父节点的距离在并查集压缩路径时更新dis数组#include #include #include #include using namespace std;const int maxn = 20010;int dis[m
2014-01-19 11:29:52 976
原创 LA 3644 X-Plosives / 并查集
每种化合物由2中元素组成现在要按照顺序装化合物 如果装的个数等于元素的种类 那么不可以装 求有多少个不可以装输入的是每种化合物的2种元素 每个元素看成点 每个化合物连城一条边 那么等价于点数等于边数 就是环 用并查集判断环#include #include #include #include const int maxn = 100010;using namespace s
2014-01-18 23:36:36 901
原创 UVa 11997 K Smallest Sums / 优先队列
优先队列n行每行n个数字 每行选一个求和 求和最小的n个假设只有2行每一行先排序a1 a2 a3 ... anb1 b2 b3 ... bn把a1 + b1, a2 + b1, a3 + b1,..., an + b1入队列然后取出一个最小的(pop ) 假如是ax + by 那么就放进去一个ax+b(y+1)(push)直到取出n个 把他们存到数组c现在有n 那么
2014-01-18 23:12:41 1006
原创 UVa 11991 Easy Problem from Rujia Liu? / STL-MAP
输入n个数 然后m对k v求第k个v的下标 没有输出0用map 先预处理好 直接输出a[v][k]容器里面套容器 第一次遇到#include #include #include using namespace std;map > a;int main(){ int n, m; int u, v; int i, j; while(scanf("%d %d",&n,&
2014-01-18 15:17:28 944
原创 UVa 10859 Placing Lampposts / 树形DP
给你一个图 在尽量少的节点上放灯 使得所有边所有边都被照亮 每盏灯照亮以他为端点的所有边 求在灯总数最小的前提下 被两盏灯照亮的边数尽量大(即被一条边照亮的边数尽量小)另x = Ma + c (a是灯的数量,c是被两盏灯照亮边数)转换求x 最小M是一个很大的数 x取最小时 x/m整数部分就是所求灯最小值 x%m就是被一条边照亮的边数M比 c的最大理论值和a的最小理论值差 还要大的数
2014-01-18 14:33:03 1049
原创 UVa 11426 GCD - Extreme (II) / 素数筛选 + 欧拉函数
输入正整数n,求gcd(1,2)+gcd(1,3)+gcd(2,3)+...+gcd(n-1,n)设f(n) = gcd(1,n)+gcd(2,n)+...+gcd(n-1,n)所求s(n) = f(2)+f(3)+...+f(n) = s(n-1)+f(n);gcd(x,n) = i gcd(x/i,n/i) = 1 满足条件的x/i有phi(n/i)个(欧拉函数)可以按照素
2014-01-17 18:53:06 1232
原创 UVa 11624 Fire! / BFS
和普通BFS相比 多了个火 那么先对火做一次BFS 预处理每个格子着火的时间偷懒了 少开个数组 然后错了半天 #include #include #include #include using namespace std;const int MAX = 1010;char a[MAX][MAX];int map[MAX][MAX];struct node{ int
2014-01-17 15:20:02 1336
原创 2014台州学院ACM集训队寒假练习赛1
J Equal Gifts二维01背包 一不小心A了#include #include using namespace std;struct node{ int u; int v;}a[200];bool dp[2][100000];bool map[2][100000];int main(){ int n,i,j,k; int m = 0; int sum =
2014-01-15 17:35:18 2418
原创 UVa 10891 Game of Sum / 记忆化搜索
记忆化搜索 dp[i][j] 表示第i~j个元素组成的子序列 先手得分的最大值dp[i][j] = sum(i,j) - min(dp[i+1][j],dp[i+2][j],.....dp[j][j],dp[i][j-1],dp[i][j-2],.....dp[i][i],0) ,0 代表取完所有数#include #include #include using names
2014-01-01 10:35:15 1217
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人