自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 CodeForces 594D REQ(树状数组)

分析:第一反应是用莫队来写,这样每次查询的复杂度是o(n∗n−−√)o(n*\sqrt{n}),设MM是a[i]a[i]中最大的数,那么每一次修改的复杂度是o(logM)o(logM),那么总的复杂度是o(n∗n−−√∗logM)o(n*\sqrt{n}*logM),这样的复杂度给人的感觉应该是要TT了,交上去确实也T了,如果nn是10410^4级别应该就没什么问题了。感觉这个可以作为莫队算法在一类

2015-11-27 12:38:53 805

原创 HDU 1584 蜘蛛牌 (区间DP)

分析:最后的状态是所有的牌都在一堆,一开始有十堆,这个时候比较容易想到石子合并问题,但是有点问题,左区间最终状态不是一堆怎么办?比如左区间是:4 5 7 8,这几个数不可能合并到一堆,这个时候预处理出每个数的位置,把数重新从小到大排一下序以后就是一个区间合并问题了。转移方程: dp[i][j]=min(dp[i][k]+dp[k+1][j]+w[k][j])dp[i][j]=min(dp[i][k

2015-11-19 22:26:41 650

原创 ZOJ 3777 Problem Arrangement (状压DP)

分析:题目要求数学期望,其实就是求最终值≥M\ge{M}的概率。暴力的做法:找出所有排列方式,一个一个找:o(12!)o(12!),贵了。对数据敏感的话,应该比较容易想到状压。 dp[i][msk][j]dp[i][msk][j]代表前ii个数用了mskmsk状态的数,和为jj的排列总数。 那么转移方程: dp[i][msk][j]=∑msk第k位为1dp[i−1][msk|1<<k][j−p

2015-11-19 22:13:53 437

原创 POJ 1222 EXTENDED LIGHTS OUT (异或消元)

分析:一共有3030个开关,3030个灯,设a[i][j]a[i][j]代表第jj个开关对第ii个灯的贡献,那么a[i][j]=1a[i][j]=1或者00,其中a[i][i]=1a[i][i]=1,周围44个灯的贡献为11,其他都是00,用x[i]x[i]表示第ii个开关有无按下,c[i]c[i]表示第ii个灯的初始状态,那么对于第ii个灯,得到异或方程: c[i] xor (a[i][0]∗x

2015-11-18 00:04:12 349

原创 HDU 1402 A * B Problem Plus (FFT求高精度乘法)

存一波代码:题目比较简单。#include <bits/stdc++.h> #define LL long long #define FOR(i,x,y) for(int i = x;i < y;++ i) #define IFOR(i,x,y) for(int i = x;i > y;-- i)using namespace std;//FFT copy from kuangbin const

2015-11-17 21:12:05 628

原创 HDU 5544 Ba Gua Zhen (dfs&独立回路&异或消元)

这道题和BZOJ 2115 基本一样,容易一点,直接存个代码:这个代码要好看一点(好像并没有什么区别。。。)#include <bits/stdc++.h> #define LL long long #define FOR(i,x,y) for(int i = x;i < y;++ i) #define IFOR(i,x,y) for(int i = x;i > y;-- i)using nam

2015-11-17 16:31:36 974

原创 BZOJ 2115 Xor(dfs&独立回路&异或消元)

学习的秦总的写法写的dfsdfs找独立回路和异或消元:秦总博客独立回路的定义和独立回路个数=M−N+1=M-N+1的证明,博客里面都有,但是dfsdfs找的过程好像需要22倍的空间,不能理解。。。分析:这题要明白一个东西,u−>vu->v的所有路径可以由u−>vu->v的一条任意路径+该图的所有独立回路的线性组合完成,其实想一想还是很好理解的,有一点很重要:比如1−>71->7是一条路,然后怎么进过

2015-11-17 16:27:11 696

原创 HDU 3949 XOR (异或消元)

附上链接:hzwer讲的很清楚。 附上秦总博客:秦总分析:异或消元最后得到的是一组基,那么这些数能够异或出来的值,都是这些基线性组合形成的数,注意,消元以后得到的基是有顺序的(排序以后也能得到顺序),这个时候由于每一位都不可能进位,所以最大的基肯定是第2row2^{row}小的,rowrow是矩阵的秩。包含00,这个很容易理解,本题的要点就是00能不能取得问题。附上代码:(其实我是来存代码的,一开

2015-11-17 01:18:26 1395

原创 HDU 4609 3-idiots(FFT学习)

附上kuangbin大神博客:讲解的非常清楚分析:暴力枚举aka_k,那么问题变成了找满足ai+aj>ak(i,j,k互不相等)a_i+a_j>a_k(i,j,k互不相等)的(ai,aj)(a_i,a_j)的对数。FFT求出所有可能的和的对数,然后去掉坐标相同的就可以了。PS:目前就写了两道FFT,基本上都是卷积的应用,FFT神奇的地就是能在nlognnlogn的时间内算出所有的X(k)=∑a[i]

2015-11-15 23:54:28 476

原创 CC Arithmetic Progressions (FFT + 分块处理)

学习的cxlove大神的博客:传送门关键点:枚举中间的数,如果其他两个数不在当前块中,那么前面的所有的块和后面所有的块做卷积,得到前面序列和后面序列相乘的情况。如果有这两个数有数在当前块,那么枚举前一个数在当前块,后一个数不在当前块,枚举后一个数在当前块,前一个数在当前块或者不在当前块,都可以。分块的关键:是复杂度降到o(k∗(Nk∗Nk+M∗logM)o(k*({N\over{k}}*{N\ove

2015-11-15 23:40:25 472

原创 HDU 5519 Kykneion asma(沈阳站K题&&DP+容斥)

这题想了好久没想出来,最后是学习的这里的做法解决的:K题题解基于FFT,本弱到现在还是不会写,所以并不能提供FFT的写法。分析:设W(n,a0,a1,a2,a3,a4)W(n,a_0,a_1,a_2,a_3,a_4)代表可以有前导00的nn位55进制数字,至多aia_i个数字ii的方案数。那么 ans=W(n−1,a0,a1−1,a2,a3,a4)+W(n−1,a0,a1,a2−1,a3,a4)+

2015-11-13 12:46:22 2039

原创 HDU 5515 Game of Flying Circus (2015沈阳G题&&二分模拟)

题意:参考该文章分析:昨天到今天wa了26发,题意没搞懂+解方程无限wa,坑点:打了一架以后这个人就获得了一分,所以最终两个人共可获得5分。据说解方程卡精度,无限wa。。。泪崩。。。代码:#include <bits/stdc++.h> #define LL long long #define FOR(i,x,y) for(int i = x;i < y;++ i) #define IFOR(i,

2015-11-10 15:36:06 774

原创 HDU 5517 Triple (2015沈阳站I题&&二维树状数组)

题意:给一个nn个二元组:<a,b><a,b>,给mm个三元组:<c,d,e><c,d,e>。如果b=eb=e那么可以合并二元组,三元组,得到一个新的三元组:<a,c,d><a,c,d>。设所有的二元组,三元组组合后得到的新的三元组的集合是CC。 求CC集合中满足条件的三元组的个数。条件:设这个三元组为uu,在这个集合中找不到任何一个元素,使得改元素中每一个数都大于等于uu中对应的成员。分析:学习

2015-11-09 09:24:29 1573

原创 HDU 5510 Bazinga (2015沈阳站B题&&KMP)

分析:从后往前扫,维护rr(当前串是第rr个串的子串)。预处理,从后往前扫,每次比较相邻的两个串,前面的串是不是后面串的子串,如果不是那么rr向后面找到第一个是子串的位置。记录下当前串的位置。从当前串向前扫,如果当前串不是r的子串,那么r++r++,找到第一个是子串的位置,否则,l−−l--。复杂度:o(nl)o(nl)代码:#include <bits/stdc++.h> #define LL l

2015-11-08 12:46:47 696

原创 HDU 5514 Frogs (2015沈阳F题&&容斥+剪枝)

分析:a[i]a[i]能到达的点为gcd(a[i],m)gcd(a[i],m)的倍数。预处理出所有gcdgcd,两个不同a[i]a[i]能同时到的点为lcm(gcd(a[i],m),gcd(a[j],m))lcm(gcd(a[i],m),gcd(a[j],m))的倍数,容斥写,当遇到当前值是这个gcd(a[i],m)gcd(a[i],m)的倍数是,那么就不用算这个。具体复杂度我也不会算。代码:#in

2015-11-08 12:37:13 852 2

原创 HDU 5521 Meeting (2015沈阳站M题&&dijskstra最短路)

分析:优先队列维护当前节点的最短路,每次更新当前节点所在的所有集合里面的所有节点的最短路,扔到优先队列里面,标记这个集合找过了。复杂度:o(∑Si)=o(106)o(\sum{S_i})=o(10^6)代码:#include <bits/stdc++.h> #define LL long long #define FOR(i,x,y) for(int i = x;i < y;++ i) #defi

2015-11-08 12:23:45 667

原创 HDU 2896 病毒侵袭(AC自动机)

分析:这也是一道很裸的AC自动机,单词结尾的节点不在是1,而是id,即这个单词的序号,然后用vector把所有序号存在来,一遍去重,然后输出答案就好了。总的复杂度为o(m*l)代码:#include <bits/stdc++.h> #define LL long long #define uLL long long #define FOR(i,x,y) for(int i = x;i < y;++

2015-11-07 00:03:23 438

原创 HDU 2222 Keywords Search (AC自动机)

AC自动机上学期看过,看是一直没有写过,今天把这道模板题写完了。 附上学习博客的地址:AC自动机 代码风格是模仿的bin神博客的。分析:理解了KMP以后AC自动机并不是很难理解。KMP是对于一个串找公共前后缀,而AC自动机是对于一颗Trie树找公共前后缀。要点:如果匹配失败了,那么要转到fail指针后面的进行匹配。 代码中预处理出所有的ch值,这样扫匹配串:ch[now][str[i]-‘a’

2015-11-06 18:24:23 743

原创 HDU 5527 Too Rich (2015长春站A题&&贪心)

比赛的时候最后35分钟队友写的,感觉最后可能太紧张了,写完了,但是没调完,然后这道题都没提交。。。分析:贪心,用尽量多的小面值的纸币来凑数,基本上每一个数都能整除后面一个数,所以前ii种面值最多能凑出sum[i]sum[i]圆,那么第i+1i+1种面值需要⌈p−sum[i]num[i+1]⌉\lceil{{p-sum[i]}\over{num[i+1]}}\rceil,此时有个小问题就是,2020并

2015-11-04 23:57:34 679

原创 HDU 5536 Chip Factory (2015长春J题&&Trie树)

比赛的时候这道题想了好久,最后还是没想到正解,一直提醒队友不要暴力,暴力一定不过,最后看那么多人都过了,我们还没想到正解,于是就暴力了,n3n^3过了。。。分析:把所有数2进制分解,建一颗Trie树,然后暴力n2n^2找出所有(i,j)(i,j)在Trie树里面招出xorxor最大值。因为要保证i,j,ki,j,k不相等,所以扫(i,j)(i,j)的时候,不妨先删除i,ji,j串,查询完了再插入。t

2015-11-04 23:48:12 646

原创 HDU 5528 Count a * b (2015长春站B题&&积性函数)

设h[n]h[n]为a∗b=0a*b=0的个数。 f[n]=n2−h[n]g[n]=∑m|nf[m]=∑m|n(m2−h[m])=∑m|nm2−∑m|nh[m]f[n]=n^2-h[n]\\ g[n]=\sum_{m|n}f[m]=\sum_{m|n}{(m^2-h[m])}=\sum_{m|n}{m^2}-\sum_{m|n}{h[m]} 对于h[n]h[n] h[n]=∑i=1n∑j=1n(

2015-11-04 12:48:19 1840

原创 HDU 5534 Partial Tree (2015长春站H题&&完全背包)

今天写了这题,再次感慨,失去了拿我们学校首金的机会,今天花了20分钟1A了这题。这么简单的背包DP,比赛的时候被我想那么复杂,我花了2个小时搞了这题,看到题目我就想想到了是背包DP,然后开心地列了一个二维背包DP方程,一直想着降维,优化,始终没有搞定,也考虑了一开始先给每个点分配一个度数,然后现有的度数变成了了n−2n-2,复杂度由原来的o(n∗2∗(n−1)∗(n−1))o(n*2*(n-1)*(

2015-11-02 23:18:25 599

原创 2015年CCPC D题 Pick The Sticks(DP)

0,10,1背包问题,赛后听了秦总队友的讲解会了。增加一维:dp[k][i][v]dp[k][i][v]:第一维:k=0,1,2k=0,1,2。00代表没有半截的情况,11代表有11个半截的情况,22代表有22个半截的情况。 第二维:前ii物品。 第三位:占了vv容量。那么DPDP转移方程为:dp[0][i][v]=max(dp[0][i−1][v],dp[0][i−1][v−c[i]]+w[i

2015-11-01 20:02:02 568

空空如也

空空如也

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

TA关注的人

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