hdu
文章平均质量分 59
moyan_min
这个作者很懒,什么都没留下…
展开
-
hdu 3016 Man Down
这题太坑人了,虽说是线段树+dp,可是这道题的题意确实不明确,你要知道,要想从高的木板下落到低的木板上面,假设高的木板的区间为[l, r],那么你只能从点l和点r也就是这条木板的两个端点下去,而不是从l - 1和r + 1这两个点下去(就是坑在这,让我无数次的wa);唉……这该怎么说呢。说一下自己的思路:按照高度进行排序,高度递减,首先查找区间[l, r]中的最大值,把这个最大值记录下来,把区原创 2013-11-01 18:08:46 · 1147 阅读 · 0 评论 -
hdu 4612 Warm up
将双连通分量浓缩成点,形成一颗树,找最长路#include #include #include #include #include #define N 200010#define M 1000010#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;bool iscut[2原创 2013-09-27 10:35:53 · 1253 阅读 · 0 评论 -
hdu 4565 So Easy!
公式推导:( a + b ^ 0.5 ) ^ n + ( a - b ^ 0.5 ) ^ n = Ck, Ck * ( ( a + b ^ 0.5 ) + ( a - b ^ 0.5 ) ) = ( ( a + b ^ 0.5 ) + ( a - b ^ 0.5 ) ) * ( a + b ^ 0.5 ) ^ n + ( a - b ^ 0.5 ) ^ n => 2 * a * Ck原创 2013-09-27 10:09:36 · 920 阅读 · 0 评论 -
hdu 4648 Magic Pen 6
采用一种新的方式来处理数据连续的数目和能被m整除,时间复杂度为n#include #include int max(int x,int y){ return x>y?x:y;}#define LL long longLL num[100010];int p[100010];int main(){ //freopen("in.txt","r",stdin);原创 2013-09-26 11:46:55 · 734 阅读 · 0 评论 -
hdu 4651 Partition
需要采用一种新的方式来计算此题,要不然会超时,用五边形定理 http://zh.wikipedia.org/wiki/%E4%BA%94%E9%82%8A%E5%BD%A2%E6%95%B8%E5%AE%9A%E7%90%86 p(n) = p(n-1) + p(n-2) - p(n-5) - p(n-7) + ……以n=10为例p(10) = p(9) + p(8) - p(5) - p(3)原创 2013-09-26 11:42:08 · 1319 阅读 · 0 评论 -
hdu 4665 Unshuffle
dfs剪枝减去很多才能过,0MS过了,真的很不错,可能满足的情况有很多种,所以就可以过了,如果要输出所有情况,那就麻烦了#include #include int n;int num[2010],v[2010];bool dfs(int cur,int pos){ bool flag=0; if(cur>=n-2) return 1; for(int i=原创 2013-09-26 11:40:40 · 671 阅读 · 0 评论 -
hdu 4658 Integer Partition
用long long超时,五边形定理,虽然学了一点,但是还是不会啊#include #define LL long long#define N 1000000007int num[100010];void solve(){ num[0]=num[1]=1,num[2]=2; for(int i=3; i<=100000; ++i) for(int原创 2013-09-26 11:38:43 · 673 阅读 · 0 评论 -
hdu 4584 Building bridges
水题#include #include struct node{ int x; int y;};node C[1605];node H[1605];int l_c,l_h;int main(){ //freopen("in.txt","r",stdin); int n,m; while(scanf("%d%d",&n,&m)!=EO原创 2013-09-26 11:37:28 · 744 阅读 · 0 评论 -
hdu 4576 Robot
直接暴过了,不到三秒就可以过#include #include #include double arr[210],num[210];int main(){ //freopen("in.txt","r",stdin); int n,m,l,r; while(scanf("%d%d%d%d",&n,&m,&l,&r)!=EOF) { i原创 2013-09-26 11:36:35 · 1014 阅读 · 0 评论 -
hdu 4666 Hyperspace
曼哈顿距离,两个点设为(x1,y1),(x2,y2),其距离为|x1-x2|+|y1-y2|#include #include #include #include using namespace std;struct node{ int pos; int sum; bool operator < (const node &p) const {原创 2013-09-26 09:53:45 · 882 阅读 · 0 评论 -
hdu 4669 Mutiples on a circle
dp递推,通过一个状态往后加数不断递推出所有状态,并且不断取余#include #include #include #define M 50005#define K 205int mod[M], sum[M], dp[M][K], p[200005];int n, k;void POW(){ p[0] = 1; for(int i = 1; i <= 4*n原创 2013-09-26 09:52:34 · 932 阅读 · 0 评论 -
hdu 4497 GCD and LCM
先求出素数,统计各个素数个数,然后根据素数形成的解的个数乘以下一个素数的个数#include #include int num[1010];int main(){ //freopen("in.txt","r",stdin); int t,n,m,k,sum; scanf("%d",&t); while(t--) { scanf原创 2013-09-26 00:01:19 · 1125 阅读 · 0 评论 -
hdu 4619 Warm up 2
其实就是一个数学问题,给你一个圆柱的底面的圆心以及底面圆心的两个点,然后求出这个圆的的法向量和这个圆的半径,这样的话就会得到n个圆半径以及n条直线(包括方向向量和直线上一点),再求这些直线的距离看是否小于等于两条直线所在的两个圆的半径之和,如果存在任何一组小于等于的话,就输出Lucky,否则输出最小差距;知道两条直线的法向量后,距离dis=|两条直线上两点的方向向量*(两条直线的方向向量的叉乘)|原创 2013-09-27 10:24:47 · 1211 阅读 · 1 评论 -
hdu 4628 Pieces
采用集合的方式进行判断,判断所有的子字符串情况,看是否符合回文#include #include #include using namespace std;int len;int f[(1<<16)+2];char s[18];void solve (int n){ char str[18]; for(int i=1; i<len; ++i) {原创 2013-09-27 10:12:00 · 870 阅读 · 0 评论 -
hdu 1540 Tunnel Warfare
线段树的区间更新,求得区间内的最长序列:所以可以寻找两个端点,也就是被炸毁的村庄作为端点,然后再把0和n+1这两个点置为1,0在这里表示村庄没有没炸毁,1表示被炸毁,-1表示这个区间内既有被炸毁的村庄,也有没有被炸毁的村庄,那么查询两次找出两个端点,其区间也就确定了//#pragma comment(linker, "/STACK:1024000000,1024000000")#inc原创 2013-10-28 14:31:50 · 814 阅读 · 0 评论 -
hdu 2795 Billboard
线段树题目,不过不需要开10^9这样大的数组,也开不下,最多开的数组大小也就是200010 << 2这样大的数组就可以了//#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include原创 2013-10-27 19:53:12 · 837 阅读 · 0 评论 -
hdu 1698 Just a Hook
线段树求整个区间的和//#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #include #include #define INF 0x3fffffff#define原创 2013-10-27 11:43:46 · 905 阅读 · 0 评论 -
hdu 1754 I Hate It
线段树求区间最大值//#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #include #include #define INF 0x3fffffff#define原创 2013-10-27 11:11:51 · 819 阅读 · 0 评论 -
hdu 1166 敌兵布阵
线段树区间求和//#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #include #include #define INF 0x3fffffff#define N原创 2013-10-27 11:02:14 · 836 阅读 · 0 评论 -
hdu 1394 Minimum Inversion Number
事实上就是求每个排列的逆序数,找出最小的那个,所以求逆序数算法需要得到优化。由于数组的数各不相同,所以我们可以只需要求得初始数组的逆序数就可以了,其他的可以递推出来:101 3 6 9 0 8 5 7 4 2开始的逆序数为22, 那么将1移到后面后得到的是:3 6 9 0 8 5 7 4 2 1对于这个新的排列,你会发现这个排列的逆序数很奇怪:实际上1的逆序数置为0, 而大于1的每原创 2013-10-27 19:15:50 · 935 阅读 · 0 评论 -
hdu 3844 Mining Your Own Business
见刘汝佳训练指南P318#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #include #include #define INF 0x3fffffff#define原创 2013-10-18 11:42:32 · 1337 阅读 · 0 评论 -
hdu 3847 Trash Removal
凸包题目:先把凸包求出来,那么要计算的点必然在凸包所构成的多边形边界上,在边界上枚举每条边,求得其所有点相对于这条边的最大距离,然后取这些最大距离的最小的一个就可以了,对了,这题目要求向上取整#include #include #include #include #include #include #include #include #include #include原创 2013-10-17 17:39:44 · 1003 阅读 · 0 评论 -
hdu 1695 GCD
就自己知道的做法有两种:一种是用欧拉函数预处理[1, 100000]区间内所有数的phi,然后再求出[n / k, m / k]区间中每一个数与区间[1, n / k]互质的素数,将这些素数采用容斥原理进行组合和排除,就会得到[1, n / k]之间的与区间[n / k, m / k]互质且公约数为1的所有对数。这种做法比较耗时。另一种方法采用了莫比乌斯反演中的求mu函数,然后进行区间划分原创 2013-10-17 14:14:23 · 1076 阅读 · 0 评论 -
hdu 4768 Flyer
不能暴,会超时,要用LL,否则结果不对,采用二分,既然是找奇数,那么可以计算出所有的社团所发放传单的数目和,如果为偶数,那么必然不存在任何一个人为奇数;如果存在,那么可以不断二分学生的下标从而找到是在哪个位置#include #include #include #include #include #include #include #include #include #i原创 2013-09-28 19:41:46 · 1710 阅读 · 0 评论 -
hdu 4616 Game
应该用树形dp的,数据太水,直接水过也行#include #include #include #include #include #define LL long long#define N 50010using namespace std;vector G[N];int v[N];LL s[N];bool iscut[N];int n,m;LL p;void原创 2013-09-27 10:27:39 · 1324 阅读 · 1 评论 -
hdu 4705 Y
寻找不在同一条路上的三个点构成的集合个数,那么,我们可以反过来求在同一条路上的三个点构成的集合个数,可以选择以任一结点,然后计算(该结点的子结点数目和与非该结点的子结点数目和的乘积+该结点各个子结点与其他子结点和的乘积/2),所有结点的和累计就是了#include #include #define N 100010#define LL long long#pragma commen原创 2013-09-25 23:58:38 · 992 阅读 · 0 评论 -
hdu 4704 Sum
离线处理再计算#include #include #define N 100010#define LL long long#define mod 1000000007char s[N];LL num[N];LL fuck(LL x,int y){ if(y==0) return 1; if(y==1) return x; LL v=fuck(x,y/原创 2013-09-25 23:53:10 · 719 阅读 · 0 评论 -
hdu 3848 CC On The Tree
寻找两个叶子结点最近的距离为多少#include #include #define INF 20000000int cnt;int head[10010],next[20010][3],dp[10010][2];void add(int u,int v,int w){ next[cnt][1]=v; next[cnt][2]=w; next[cnt][0原创 2013-09-25 23:50:44 · 716 阅读 · 0 评论 -
hdu 4717 The Moving Points
二分或者三分都可以做,不过二分需要注意精度#include #include #include #define LL long long#define N 100000#define eps 1e-5double flag, pos;double x[310], y[310], vx[310], vy[310];double cal(double x1, double y1原创 2013-09-25 23:33:29 · 930 阅读 · 0 评论 -
hdu 4745 Two Rabbits
构造回文串,求出[i, i + n]之间的最大回文串长度,最大回文串长度与前一字符串长度比较就是了#pragma comment(linker,"/STACK:1024000000,1024000000")#include int n;int num[2005];int dp[2005][2005];int max(int x, int y){ return x > y原创 2013-09-25 23:29:51 · 1370 阅读 · 0 评论 -
hdu 4756 Install Air Conditioning
非正规做法,一个一个的暴,减一下枝,还得采用sort,qsort居然过不了……#include #include #include #include using namespace std;#define LL long longstruct node{ int u, v, no; LL dis;};int n, len, pos, p[1010], num[101原创 2013-09-25 23:21:22 · 1460 阅读 · 3 评论 -
hdu 4630 No Pain No Game
树状数组+离线处理,输入结束后按照L从到小排序,然后在计算约数的时候,把约束出现次数大于1的存入树状数组,然后根据R进行查询,最后全部输出#include #include #include #define N 50005struct node{ int l,r,pos;};node v[N];int n,m;int num[N],arr[N],p[N],q[原创 2013-09-26 11:52:39 · 602 阅读 · 0 评论 -
hdu 4632 Palindrome subsequence
都不会做了,以前做过的题目都忘了,唉……递归dp真是耗时啊……#include #include #define N 10007char s[1010];int dp[1010][1010];int main(){ //freopen("in.txt","r",stdin); int t,k=1; scanf("%d",&t); while(t-原创 2013-09-26 11:50:48 · 706 阅读 · 0 评论 -
hdu 4622 Reincarnation
后缀自动机题目,第一次接触,一点也不会,查资料也不是很清楚,只能算是拷贝的代码了#include #include struct node{ int l,r,pos;};struct Str{ Str *par,*next[26]; int Sum; void clear() { Sum=0,par=NULL;原创 2013-09-26 11:48:21 · 1106 阅读 · 1 评论 -
hdu 4585 Shaolin
set用法,不断插入查找#include #include using namespace std;struct node{ int id; int grade; bool operator < (const node &v) const { return v.grade > grade; } node (int x,原创 2013-09-26 11:38:35 · 682 阅读 · 0 评论 -
hdu 4686 Arc of Dream
矩阵快速幂:1,A0%N,B0%N,A0*B0%N,A0*B0%N;1,AY%N,BY%N,AY*BY%N,AY*BY%N;AX%N, 0,AX*BY%N,AX*BY%N;BX%N,BX*AY%N,BX*AY%N;AX*BX%N,AX*BX%N;1;#include #include #define N 1000000007原创 2013-09-26 09:47:50 · 947 阅读 · 0 评论 -
hdu 3853 LOOPS
dp,不过这题需要倒着推,p[i][j]+=p2[i][j]*(p[i][j+1])/(1-p1[i][j])+2.0/(1-p1[i][j])+p3[i][j]*(p[i+1][j])/(1-p1[i][j]),如果不倒着推,就会存在在一点的自环情况,那么计算时就比较麻烦了#include #include #define N 1010#define eps 1e-5double原创 2013-09-25 23:48:41 · 699 阅读 · 0 评论 -
hdu 3631 Shortest Path
floyd 算法#include #include #include #define LL long long#define N 100000#define eps 1e-5#define INF 0x7fffffffint dp[301][301];int n, m, q;bool vis[301];int min(int x, int y){ return原创 2013-09-25 23:31:18 · 938 阅读 · 0 评论 -
hdu 3646 Fate Stay Night
状态转移:对于j == 0 时,就是没有翻倍的情况,对于j == i 时,全都翻倍,对于j > i 时, dp[i][j] = dp[i][j - 1],剩下的情况就是dp[i][j] = max(dp[i - 1][j - 1] + fb[i] * 2, dp[i - 1][j] + fb[i]);当然,dp是存放的结构体,结构体包含两个数:剩余血量和第几次生命值#include #incl原创 2013-10-08 23:55:08 · 1094 阅读 · 0 评论 -
hdu 4193 Non-negative Partial Sums
不断维护单调队列,从而实现最小值与初始值的比较来决定是否呈现 >= 零的情况#include int f,l,cnt;int arr[2000010];int num[2000010];void in(int pos){ while(f = arr[pos]) --l; num[++l] = pos;}void out(int pos,int n){原创 2013-09-25 23:40:06 · 859 阅读 · 0 评论