03 2016 档案
摘要:暴力DFS。 有2个剪枝: 1.记录一下走到某一格的最小步数 2.走到安全地点马上return WA点:安全地点坐标不一定在300以内!
阅读全文
摘要:暴力DFS。 如果一个数比另一个数位数多,那么位数多的那个数从小到大排序,位数少的从大到小排序,这样能算出这种情况下的最小差值。 如果两个数字位数相同,可以枚举最高位分别是哪个数字,然后就可以确定哪个数字较大,大的那个数剩下的数字从小到大排序,小的那个数字从大到小排序。 注意处理一下前导0的问题。
阅读全文
摘要:暴力DFS+验证。 验证如果是暴力检验可能复杂度会太高,事实上可以o(1)进行,这个可以o(n*n)dp预处理。
阅读全文
摘要:树形DP+高精度。 dp[i][j]表示i这个节点所在连通块有j个点。 可以选择和一些儿子相连,也可以完全断开,每种情况保留最大值就可以了。
阅读全文
摘要:组合数杨辉三角打表,这样避免了除法求逆元。
阅读全文
摘要:二分答案+验证,注意一开始就不连通的话输出0
阅读全文
摘要:事实上,一个点被一个圆覆盖可以转化成区间问题。
阅读全文
摘要:优先级队列。 对时间的起始时间排个序一个一个看,机器按照结束时间放入优先级队列中维护即可。
阅读全文
摘要:先对序列排个序。 例如:1 2 3 4 5 6 7 我们把序列分成两半,前一半是1 2 3 4,后一半是5 6 7 然后,我们从前一半取最小的一个,再从后一半取最小的一个。。一直操作下去就能构造出答案了。 由此也可以看到,不可能出现Impossible的情况。
阅读全文
摘要:只要计算每个位置最多能到哪个位置,累加即可,DP从后往前预处理一下每个位置到达的最远位置。 有坑点:输入的时候如果同一个点出发的,需要保存最小值。
阅读全文
摘要:离散化+树状数组 先对坐标离散化,把每条线段结尾所在点标1, 询问某条线段内有几条线段的时候,只需询问这段区间的和是多少,询问结束之后再把这条线段尾部所在点标为0
阅读全文
摘要:DP。 设dp[i][j]表示:选i个数字,最大的数字是j的有几种。 注意坑点:对1000000取模之后dp[i][j]可能出现负的,需要加上一个mod 后台数据有点水了,事实上按我这样做的话,时间复杂度和空间复杂度都是一亿,但后台数据并没有那么强。。。
阅读全文
摘要:多重背包二进制优化,o(10*100*100000)的复杂复,2800ms卡过去的。
阅读全文
摘要:排序+贪心。 先对L从小到大进行排序,L一样的W小的在前面,之后就不用看L了。 对W进行贪心处理即可得到答案。
阅读全文
摘要:每次合并最大的两个,优先级队列维护一下。 输出的时候%.3lf G++会WA,C++能AC,改成%.3f,都能AC。
阅读全文
摘要:事实上就是求最长上升子序列的长度。用nlogn的写法。我用了线段树。
阅读全文
摘要:dp[i][j]表示i这个数字用前j个来拼凑有几种方案。 我写的时间复杂度是o(20000000),理论上打个表,然后o(1)输出妥妥的可以AC。 但是后台居然是一个文件一组数据的。。。。。。 做了点优化之后,C++ 压线AC 正好2000ms,G++1200ms。 此外,这题应该是可以找规律AC的
阅读全文
摘要:DP。dp[i][j]表示答案,dp[i][j]=dp[i][j-1]+dp[i-j][j],这题会爆longlong,需要写高精度,拉了个大数模板过来。。
阅读全文
摘要:这题和金华区域赛A题(HDU 4442)是一样的做法。 对两个奶牛进行分析,选择两个奶牛总花费少的方式排序。 bool cmp(const X&a,const X&b){ return a.t*b.d<b.t*a.d;}
阅读全文
摘要:可以设计三维DP,dp[i][j][k]表示i秒的时候,走了j步,在编号为k的树下获得的最大价值。
阅读全文
摘要:排序+背包。 先对按高度限制从小到大排序,然后做背包即可。0/1背包300多ms过的,可以用完全背包二进制优化。
阅读全文
摘要:暴力枚举+DP预处理。 可以枚举矩形底边是哪一行,枚举到一行的时候,计算以该行为底边,最大矩形面积是多少。
阅读全文
摘要:简单DP。 这周所用的实际花费是上一周的花费+S与这周费用的较小值。
阅读全文
摘要:时间复杂度很大。dp[i][j]表示第i轮 j这种状态的概率。
阅读全文
摘要:网络流入门题。 源点到每一个学生连一条边,容量为1 每个学校到汇点连一条边,容量为L 符合要求的学生和学校之间连边,容量为1。 从源点到汇点的最大流就是答案。
阅读全文
摘要:递归构造答案。 根据当前整颗树的编号,可以计算左右子树有几个节点以及编号。因此,不断dfs下去就可以了。
阅读全文
摘要:首先有一个规律:当一个数字归位的时候,所有数字都会归位。 因此只需要模拟一个数字就可以了。
阅读全文
摘要:这题有毒。要用long double定义,以及cout控制格式输出。
阅读全文
摘要:区间DP。dp[i][j]表示第i到第j个全部释放最小费用。
阅读全文
摘要:DP+离散化。 首先需要把时间离散化,剩下的就是简单DP。 还要判断哪些选修课与必修课时间有重合,我用了前缀和来处理。 注意:这题时间端点也不能重合。
阅读全文
摘要:这个问题转化一下就是求长度为2*n的正确括号匹配串,两个匹配的括号之间的距离不超过2*k的有几种。 假设左括号为1,右括号为-1,dp[i][j]表示长度为i的括号匹配串,前缀和为j的有几种。dp[2*n][0]就是答案。 递推式:
阅读全文
摘要:差分约束系统。 由题意直接可以得到一系列不等式,直接可以建图跑最短路。 如果存在负环,那么输出-1,如果1到n的最短路距离无穷大,那么输出-2,其余输出1到n的最短路距离。 关于查分约束系统可以看这篇博客http://www.cnblogs.com/void/archive/2011/08/26/2
阅读全文
摘要:看了半天发现原来是最小生成树啊...... 先操作一次最小生成树,再看有几个集合,答案还需要加上集合数量*10000
阅读全文
摘要:最短路预处理+枚举。 1到n的次短路长度必然等于 从1走到X的最短路+x到y的边权+y到n的最短路。 首先预处理好1到每一个节点的最短路,和n到每一个节点的最短路。 然后枚举每一条边作为中间边[x,y]或者[y,x],如果加起来长度是最短路则跳过,否则更新答案。
阅读全文
摘要:并查集。看了《挑战程序设计竞赛》才会的。POJ多组数据提交会WA。 主要思路是把一个点拆成三个点。i,i+n,i+2*n分别表示 i 是A类,B类,C类。 如果 i 和 j+n在同一集合内,表示 i 是A类的时候,j 一定是B类。
阅读全文
摘要:贪心,优先级队列。 基本思路:走过一个加油站,先不要加油,把这个油量存到仓库,到油量不够的时候去仓库补油,补油优先选择油量大的。 细节较多,容易写错。 #include<cstdio> #include<cstring> #include<cmath> #include<queue> #includ
阅读全文
摘要:简单贪心,每次合并长度最小的两段,优先级队列维护一下。 #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<algorithm> using namespace std; const int maxn
阅读全文
摘要:简单暴力题,读入%lld会WA,%I64d能过。 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=100+10; int T,n; s
阅读全文
摘要:这个问题可以转变一下,先要知道有几个连通块,连通块之间肯定需要添加一条边, 还需要知道每个连通块内部需要添加几条边,这个问题等价于求一张图至少需要几笔画成,这个问题的答案是度为奇数的点的个数/2 #include<cstdio> #include<cstring> #include<cmath> #
阅读全文
摘要:简单贪心。问题等价于给你n个区间,选择最少数量的区间,使这些选出来的区间覆盖住[1,n]。 #include<cstdio> #include<cstring> #include<cmath> #include<stack> #include<algorithm> using namespace s
阅读全文
摘要:简单贪心。注意输出格式,每到80个字符就换一行。 #include<cstdio> #include<cstring> #include<cmath> #include<stack> #include<algorithm> using namespace std; const int maxn =
阅读全文
摘要:蚂蚁掉头等于不掉头。 #include<cstdio> #include<cstring> #include<cmath> #include<stack> #include<algorithm> using namespace std; const int maxn=1000000+10; int
阅读全文
摘要:双塔DP+输出路径。 由于内存限制,DP只能开滚动数组来记录。 我的写法比较渣,但是POJ能AC,但是ZOJ依旧MLE,更加奇怪的是Uva上无论怎么改都是WA,其他人POJ过的交到Uva也是WA。 #include<cstdio> #include<cstring> #include<cmath>
阅读全文
摘要:双塔DP。 dp[i][j]表示前i个物品,分成两堆(可以不全用),价值之差为j的时候,较小一堆的价值为dp[i][j]。 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace s
阅读全文
摘要:矩阵快速幂+构造。 首先我们要计算出需要构造的矩阵大小是多少,这个可以构造矩阵,进行矩阵快速幂求得。 S[n]就是求得的矩阵大小。 接下来就是构造答案了:如果S[n]是奇数或者0,显然无解。 偶数的话,可以构造答案,下面以6*6为例: 下三角全是-1,上三角全是1,对角线上-1与0间隔填写。 #in
阅读全文
摘要:矩阵快速幂。 样例是这样构造矩阵的: 矩阵很好构造,但是500*500*500*logk的复杂度显然是无法通过这题的。 其实本题构造出来的矩阵是一个循环矩阵,只需直到第一行或者第一列,即可直到整个矩阵是怎么样的。 所以,中间计算的时候,需要直到第一行是什么即可,即1*n的矩阵乘n*n的矩阵。时间复杂
阅读全文
摘要:双塔DP。 #include<cstdio> #include<cstring> #include<queue> #include<string> #include<algorithm> #include<map> #include<iostream> using namespace std; co
阅读全文
摘要:直接走,或者回一次头反向走。 预处理前缀费用,反向的时候 二分查找一下。 WA点:注意一开始就可以往左。 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=5e5
阅读全文
摘要:两种距离相等,必然是在一条竖直线上或者一条水平线上。重复的再减一下即可。 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <queue> #i
阅读全文
摘要:乱搞题,先对序列排序,每次找到最小的没用过的比前一个大的数字放上去,找不到放没用过的最小的放上去。 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #inclu
阅读全文
摘要:水题。 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <queue> #include <set> #include <map> #incl
阅读全文
摘要:间隔小的时候dp预处理,大的时候暴力。。正确做法不会。。。 dp[i][j]表示以i为开头,间隔为j的和,递推:dp[i][j] = dp[i + j][j] + a[i] 测试数据中间隔可能是0...... #include<cstdio> #include<cstring> #include<c
阅读全文
摘要:水题。 #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<algorithm> using namespace std; long long L, R; string Q = "XHUSTACM"
阅读全文
摘要:暴力打表。 #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<algorithm> using namespace std; long long a[10000]; long long L, R;
阅读全文
摘要:首先进行一次括号匹配,把正确匹配的全部删去。 删去之后剩下的状态肯定是 L个连续右括号+R个连续左括号。 如果L是偶数,答案是L/2+R/2; 否则答案是 (L-1)/2+(R-1)/2+2; #include<cstdio> #include<cstring> #include<cmath> #i
阅读全文
摘要:预处理一下,然后o(1)询问。 #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<stack> #include<map> #include<algorithm> using namespace
阅读全文
摘要:水题。 #include<cstdio> #include<cstring> #include<cmath> const int maxn = 100 + 10; char s[maxn], v[maxn], h[maxn]; int main() { int T; scanf("%d", &T);
阅读全文
摘要:首先,1000000能被64整除。 也就是说Y=X*1000000+P,当P能被64整除(P在1--6位之间),X任意的时候,Y也能被64整除。因此暴力算一下1--6位的数字中哪些能被64整除,再看看这些数组成Y形式的有几种。 #include<cstdio> #include<cstring> #
阅读全文
摘要:这题真难,并不会推理。。。 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; long long a, b, c; int p; int main() { int T
阅读全文
摘要:简单广搜。4进制对应的10进制数来表示这些状态,总共只有(4^12)种状态。 #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<queue> #include<algorithm> using name
阅读全文
摘要:矩阵快速幂。 题意事实上已经告诉我们这是一个矩阵乘法的运算过程。 构造矩阵:把xi列的bij都标为1. 例如样例二: #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> usi
阅读全文
摘要:题意:一个递推式第n项%b是多少。 递推式: 构造矩阵: #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; long long MO
阅读全文
摘要:矩阵快速幂。 首先得到这个式子: 依据这个,就可以构造矩阵。 #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; long long
阅读全文
摘要:排序+构造+预处理 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn = 200000 + 10; int n, m; int a[ma
阅读全文
摘要:对于每一个格子,看是行最后画还是列最后画。预处理一下就可以了。 #include<stdio.h> #include<string.h> int n,m,k; int op[100000+10]; int id[100000+10]; int info[100000+10]; int high[20
阅读全文
摘要:所有数字都或一下就好了。肯定是最大的。 #include<stdio.h> #include<string.h> int n; long long a[1000+10]; long long b[1000+10]; int main() { scanf("%d",&n); for(int i=1;i
阅读全文
摘要:这题第一直觉就是和CF第三次教育场的E题是一样的, http://codeforces.com/contest/609/problem/E 然后直接拉过来代码改了改,提交返回MLE。FZU内存开的小,没救了。 后来还是同学指教,边总共只有两类,要么存在最少生成树上,要么不属于任何一个最小生成树。 所
阅读全文
摘要:暴力枚举一下就可以得到答案。 #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<algorithm> #include<iostream> using namespace std; const i
阅读全文
摘要:水题,直接比较一下就可以了 #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<algorithm> #include<iostream> using namespace std; int n; c
阅读全文
摘要:水题,不过感觉数据有错。 #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<algorithm> #include<iostream> using namespace std; long long
阅读全文
摘要:简单模拟题,开个栈维护一下即可。 #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<algorithm> #include<stack> #include<iostream> using name
阅读全文
摘要:暴力DP。 dp[x1][y1][x2][y2][t]表示,第一个人在(X1,Y1),第二个人在(X2,Y2),时间为t的时候获得的最大价值。 时间复杂度o(t*n*m*n*m*5*5). 什么都不优化跑了4600ms,差点超时,剪了点枝,2500ms跑过。 空间复杂度是可以优化的,dp[x1][y
阅读全文
摘要:按题意的步骤来显然是不行的。算一次最坏需要o(1000*1000*6)复杂度,需要算log(n*n)次,显然超时。 需要转换一下公式,考虑到K只有6,所以可以考虑转换成BA来做。 #include<cstdio> #include<cstring> #include<cmath> #include<
阅读全文
摘要:矩阵快速幂。 矩阵很容易构造: #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; int d,n; long long m; lon
阅读全文
摘要:第一直觉是解方程,把a,b都算出来,显然这是不科学的做法,如果a,b都是小数..那就GG了。 正解如下: 计算前几项,可以看出递推式 有了递推式,就可以构造矩阵,进行矩阵快速幂 这题还有2个WA点: 1.这样的数据是合法的:0 0 5,所以最后一组读入的时候并不是p,q都为0就break。 2. n
阅读全文
摘要:首先找到f[n],指数可以通过矩阵快速幂来求解,由于指数较大,需要利用以下公式降幂 得到指数之后,再利用快速幂得到答案。 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace st
阅读全文
摘要:矩阵快速幂。 读入A矩阵之后,马上对A矩阵每一个元素%10,否则会WA..... #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std;
阅读全文