- 博客(73)
- 资源 (1)
- 收藏
- 关注
原创 codeforces 520E Pluses everywhere
/*题意:给出n和m表示有n个数字,可以在这些数字里头加m个+号计算所有可能的和比如:3 1108添加加号的可能1+0810+8两种的可能的和为27思路:对于每一个数位,枚举包含该位的l且,这个长度里头没有最后一位,只考虑该位,不考虑其他的,因为其他的和任何枚举的一个都一样,相当于一个压缩吧。对于当前位,也就是s[i]*10^(0...l)应该在i+l后
2015-10-30 16:29:39
495
原创 codeforces 183B - Zoo
/*题意:给出n,m。n表示给出的n个横坐标为1-n,y为0的坐标m表示下面有m个坐标,在横坐标上的点向各个角度看,在能够看到最多的点在同一条直线上的点的做多值为横坐标这一点的值,最后各个横坐标的值的和为多少思路:因为m的值为枚举任意的两个点连成的直线,看在直线上的点有多少,看这条线和横坐标的值为多少,是否是整值点,如果是就记录这个整值点的最大值*/#include
2015-07-17 19:17:08
915
原创 lucas定理的证明
http://baike.baidu.com/link?url=jJgkOWPSRMobN7Zk4kIrQAri8m0APxcxP9d-C6qSkIuembQekeRwUoEoBd6bwdidmoCRQB_dBklDffpzM_87iSPMyiph2iAXCTyv19YpuuG看一下这个冯志刚的初等数论证明对最后的补充(1+x)的a0次方展开式中每一项的形式可以写成C(a0,b0)x的
2015-07-11 11:31:07
1789
原创 codeforces 547C 容斥原理
/*题意:第一行有两个数n,q表示由n个数,q次询问第二行有n个数a1,a2.....接下来q行表示询问,每行一个数i表示ai在集合中是否存在(集合最初是空的)如果存在把这个去掉以后问剩下的数两两互质的数有多少个。若果不存在把这个数加入集合,问两两互质的有多少个。注意:如果判断这个数在集合中存在的标志是这个数是否存在且下标是否一致,如果数存在但下标不一致也应该把这个
2015-07-08 17:44:34
1376
原创 hdu 5222
/*题意:直接按照样例来说:有t组数据,没有数据有n,m1,m2,n代表有n个点,m1代表有m1条无向边,m2代表有有m2条有向边,一条边只能走一次(也就是题上说的走过之后路会坍塌)如果有两个1 2 ,1 2 代表1和2之间有两条边首先对于所有的无向边,我们使用并查集将两边的点并起来若一条边未合并之前,两端的点已经处于同一个集合了,那么说明必定存在可行的环(
2015-05-03 10:57:35
1225
原创 hdu 1011 Starship Troopers
/* 树形dp 题意: 给出一颗树,每个节点都有敌人,消灭敌人后会给报酬,自己的士兵一个能消灭20个,从节点1开始,如果根节点消灭,子节点就不消灭 给出一个n表示有n个节点,m表示自己士兵的数量,接下来n行,表示n个节点敌人的数量和报酬,接下来n-1行是树的情况*/#include#includeconst int maxn = 105;
2015-03-20 19:49:47
649
原创 树链剖分 FZU 2082
#include#include#includeusing namespace std;const int maxn = 50005;int val[maxn];struct node{ int l,r; long long sum;} xds[maxnvoid build(int ID,int l,int r){ xds[ID
2015-03-09 11:01:18
656
原创 POJ 1321 棋盘问题
#include#includeint check(int a,int m){ int b=0; while(a>0) { if(a&1) b++; a>>=1; } if(b==m) return 1; return 0;}int main(){ int n
2015-01-30 19:28:25
596
原创 hdu 3001 Travelling
/*题意:说一个人想游玩n个城市,每个城市最多走两次,问最短的距离*/#include#include#define MMax 2000000000#define Min(a,b) a>b?b:aint dp[59050][15],cs[59050][15],dis[15][15];//dp[i][j]定义的状态是在i状态时到达j的最短的,cs[i][j]表示在i状态下的经过j的
2015-01-30 11:05:23
773
原创 TSP+dp+状态压缩的本质
/*dis[1][2]=1;dis[1][3]=3;dis[1][4]=6;dis[2][3]=2;dis[2][4]=5;dis[3][4]=3;二进制从右往左依次代表的1-n,0代表没有经过1代表经过了,比如3化成二进制为11代表经过了1和2.dp[i][j]代表的状态为在状态i的时候从1出发最后到达j的值只经过一个点dp[1][1]=0//初始化,其他的都为无穷大
2015-01-29 17:11:36
696
原创 宏定义放在结构体里
#includestruct node{ #define Max(a,b) a>b?a:b//个人感觉宏定义放在结构体里和放在放在最上面是没有区别的,可能是为了读代码方便 int x,y;};struct node2{ int x,y;};int main(){ node a; node b; scanf(
2015-01-27 09:43:42
2687
原创 HDU 3681 Prison Break
/*给一个n*m的图,F代表起点,G代表充电池,一个充电池只能用一次,但可以用多个充电池,只能把电池充到最大(原始的电量),可以走过不用,D不能走,问的是把所有的Y走一遍的原始的电量是多少dp+状态压缩+二分+bfsdp[i][j]表示的状态是在i状态到达j的最大的电量*/#include#include#include#define Max(a,b) a>b?a:b#
2015-01-26 14:51:08
579
原创 HDU 4539 郑厂长系列故事――排兵布阵
/*曼哈顿距离的定义是:两个点的坐标为(x1,y1),(x2,y2),两点的曼哈顿距离为|x1-x2|+|y1-y2|题意:题上要求是两个士兵的距离不能是曼哈顿距离为2,意思就是这个点在同一行同一列不能相间,这个点的左上,左下,右上,右下角不能有士兵.思路:dp+状态压缩dp[i][j][k]定义的状态为i是当前行,j为当前行的状态,k为上一行的状态类似炮兵阵地*/#inclu
2015-01-24 09:45:57
2440
原创 曼哈顿距离
给定两个点坐标为(x1,y1),(x2,y2),|x1-x2|+|y1-y2|为两点的曼哈顿距离,Max(|x1-x2|+|y1-y2|)是切比雪夫距离对于原坐标系中两点间的 Chebyshev 距离,是将坐标轴顺时针旋转45度并将所有点的坐标值放大sqrt(2)倍所得到的新坐标系中的Manhattan距离的二分之一。
2015-01-24 08:28:55
2522
1
原创 hdu 2888 Check Corners
/*题意:给出m,n代表给出长为m宽为n的矩阵,然后给出一个q代表查询的次数,然后q行每行给出一个 r1, c1, r2, c2 且满足(1 <= r1 <= r2 <= m, 1 <= c1 <= c2 <= n)输出这个矩形范围内的最大值,如果最大值是四个顶点某一个的话就输出yes否则输出no*/#include#include#define Max(a,b) a>b?a:bin
2015-01-23 18:25:00
608
转载 poj 3311
//Floyd + 状态压缩DP//题意是有N个城市(1~N)和一个PIZZA店(0),要求一条回路,从0出发,又回到0,而且距离最短//也就是TSP(旅行商)问题,首先不难想到用FLOYD先求出任意2点的距离dis[i][j]//接着枚举所有状态,用11位二进制表示10个城市和pizza店,1表示经过,0表示没有经过//定义状态DP(S,i)表示在S状态下,从0开始到达城市I的最
2015-01-23 14:42:44
459
原创 HDU 1565 方格取数(1)
/*dp+状态压缩和炮兵阵地类似*/#include#include#define Max(a,b) a>b?a:bint dp[25][20000],s[20000],len,Map[25][25],n;int check(int m){ if(m&(m<<1)) return 0; return 1;}void Inint(){
2015-01-22 08:28:24
765
原创 大白书伸展树学习笔记
void splay(Node * &o,int k){ int d=o->cmp(k);//cmp函数比较的是k和o->ch[0]->s+1的大小 if(d==1) k-=o->ch[0]->s+1; if(d!=-1) { Node *p=o->ch[d]; int d2=p->cmp(k); i
2015-01-20 09:27:24
1000
原创 指向指针的引用
#includeusing namespace std;int main(){ int a=1; int *p=&a; int * & t=p;//引用简单点说就是一个变量的别名,它的本质是一个指针,t和p都是指向同一个变量,当t的内容变了的时候,p也跟着变 cout return 0;}
2015-01-17 11:36:55
669
原创 后缀数组之最长公共前缀
#include#define maxn 100int main(){ int rank[maxn],height[maxn],sa[maxn]= {0,3,1,4,2},s[maxn]= {1,2,3,2,3};//s串可以看成abcbc int i,j,k=0; for(i=0; i rank[sa[i]]=i; for(i
2015-01-15 20:53:31
1103
原创 后缀数组之倍增算法
#include#include#includeusing namespace std;#define MAXN 123123char s[MAXN];int sa[MAXN],t[MAXN],t2[MAXN],c[MAXN],n;void build(int m){ int i,*x=t,*y=t2; //其实下面的是计数排序 f
2014-12-31 09:10:46
894
1
原创 nyist oj nyoj 865
/*这个题暴力了一下找了个规律用欧拉函数快速筛素因数加上规律就过了给出任意一个数n化成素数幂的乘积的形式最后的结果等于各个素数幂的个数相乘比如72=8*9=2^3*3^2 F(72)=F(8)*F(9)=10*6=60而任何一个素数的幂次方的F(n)的结果为 1 2 3 4 5 6 (次方) 2 3 6 10 15 21 3 3 6 10 15
2014-12-28 20:31:48
782
原创 nyoj 24 Point game
/*题意:输入有t组 每组的n,m和n个数,问这n个数是否经过运算后是否和m相等,n个数的位置可调换搜索大体思路:把n个数经过一次运算后话为n-1向下搜索*/#includeconst double E=1e-9;int n;double v,num[7];double fac(double aa){ if(aa>v) return
2014-12-22 15:59:01
580
原创 poj 3518 Prime Gap 二分查找下界和素数筛法
/*题意:输入有多组数据,每组数据一个n,如果n是素数,输出0否则输出离n最近的两个素数的积,第100000个素数是1299709,所有的素数都在这个范围内思路:素数筛法加二分查找下界*/#includeint a[1299720],pri[100005];int Serch(int v)//二分查找下界{ int mid,x=0,y=100001;
2014-12-04 16:08:16
823
原创 二分查找下界 下界
#include#includeusing namespace std;int a[10000];int Serch(int x,int y,int v)//二分查找下界当找不到的时候返回的是第一个大于,因为当出现a[x]小于v的时候,a[y]大于v的时候,x=(y+x)/2,程序会执行else,所以返回的时候就是y的值;{ int mid; while(x
2014-12-03 19:26:42
819
原创 bnuoj Musical Chairs 约瑟夫环非递归
/*问题描述:n个人(编号0~(n1-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n1-1个人组成了一个新的约瑟夫环(以编号为k=m%n1的人开始):k k+1 k+2 ... n1-2, n1-1, 0, 1, 2, ... k-2并且从k开始报0。现在我们把他们的
2014-12-02 09:06:05
724
转载 static详解
static作用(修饰函数、局部变量、全局变量)在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容char a
2014-11-29 21:40:42
628
原创 nyist 762 第k个互质数
/*容斥原理:在计数时,必须注意无一重复,无一遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理*/#includeint pri[100],rc[100];void ou(in
2014-11-29 12:24:46
507
原创 快速求出欧拉函数值
/*欧拉函数的定义:E(k)=([1,n-1]中与n互质的整数个数). 因为任意正整数都可以唯一表示成如下形式: k=p1^a1*p2^a2*……*pi^ai;(即分解质因数形式) 可以推出:E(k)=(p1-1)(p2-1)……(pi-1)*(p1^(a1-1))(p2^(a2-1))……(pi^(ai-1))
2014-11-29 09:48:09
1782
1
转载 rmq算法
1. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。2.RMQ算法对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大
2014-11-23 13:00:28
418
原创 hdu Different Digits 1664
/*题意:给你一个数n找到一个数先要保证这个数的元素最少,在保证元素最少的情况下,保证这个数最小,元素最少指的是,111111就是一个元素,12222就是连个元素。思路:对于任意的整数 n ,必然存在一个由不多于两个的数来组成的一个倍数。 因为 a , aa , aaa…… 取 n+1 个,则由鸽笼原理(抽屉原理),必有两个模 n 余数相同,相减即得 n 的倍数 m 。而 m
2014-11-22 10:06:24
511
原创 hdu 超级密码 1226
/*同余的定义:如果m|(a-b)则a同余b即a与b对m取余后的余数相同定理:【1】如果a1同余b1(mod m) a2同余b2(mod m)则a1*a2同余b1*b2(mod m)【2】如果a1同余b1(mod m) a2同余b2(mod m)则a1+a2同余b1+b2(mod m)证明:1)a1=b1+k1*m a2=b2+k2*ma1*a2=b1*b2+(k1
2014-11-17 15:55:08
562
原创 胡搞
1.查内存的使用情况:tasklist,其实这是查每个进程的情况。2.查CPU的使用情况,在CMD命令行下没有这类命令了。另外:有一个systeminfo(执行后,请用鼠标拖动右边的滚动条查看)可以在“处理器(Processor(s))”看到处理器数的基本情况,也可以在“物理内存总量(Total Physical Memory)、可用物理内存(Available Physical Memo
2014-11-16 19:17:57
582
原创 poj 1256 Anagram
/*题意:有t组数据,每组有不超过13个字符的字符串,有大小写的区分顺序是'A'按从小到大的顺序输出。排序后像输出素数环一样输出,问题是怎样进行判重,加一个标记,但这个标记不递归下去,因为排序后相同的字符肯定在一块当和标记不一样时,因为有for循环存在,所以不会再出现,所以就去掉重复的,因为是递归,所以每一层都有一个flag1,但每一层的flag1的值是不一样的*/#i
2014-11-15 16:14:00
514
原创 poj 1231 The Alphabet Game
/*题意:给出一些字母的坐标,是否能把相同的字母放到同一个矩形中,使每个矩形都不重合,重合一个点也不行2 两组数据3 2 K,P,K个字母,每个字母有P个坐标6 4 8 44 2 2 12 3 2 4如果两个矩形映射到x轴和y轴上都都有重合的,那么他们就有重合的1. 对于同一种字母,求出它出现位置的最左边、最右边、最上边、最下边。这就构成了一个矩形。2. 对于
2014-11-15 12:56:18
545
原创 poj The Clocks 1166
/*题意:给一个3*3的图,每个数字都在0-3的范围内,0代表钟表12点,1代表3点,2,3,分别代表6点和9点有九种方式移动,每种移动特定的几个,每次移动都顺势针移动90度*/#includeint main(){ int a[15],b[15],c[15],i; for(i=1; i scanf("%d",&a[i]);
2014-11-14 12:40:13
421
原创 hdu 1026 Ignatius and the Princess I
/*题意:给一个n*m的图,图中有X,有.有数字,x代表墙,.代表路,数字代表当走到这个地方的时候,还要停留多少秒,问你从左上角到右下角的最少时间是多少。当能走通的时候,要把路径打印出来。除了Map数组和标记数组之外,还应该有一个结构体数组存放当前点是由那个点广搜过来的*/#include#include#includeusing namespace std;c
2014-11-13 13:14:58
388
原创 hdu 1254 推箱子
/*bfs+bfs,首先是上一步的人位置能否在某个方向推动箱子,然后就是箱子移动后的标记,开一个三维数组进行标记前两维标记坐标,第三维标记箱子从什么方向推到该位置*/#include#include#includeusing namespace std;int Map[10][10][2],n,m,Map1[10][10][4],bu[4][2]={0,1,0,-1
2014-11-06 12:58:53
468
原创 hdu 逃离迷宫 1728
/*以源点为为一个队列,搜遍队列所有元素的四个方向,存到另一个队列,在遍历另一个队列这样我们就不用考虑,是否拐过弯了*/#include#include#includeusing namespace std;char Map[105][105];int Map1[105][105],bu[4][2]= {0,1,0,-1,1,0,-1,0},n,m,T;
2014-11-01 21:25:01
412
原创 HDU 1983 Kaitou Kid - The Phantom Thief (2)
/*dfs+bfs 最多有四个,因为把入口的上下左右的四个方向都堵住,肯定偷不到宝石,所以用深搜每一个点,用广搜判断是否能偷到,广搜是,用三维数组进行标记,再搜原图,刚开始搜是,用Map1[][][0]标记第一层,当找到宝石的时候,用Map[][][1]标记,这样原来走过的的点也能走(想当与把搜到的第一个点当成源点进行搜索)。*/#include#include#i
2014-11-01 14:31:11
477
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人