自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 HDU5754(博弈)

意思是说四种棋子。问你随便一种棋子在一个n*m的格子上下棋是否能赢。王:只能右、下和斜着走一格。他的必胜必败态可以找规律得到。皇后:和王一样,但是能走任意步。骑士:只能右、下,但是可以任意步。马:走日。分析:马的话,可能会出现平局,所以预处理出来每个点的必胜必败就好了。从1000*1000这个点往回跑。王的话会发现当n和m都为奇数时先手赢不了。集体画3*3 5*5 4*4

2017-07-30 15:04:14 288

原创 树上博弈

描述小Hi和小Ho经常一起结对编程,他们通过各种对弈游戏决定谁担任Driver谁担任Observer。今天他们的对弈是在一棵有根树 T 上进行的。小Hi和小Ho轮流进行删除操作,其中小Hi先手。  游戏的规则是:每次删除,小Hi或小Ho都可以选择一个非根节点,将以该节点为根的子树从 T 中删除。如果删除之后 T 只剩下一个根节点,则该次操作者胜利。  机智的小Ho认为规则对自己不利

2017-07-30 14:56:06 2272

原创 二分套二分

描述小Hi的学校正面临着废校的大危机。面对学校的危机,小Hi同学们决定从ABC三个班中各挑出一名同学成为偶像。  成为偶像团体的条件之一,就是3名团员之间的身高差越小越好。  已知ABC三个班同学的身高分别是A1..AN, B1..BM 和 C1..CL。请你从中选出3名同学Ai, Bj, Ck使得D=|Ai-Bj|+|Bj-Ck|+|Ck-Ai|最小。输入第一行包含3个整数,

2017-07-30 14:27:18 332

原创 “玲珑杯”ACM比赛 Round #19 B(RMQ大法好啊,比线段树快得多!!!!)

#includeusing namespace std;typedef long long ll;int a[200010];int maxl[200010*2][30];int minl[200010*2][30];int n,kk;void S_table(){ int l = int(log((double)n)/log(2.0)); for (int j=1

2017-07-29 17:03:13 557

原创 51nod1873(大数浮点数幂次)

#include #include #include #include #include #define INF 1E9using namespace std;struct BigNum{ int len; int num[10000]; int point; BigNum() { len=1; point=0

2017-07-29 12:21:50 556

原创 HDU5816(状压DP,位运算的一些技巧)

题意:牌堆里有 N张 A类卡,M张 B类卡 A类卡能让你从牌堆里抽两张卡 第 i张 B类卡能让你对对手造成 x_i点伤害 刚开始从牌堆抽 1张牌,并且对手有 P点生命值 问一回合内打倒对手的概率是多少分析:n+m#includeusing namespace std;typedef long long ll;ll dp[1<<21];ll f[25];in

2017-07-28 20:40:17 547

原创 HDU5809(KD-tree)

存一波KD-tree模板,感觉这个板子不错,挺全的,封装了。#include#define mp Pointusing namespace std;typedef long long ll;const ll inf=9e18;const int MAXN=1e5+5;namespace KD_Tree{ struct node { node *ch[2

2017-07-28 19:32:02 313

原创 HDU5810(概率)

分析:相当于扔一个球到m个盒子,重复n次。 直接套二项分布公式就出来了:样本方差的期望 = 总体方差公式: np(1-p)此处p = 1/m;#includeusing namespace std;typedef long long ll;int main(){ ll n,m; while(scanf("%lld%lld",&n

2017-07-28 14:15:14 290

原创 HDU5781(概率DP)

题意:钱的范围是0-2000,最多可悲警告k次,问取出所有钱的次数期望。分析:因为这个人足够聪明,所以她一定会每次折半取,所以这样的话最多也就给警告log次,该题也就是11。所以只需要枚举她可能的钱数和警告次数。怎么转移呢?吐过取出k的钱之后没有警告,那么就转移到dp[i-k][j],如果给警告了,那么就说明钱最多为k-1块,转移到dp[k-1][j-1]。这又分别是多少概率呢?能

2017-07-28 12:37:59 321

原创 HDU5784(n个点组成多少钝角三角形,然而无论什么三角形都是同理的)

题意:给你n个点,可以组成多少钝角三角形。分析:答案毋庸置疑,(锐角个数-(钝角个数+直角)*2)、3;暴力的方法,枚举出所有的边,然后在枚举角度,但是这样是n^4的。太暴力但是如果对斜率拍个序,这样就能把两两角在锐角和钝角的区间划出来。再用双指针枚举。复杂度就只有n^2*log(n)了。具体看代码。#includeusing namespace std;typedef long

2017-07-28 11:22:15 2678 1

原创 HDU5782(结论题hash+字符串同构)

【题目大意】  给出两个字符串,判断他们每一个前缀是否循环同构,循环同构的意思就是,字符串首位相接拼成一个环,两个环通过旋转可以相等。 【题解】  这道题用到了一个神奇的结论,如果S字符串和T字符串循环同构,那么必有S=u+v,T=v+u,而且u和v必有一个是最长匹配。  那么根据这个结论,我们可以用KMP算法在T中找S的最长前缀,也就是每次匹配到i时候的j。那么对于T的前缀和

2017-07-28 10:34:01 410

原创 HDU6053(莫比乌斯)

表示不懂啊,。挖个坑先题意:求n个数,分别比给定n个数小,他们不是互质的情况有多少种。题解::莫比乌斯容斥,,,,,#include#include#include#include#include#include#include#include#include#include#include#include#define nl n<<1#define nr (n<

2017-07-27 21:12:23 712

原创 HDU6055空间内n个点能组成多少个正方形

#include #include #include #include #include using namespace std ;#define eqs 1e-9struct node{ double x , y ;}p[1100] ;bool cmp(node a,node b){ return ( a.x < b.x || ( a.x == b.x &&

2017-07-27 16:51:01 1026

原创 HDU5792(树状数组)

PS:思维还是太弱了,计算方法太神奇!题意:就是找四个不同的数,ad.算种数分析:简化一下问题,如果单纯求ad,树状数组求逆序对即可。但是这里a,b,c,d不能相同。那么就考虑一下怎么去重。枚举一个数,他左边比他小的数就可以当做a,相当于他是b。他左边比他大的数就是c,相当于他是d。同理,看右边是一样的。那样把左边所有小于当前数的数求和,大于的一样。乘积是什么。就是算可以重复的总种数。这时

2017-07-27 10:37:26 199

原创 HDU4691用RMQ求所有字符串后缀的最长公共前缀

测试证明板子二虽然常数大。但是还是比板子一快的多。板子1:复杂度n*log*log#include #include #include #include #include #define ll long long#define maxn 100010using namespace std;char s[maxn];int n,k,q;int rank[maxn],s

2017-07-26 21:09:32 353

原创 HDU5769后缀数组,高度数组模板

这个后缀数组模板复杂度O(n),但是长度太大,可以看做nlog(n).高度数组可以利用后缀数组O(n)求出!#include #include #include #include #include using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int MAXN=100010;int

2017-07-26 20:03:34 373

原创 HDU5768(初试中国剩余定理)

题意:给你n+1个同余式,求l--r区间内满足所有同余式的数的个数。题解:解决n个同余方程,又因为有两两互质。首选中国剩余定理。n为15,可以暴力枚举1#include#include#include#include#include#include#include#include#include#include#include#include#define nl n<<

2017-07-26 17:20:41 422

原创 超级读入挂HDU(6044)

#include #include #include typedef long long LL;namespace fastIO { #define BUF_SIZE 100000 //fread -> read bool IOerror = 0; inline char nc() { static char buf[BUF_SIZE], *

2017-07-26 14:02:20 916 3

原创 HDU6040(思维题)

题意:通过题目所给函数求出a数组,然后根据b数组排a数组。ai必须是a数组中第(bi+1)大的数。分析:先通过下标对b数组排序。然后扫一遍b数组,如果相邻两个位置b相同,那么就还选上一个a(因为n可以小于m),所以可以多选。然后就可以利用快拍的思想来优化。因为是bi+1个数,所以可以把比a[bi+1]小的数放到左边,大的放在右边,这样下次扫b的时候只需要扫一边,这样优化就能过题了#includ

2017-07-25 21:24:33 1378

原创 codeforces811C(DP)

题目大意:现在给你一个长度为N的序列,我们可以将一些子序列设定为一堆,其价值为这堆中每种数字的异或值。总价值为子序列的值的加和。我们要求分成子序列的部分假设包含了数字5,那么整个序列出现的数字5都必须被这个子序列所包含。问最大价值。分析:因为每个区间是不能相交的 ,所以预处理出来每一个区间的价值,然后DP就好了,到第i个位置能有多少价值,无非就是从第j个位置加上i-j区

2017-07-25 10:23:51 255

原创 codeforces808E(超大背包的解决问题,中途相遇法)

题意:超大背包问题。但是只有三种重量。分析:从只有三种重量1,2,3入手。2可以由1组成,3可以有1,2组成。所以考虑中途相遇法。分别处理选1,2和3的情况,然后DP答案!#include#include#include#include#include#include#include#include#include#include#include#include#def

2017-07-25 09:35:46 517

原创 HDU5775(树状数组)

分析:由冒泡算法可知,一个数是先往右移,再往左移。所有从后往前扫,看每一个数右边有几个比他大的数,那么就知道要往右边移动几次,左边的话,就看现在的位置和他本身的大小,谁小就在哪#include#include#include#include#include#include#include#include#include#include#include#include#def

2017-07-24 19:50:05 264

原创 HDU5727(贪心)

分析:这个题可以反过来想。用最少的硬币把多出来的钱凑完。但是输入并不保证可以正好凑出来。所以必须考虑完不成的情况。因为10种面值里面只有50和500前面的面值不是他的因子(20和200)。所以得考虑是否把50和500都用完。因为50不能由20组成,500不能由200组成,所以每次搜索时要考虑全用或者留一个。从而保证结果最优!#include#include#include#include#

2017-07-24 19:04:35 227

原创 HDU5531(三分)

分析:这个题就是让我们给一个多边行每一个顶点为圆心画圆,然后相邻顶点的园是像相切的,使面积最小。题解:这个题,如果是奇数多边形的话,可以推导出来,每个圆的半径是固定的。以三角形为例即可证明。如果顶点是偶数个,那个就三分一条边,因为可以以四边形证明,半径越趋于边长的一半,他的总面积就会最小,符合凸性#include#include#include#include#includeusin

2017-07-24 17:39:22 251

原创 随机生成函数

double my_random() { return (double)rand() / RAND_MAX; }int my_random(int low, int high) { return low + (int)(my_random() * (high - low) + 0.5); }int main() { srand(time(NULL)); return 0; }

2017-07-24 16:31:45 290

原创 long double加精度和输入输出流的关闭

#include#include#include#include#include#include#include#include#include#include#include#include#define nl n<<1#define nr (n<<1)|1using namespace std;typedef long long ll;typedef pairP

2017-07-24 09:17:52 576

原创 HDU5823(状压DP)

给你一个n个点的图,问每个子集的最小色数题解:每个子图的染色问题,可以看成是找每个子图的独立集问题(两两顶点互不相邻的图叫独立集),可以先枚举每个状态,然后枚举每个顶点,表示以这个顶点为起始的子图,再枚举每个顶点,表示这个顶点和上面那个顶点所构成的图是一个独立集,预处理出所有非法的状态,即他们之间有边。首先预处理出每个点集的子集是否为独立集. 然后令dp[S]表示点集S的导出子图的

2017-07-23 17:34:58 359

原创 zoj3886(线段树,区间取模)

因为一个数最多只需要log(n)次就会变成1,而模数大于他本身,他又不会变化,最次每次o(n)修改区间,最多也不会多过log(n)次,所以复杂度是正确的。暴力修改就好#include#include#include#include#include#include#include#include#include#include#include#define nl n<<1#d

2017-07-23 16:56:39 564

原创 HDU5828(线段树好题,区间加,区间求根号,吉老师在51nod直播讲过这道题,相应的还有区间取模)

题解:区间加,区间和不用说。重点在区间取模,首先,就算一个很大的n,几次根号之后就会很小。我们可以思考一下,如果一个区间内的极差>1的时候,不断地进行整体加某个值然后开方,是没办法保持住这样的序列的(相邻两个极差都>1)。只有整个区间内的极差#include#include#include#include#include#include#include#include#in

2017-07-22 22:21:29 1043

原创 Bzoj 4922(字符串匹配新高度+DP)

题意:现给定n个括号序列,你需要选择若干序列,将它们按一定的顺序从左往右拼接起来,得到一个合法的括号序列。计算可以得到的合法的括号序列的长度的最大值。题解:首先对于每个括号序列,把左边的左括号和右边的右括号对消,最后能得到一坨这样的东西: ))…))((…(( 就是x个右括号然后y个左括号,记作(x,y)然后考虑假如我们的子集选好了,我们要按照什么顺序拼接才能拼成一个合法的

2017-07-22 15:48:26 252

原创 HDU5855(最大权闭合图构图技巧+裸的最大流)

题意:给了n个工厂,m个商店,每个商店只有在要求的工厂都建好后才能获得利润,而建一个工厂需要花费和时间,现在问你能获得利润至少为l的最短时间是多少,在这个时间下的最大利润是多少;题解:因为每一个商店盈利都必须有一些工厂修好。这就是一个闭合图的暗示!闭合图:一个有向图的子点集,使其中的点的出边都指回集合中的点,则称此为闭合图。最大权闭合图:给每个点赋上点权,则权和最大

2017-07-22 14:57:58 285

原创 HDU5860(约瑟夫环问题。超级牛B的动态规划思维题,DP嘛,推出递推式谁不会写)

题意:n个人站一排,从第一个人开始,每隔k个人死一个人,问第x次死的是哪个位置上的人。题解:只需要知道一件事,如果这一轮第i个人死不了,下一轮他的位置是i-i/k-1。然后相当于又是一个子问题,就可以递推了。#include#include#include#include#include#include#include#include#include#include#inc

2017-07-22 11:32:26 771

原创 HDU5863(dp,矩阵加速)

题意:用k种字符来组成另个长度为n,但是最大字串匹配为m的方案数。匹配必须相同位置连续。题解:明显的一个动态规划,如果前i个字符已经组成了j个相同字串,那么下一个字符可以继续相同,那么就是*k。如果从这一位开始断掉,那么*k*(k-1)。dp[i][j]表示现在构造了i长度,长度j后缀连续对应相等,那么dp[i][j] = dp[i-1][j-1]*k,特别地,dp[i][0] = s

2017-07-22 09:55:21 273

原创 HDU5862(树状数组好题)

题意:给一些平行坐标轴的线段,。统计相交数题解:可以这样考虑,把所有与x轴平行的线段存起来,用来枚举。把与y轴平行的线段的左右端点存起来。这样在枚举x线段时。就需要看x线段的左端点左边有多少,右端点有多少,相减就是中间重合的。如何维护这些数据呢?当然就得用树状数组了。,简单粗暴#include#include#include#include#include#include#incl

2017-07-21 21:37:01 379

原创 HDU5861(线段树好题)

题解:找到每一段路最开始的时间和结束的时间,然后一起统计。区间最值问题,首选线段树。可以先对m条边倒着更新一遍线段树,便可以知道没一个点最开始的时候在哪一条线段上。然后再正着跟新一遍,就知道每个点最终结束在哪一条线段。然后合并统计#includeusing namespace std;int node[200010*4];vectorin[200010],out[200010];voi

2017-07-21 21:32:33 337

原创 几何HDU5858

这里只我的思路说一下。思路:给出正方形边长L。BD为圆的半径为L/2,BA为正方形对角线的1/2,AD为1/4圆AEF的半径为L,则能根据余弦定理求出∠a,进而求出∠b,进而求出扇形ACD的面积以及三角形ABD的面积。用扇形ACD的面积减去两倍的三角形ABD的面积为饼BCD的面积。然后根据三角形ABD的三边求得∠c,进而求得∠d,进而求得以B为圆心的扇形BCD的面积,然后用扇形BCD的

2017-07-21 16:54:58 266

原创 HDU5936折半枚举+思维

因为K只有10,如果x为999999999,F(x,k)也就才9^10,所以y的最大值不会很大,预计10^10,所以把这10位数,折半枚举一下,预处理左边5位,然后再枚举右边5位,这样时间复杂度就只会有n*logn(n=100000);问题得到解决。#includeusing namespace std;typedef long long ll;const int INF=0x3f3f3f3

2017-07-21 11:26:13 296

原创 强连通缩点,求最小价值!hdu5934

#includeusing namespace std;typedef long long ll;const int INF=0x3f3f3f3f;const ll INFF=0x3f3f3f3f3f3f3f3f;struct node1{ ll x,y,r,c;}node[1010];ll dis(int i,int j){ return (node[i].x-

2017-07-20 17:13:25 175

原创 线性筛素数的欧拉筛法

#include#include#define MAXN 100005#define MAXL 1299710int prime[MAXN];int check[MAXL];int tot = 0;memset(check, 0, sizeof(check));for (int i = 2; i < MAXL; ++i){ if (!check[i]) { pr

2017-07-19 20:02:18 419

原创 树状数组好题(codeforces828E)

题意:给你一个只包含四字母的字符串,用另一个字符串去匹配该字符串的一个区间,第二个字符串只是一个循环节,知道把区间全部匹配一次,计算相同的字母数。经典的单点更新和区间求和的问题(有没有感觉?)题解:因为只包含四种字母,第一感觉就想分块搞。但是又和前缀和没什么关系,因为得比较每一位。但是第二个字符串又只有10,相当于什么呢?把整个数列分成10块的,更新的时候就只需要看属于那一块,然后往后更新答案

2017-07-19 19:22:21 381

空空如也

空空如也

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

TA关注的人

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