自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 开多个链表操作

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>#include<stack>#include<queue>#include

2018-04-07 17:36:14 716 2

原创 poj2749 2-SAT

别的不说,只说建图。看代码#include#include#include#include#include#include#include#include#include#include#include#include#define nl n<<1#define nr (n<<1)|1#define fi first#define se secondusing na

2017-09-04 19:52:01 386

原创 带负值的背包问题poj2184

1:选的牛要保证两个属性和都要大于0。2.总和最大!想到什么。01背包,一个数要么不用,要么用,让价值最大。因为会出现负值,并且两个值均大于0 ,那么假设第一种属性已经大于0了--重新设置0点,让100*1000为0点,过了这个点,就说明选的第一个属性和大于0了,反之则没有。那么这时候就只需要管第二种的属性了。把第一种当做消耗来算,第二种属性来算价值(相当于只有花费a,才能得到b。因为

2017-08-18 20:57:22 2076

原创 HDU6148

简单的数位DP。只需要判断是否在递减之前出现过递增#include#include#include#include#include#include#include#include#include#include#include#include#define nl n<<1#define nr (n<<1)|1using namespace std;typedef lo

2017-08-18 16:54:00 413

原创 最大团算法(codeforces839E)

题意理解玩,YY一下,就知道要把K平均分给最大团里面的每个点,然后乘积和就是答案。最大团就是有n个点的完全图,完全图就是n个点有n*(n-1)/2条边的图、有高效算法求的。。//最大独立集:一个图中最大的互相没有边相连的点集。//结论:原图的最大独立集等于补图的最大团const int maxn=1010;int best;int num[maxn];// int x[max

2017-08-16 18:09:40 2927

原创 HDU5988(最小费用流)

题意:图上有n个点,每个点上有a个人,b个面包,面包不够吃得去其他地方,但是每次走一条路,除了第一次,第二次开始都有P的概率让路坏掉。求路被破坏的最小概率。分析:第一次没影响,那就对(流量-1)给花费即可。如果面包比人多,说明其他人能来这里吃,那么就把多余的连向源点。然后如果不够就把不够的连向汇点。       难点:概率是乘法。没法算费用。但是如果同时取对数,那么就成加法了,就可以做了!

2017-08-14 19:17:31 443

原创 怒艹一波KD-tree

KDtree可以快速求多维空间一个点离他最近的点。这个题是HDU5592.裸的KD-tree#includeusing namespace std;typedef long long ll;const int inf=1e9+7;int root,n,m,key;ll len;ll sqr(ll x){ return x*x;}struct node{ int

2017-08-14 16:51:02 311

原创 HDU5880(AC自动机)

多模字符串匹配模板#include #include #include #include #include using namespace std;int ans[1000010],cnt[1000010];struct Trie{ int next[1000010][26],fail[1000010],End[1000010]; int root,L,pos;

2017-08-07 20:13:43 355

原创 HDU5410(01背包+完全背包)

背包变形,变成了每次都加A[I],但是B[I]只加一次。一开始直接写了多重背包,后来发现b【i】加多了。后想想的确是想麻烦了。完全可以直接先01把两个都背一次。然后再完全背包只背a就ok了、#includeusing namespace std;typedef long long ll;int w[1010],a[1010],b[1010];int dp[2010];int main()

2017-08-04 21:50:52 251

原创 玲珑杯1114(组合数)

题意:求有多少个以1号点为根的N个点的带标号有根树, 满足深度为奇数的点恰有K个, 答案对998244353取模根的深度为1分析:记SMN 为左边N个点, 右边M个点的完全二分图生成树个数答案即SKN−K×(N−1K−1), 证明显然, 因为把树上的点按照奇偶分层,即得到一个二分图, 每一棵树都对应了这个完全二分图的一个生成树SMN=NM−1×MN−

2017-08-03 21:41:59 374 1

原创 再谈FFT,不过如此。应该是这个题简单

现在有n个元素ai然后现在有Q个询问,每次月大叔想问一共有多少对pair,满足a[i]+a[j]>=k(其中 iINPUT输入第一行包含一个正整数t(1≤t≤100),表示有t组数据对于每组数据:第一行两个整数n,q。表示有n(1≤n≤100000)个元素,q(1≤q≤100000)次询问第二行n个整数ai(1≤ai≤100000),表示

2017-08-02 21:11:48 376

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

原创 二分套二分

描述小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 331

原创 “玲珑杯”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 555

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

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

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

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

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

2017-07-28 11:22:15 2676 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 352

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

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

原创 超级读入挂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 1377

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

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

原创 HDU5531(三分)

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

2017-07-24 17:39:22 250

原创 随机生成函数

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 573

原创 HDU5823(状压DP)

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

2017-07-23 17:34:58 358

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

空空如也

空空如也

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

TA关注的人

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