自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

moyan_min的专栏

知我者,为我心忧;不知我者,谓我何求。向编程努力……永不放弃,永不言败!!!

  • 博客(44)
  • 问答 (5)
  • 收藏
  • 关注

原创 hdu 4767 Bell

从维基百科查到两个公式:维基百科网址:http://en.wikipedia.org/wiki/Bell_number通过这两个公式可以把Bn分别对于mod拆分成的五个素数取余,然后通过中国剩余定理把这五个素数得到的结果组合起来对于取余的算法是采用递推的方式#include #include #include #include #include #

2013-09-30 13:43:33 1260

原创 hdu 4768 Flyer

不能暴,会超时,要用LL,否则结果不对,采用二分,既然是找奇数,那么可以计算出所有的社团所发放传单的数目和,如果为偶数,那么必然不存在任何一个人为奇数;如果存在,那么可以不断二分学生的下标从而找到是在哪个位置#include #include #include #include #include #include #include #include #include #i

2013-09-28 19:41:46 1687

原创 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 1242

原创 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 1308 1

原创 hdu 4619 Warm up 2

其实就是一个数学问题,给你一个圆柱的底面的圆心以及底面圆心的两个点,然后求出这个圆的的法向量和这个圆的半径,这样的话就会得到n个圆半径以及n条直线(包括方向向量和直线上一点),再求这些直线的距离看是否小于等于两条直线所在的两个圆的半径之和,如果存在任何一组小于等于的话,就输出Lucky,否则输出最小差距;知道两条直线的法向量后,距离dis=|两条直线上两点的方向向量*(两条直线的方向向量的叉乘)|

2013-09-27 10:24:47 1202 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 856

原创 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 905

原创 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 589

原创 hdu 4631 Sad Love Story

在已有的点集中按X坐标从小到大排序,每增加一个点,找到大于等于它的位置p,分为两部分,然后从右递增计算要增加的点与点集中的点的距离,若>=Min,则退出,然后再从p-1处从右往左递减计算要增加的点与点集中所有点的距离的最小值。#include #include #include using namespace std;#define LL long long#define N 5

2013-09-26 11:51:41 736

原创 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 696

原创 hdu 4635 Strongly connected

先根据trajan算法找出连通分量缩点,然后得出一个新的不存在连通分量的有向图,然后查找有向图中出度或者入度为零的点,然后根据这个点的点数(如果是连通图缩成的点就不是一个点了)x,以及剩下的点数y=n-x,那么 sum = max( (x-1)*x+y*(y-1)+x*y-m ,sum )就是所能加的最大边数#include #include #include #include

2013-09-26 11:49:38 1060

原创 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 1093 1

原创 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 725

原创 hdu 4647 Another Graph Game

采用将两点之间的边上的权值平分到两点的方法来处理此题,由于平分时会产生误差,所以我没有平分,而是所有的点的权值加倍,然后两点各加一条边的权值,最后结果输出时减倍就可以了#include #include #define LL long longusing namespace std;LL num[100010];int main(){ //freopen("in.txt

2013-09-26 11:45:29 718

原创 hdu 4643 GSM

纪念一下此题,虽然不难,但是写起来比较麻烦,很多人直接套了许多模板过的,标程是采用二分的方法,我是采用一般方式进行递推,不断寻找中垂线。顺便把标程贴上#include #include #include #include using namespace std;struct Line{ double b,k; int f;};double city[55][

2013-09-26 11:44:29 1026

原创 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 1308

原创 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 662

原创 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 659

原创 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 671

原创 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 735

原创 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 1002

原创 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 867

原创 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 917

原创 hdu 4679 Terrorist’s destroy

给出一棵树,这棵树有N个点,N-1条边,正好是一个无向无环树,切去一条边,形成两棵树,使之这两棵树的最长路与切去边的权值最小,实践证明,用vector更加耗时,多了一秒,所以自己的写的链表更好改进后的算法(耗时八百多毫秒):#include #include #include #include #include #include using namespace std;#p

2013-09-26 09:50:11 1058

原创 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 936

原创 hdu 4597 Play Game

经典区间dp,两摞牌,分别可以从每一摞牌上面和下面取一张牌#include #include int dp[23][23][23][23];int arr[2][23];int max(int x,int y){ return x>y?x:y;}int dfs(int x1,int y1,int x2,int y2){ if(x1>y1&&x2>y2) re

2013-09-26 09:46:25 986

原创 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 1115

原创 hdu 4705 Y

寻找不在同一条路上的三个点构成的集合个数,那么,我们可以反过来求在同一条路上的三个点构成的集合个数,可以选择以任一结点,然后计算(该结点的子结点数目和与非该结点的子结点数目和的乘积+该结点各个子结点与其他子结点和的乘积/2),所有结点的和累计就是了#include #include #define N 100010#define LL long long#pragma commen

2013-09-25 23:58:38 980

原创 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 706

原创 hdu 4696 Answers

找规律,先排除掉小于等于零的部分,如果发现数组C中存在1,那么无论怎么找一堆数字,都可以凑成任何数,如果不存在1,那么无论如何也不会凑成奇数#include #include int main(){ //freopen("in.txt","r",stdin); int n,m; while(scanf("%d%d",&n,&m)!=EOF) {

2013-09-25 23:52:02 713

原创 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 706

原创 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 684

原创 hdu 4691 Front compression

后缀数组:寻找前一个区间与当前区间的前缀字符数目最多为多少#include #include #include using namespace std;#define LL long long#define N 100010char s[N];int m,n,len;int t[N],t2[N],c[N],height[N],sa[N],rank[N],dp[N][20],

2013-09-25 23:47:15 1463

原创 hdu 4263 Red/Blue Spanning Tree

给出一个图,如果要得到用k条蓝边组成的生成树,那么这个k值一定在用最少蓝边组成的生成树和最多蓝边组成的生成树之间,最少蓝边组成的生成树所用的蓝边数即为以红边为基准建造生成树,如果两棵树不在同一棵树上,那么就需要蓝边来连接,这样的话就可以求得所用的最小蓝边数,同样再以蓝边为基准,建造生成树,不断添加红边,就可以求得所需蓝边的最大数目,只要k在这个范围之内就输出1.采用并查集判定并连接两个子树

2013-09-25 23:43:28 1139

原创 hdu 4196 Remoteland

最小费马定理,差一点就过了,tle到死啊,后台数据也就一百多组,超时就超在printf("%I64d\n",p[n]*power(mod-2,ans)%mod);这,只能最后来一次power,否则就超时,无语的题目啊#include#include#include#includeusing namespace std;#define LL long long#define ma

2013-09-25 23:42:05 618

原创 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 851

原创 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 911

原创 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 927

原创 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 1354

原创 hdu 4640 Island and study-sister

bfs+状态压缩求出所有的状态,然后由于第一个节点需要特殊处理,可以右移一位剔除掉,也可以特判。然后采用集合的操作,#pragma comment(linker,"/STACK:1024000000,1024000000")#include #include using namespace std;#define inf 0x3f3f3f3fint n, m, cnt;int

2013-09-25 23:28:09 1254

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除