自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

A Cube Master

一个Cuber的ACM历程

  • 博客(457)
  • 收藏
  • 关注

原创 CF 797F Mice and Holes(单调队列优化dp)

F. Mice and Holes 先给老鼠和洞排序,然后dp解之dp[i][j]表示前i个洞进了j个老鼠的最小cost,很容易想到O(n∗n∗m)O(n*n*m)的做法。然后试了下类似多重背包的方法去优化,结果T了。。 看了下官方题解,给的方案是用单调队列优化。因为我们要从dp[i-1][j-1],dp[i-1][j-2],dp[i-1][j-3]…转移到dp[i][j],每个不同的状态转移过

2017-04-25 10:55:27 931

原创 CF 793D Presents in Bankopolis

D. Presents in Bankopolis一个有向图,节点“有序”,找一条长度为k的最短路径,额外要求是当前边不能“跃过”已经经过的节点。 起点的选择范围是[1,n]然后每经过一个点,下一个能到达的点的范围就会缩小,注意到总可以用一个连续的范围表示之,记为[l,r]。那么用dp解决,状态dp[l][r][k]表示可达范围是[l,r],已经走了k步。 貌似dp写成记忆化搜索更符合我的思维,

2017-04-25 10:36:32 964

原创 Codeforces VK Cup 2017 - Round 2

A. Voltage Keepsake二分答案。B. Volatile Kite把问题转换为求每个点到相邻2点组成的线段的距离。C. Vulnerable Kerbals这题有点意思。我们可以推出这样的结论,当前缀的积(mod m)与m互质时,添加一个数,前缀积可以转换为所有数;但是当前缀的积(mod m)与m的最大公约数为gcd时,添加一个数,只能转换为gcd的倍数。所以策略是先转化为与m的最大公

2017-04-17 09:20:43 620

原创 Codeforces problem 750E New Year and Old Subsequence

New Year and Old Subsequence  我们的目标是得到含有’2017’而不含有’2016’的子序列,有多次查询,用线段树解决。在线段树的每个节点中,开一个5*5的二维数组arr[i][j],表示该区间为了能够出现’2017’中的[i,j)子序列而不会出现[i,j]子序列,并且不会出现’2016’,需要删除的最少字符数。   比如arr[0][2]表示该区间能够出现’20’但

2017-03-24 11:34:58 395

原创 VK Cup 2017 - Round 1

感觉自己代码能力太差了,这场比赛的题都调得很痛苦。。C. Bear and Tree Jumps  对于一棵有根树来说,dfs可以得到每个节点到树根的距离。注意到跳跃距离最大为5,我们可以把距离最多分为五类,同样地,dfs出所有节点到根的距离信息。   我的解法分为两次dfs。第一次dfs可以得到节点1为树根时的距离信息。第二次dfs的目的是“换根”,也就是让每个节点以dfs序作为树根,统计与当前

2017-03-23 12:22:27 441 1

原创 Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined)

这把比赛题目不错,然而打得太挫了。。来写一发题解C. Jon Snow and his Favourite Number基本上是暴力模拟,不过排序和异或要写O(1000)O(1000)的。#include <bits/stdc++.h>using namespace std;const int maxn = 100010;int n,k,x;int cnt[1024][2];int main()

2017-02-22 20:25:47 478

原创 Codeforces 8VC Venture Cup 2017 - Elimination Round

C. PolandBall and Forest简单并查集,把相关节点合并即可。#include <bits/stdc++.h>using namespace std;#define ll long longint p[10010]; int a[10010];int find(int x){ if(x!=p[x])p[x]=find(p[x]); return p[x]

2017-01-19 22:45:56 420

原创 Codeforces Round #380 (Div. 1, Rated, Based on Technocup 2017 - Elimination Round 2)

比赛的时候过了3题的pretest,结果systest怒跪2题。。rank几乎垫底。但是这场题目确实比较简单。A. Road to Cinema  cf特别爱出的二分题。。二分汽油容量,得到一个最小的能跑完的容量,然后在满足这个最小值的车里面找最便宜的。注意可能全程加速也赶不上。#include <bits/stdc++.h>using namespace std;#define ll long l

2016-11-20 22:29:18 475

原创 TopCoder SRM 696

给了20条边,最多会涉及到40个点。我们可以先贪心把那些肯定不会影响结果的点先染色(比如度为0的点和度为1的点,如果一条边连接的两个点度都是1,那么先只染一个,不然会有花费)。贪心过后,最多剩下20个点,这样就可以状压dp了。#include <bits/stdc++.h>using namespace std;#define ll long longint deg[55];bool vis[5

2016-08-18 23:43:06 799

原创 TopCoder SRM 697 div1

题目要求abiimodpi=0a_i^{b_i}modp_i = 0,也就是aia_i的每个素因子个数的bib_i倍都大于等于pip_i相应的因子个数。其实我们可以让aia_i只有一个素因子,比如说2,也就是如果存在解,那么一定存在aia_i均为2的整数幂的解。   设sum=∑i=0n−1aisum=\sum_{i=0}^{n-1}{a_i}   我们得到一组不等式,对于所有的ii有ai×

2016-08-18 23:29:23 858

原创 计蒜之道2016 总决赛

虽然说我已经身败名裂了,但还是很感谢蒜头。   今年复赛打了rank60+(去年好像是爆零了,不过今年确实简单些),结果前面有的人不去把机会让给了我。   蒜头还特别土豪,帮买了机票,开了五星级酒店(里面各种高端设施,找拖鞋还找了很久),把选手都当成爷,伺候得很好,唯一办挫的事大概就是最后一天选的旅游团大坑。

2016-08-07 15:53:21 2116 1

原创 hdoj 5765 Bonds

设AA为nn个点的非空真子集,UU为全集。枚举无序对(A,U−A)(A,U-A),如果AA和U−AU-A内的点都连通(关于连通性的判定,需要使用比较快的bfs方法),那么连接这两个集合的边是图的一个割。首先统计所有割的总数tottot,然后对于每个(A,U−A)(A,U-A)对应的割,AA内部的边和U−AU-A内部的边显然不在割中,dp计算每条边不在多少个割中即可,tottot减去它就是答案。#in

2016-08-02 00:10:32 364

原创 hdoj 5773 The All-purpose Zero

很不错的LIS题,做法基于普通O(nlogn)O(nlogn)的LIS算法。由于0可以变为任何数,那么只要出现一个0,就可以接在每个长度的LIS后面,使得每个长度+1的LIS的最小结尾,是原来这个长度LIS的最小结尾+1。但是如果每次出现0,就去维护整个序列是不划算的,考虑到改变的相对性,只要出现了0,我们就可以让后面的数都-1。#include <bits/stdc++.h>using names

2016-08-01 22:05:26 293

原创 (中国剩余定理模版)hdoj 5768 Lucky7

解(1<<(n+1))-1个同余方程组,然后容斥。作为中国剩余定理的模版。#include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> #include <string> #include <string.h> #include <vector> #i

2016-07-29 21:55:22 392

原创 积分!!! hdoj 5761 Rower Bo

第一次做高等数学题,比赛的时候不会解微分方程,模拟积分过程,精度不够。。其实我感觉这种题,如果让手动分微元模拟积分,才能体现出计算机的作用,不然就是纯数学题。   后来发现,解微分方程是相对复杂的,可以巧妙列积分方程去解。   设前进方向与y轴反方向的夹角θ\theta是时间tt的函数,即θ=θ(t)\theta=\theta(t),经过时间TT达到目的地。   对水平方向,在水流的作用下时刻

2016-07-29 21:15:33 376

原创 hdoj 5754 Life Winner Bo

这把多校打得非常崩,来补一下。找规律的话,感觉后是最难的,马次之,好久不碰威佐夫博弈了,复习一下,模型是这样的:有两堆石子,两人轮流拿,可以从其中一堆拿任意个,或者两堆拿相同个数,拿完的人赢。假设当前两堆分别是nn和mm(m>n)(m>n),必败状态是n=(m−n)∗(5√+1)/2n = (m-n)*(\sqrt{5}+1)/2。后打表也可以(我的第一发AC就是打表的)。#include <ios

2016-07-27 00:43:17 359

原创 Codeforces Round #363 (Div. 1) C LRU

C. LRU  按最近最少使用原则,维护nn首歌曲的缓存,缓存容量为kk,只有最近出现过的kk首歌会出现在缓存内。每首歌有一定的被选择的概率,问很长时间以后每首歌出现在缓存中的概率。   倒过来考虑,问题等价于不断按给定概率选取歌曲,直到选取了kk首为止,问每首歌被选择的概率。   用一个20位的二进制数来表示歌曲的集合,dp求每个集合可取得的概率,具体见代码。#include <bits/st

2016-07-26 23:57:43 404

原创 TopCoder SRM 694

250  让把nn个数(范围0~255)分成三份,每份全异或起来,使得三份的和最大。很容易想到三维256*256*256的dp。实际上需要省去一维才行,毕竟知道了前两维,可以算出第三维。   然而比赛的时候我用的另一种写法。#include <bits/stdc++.h>using namespace std;#define ll long longstruct node{ short

2016-07-11 09:42:03 477

原创 Codeforces Round #361 (Div. 2)

C. Mike and Chocolate Thieves  二分搜。#include <bits/stdc++.h>using namespace std;#define ll long longll a[200000+10];int main(){ for(ll i = 2;i<=200000;i++){ a[i] = i*i*i; } ll r = 1e1

2016-07-07 21:23:57 324

原创 cdq分治 -- CF edu13 F Lena and Queries

F. Lena and Queries  我的第一道cdq分治,简直绝妙。。由于点会被删除,相当于每个点有一个作用区间[l,r][l,r]。对询问分治,每次在分治区间内求凸壳(只使用作用区间包含分治区间的那些点求),更新答案。至于每个点出现在了哪些区间,用线段树维护。#include <bits/stdc++.h>using namespace std;#define ll long longcon

2016-07-06 10:16:00 700

原创 2016 计蒜之道 复赛 A

这场比赛对我来说最有价值就是这题。。读完题肯定会有一个朴素的想法,枚举不能使用的kk跑nn次floyd,也就是O(n4)O(n^4)的复杂度,无法通过。实际上,在跑那么多次floyd的时候,有很多操作是不必要的。所以可以分治来做,每次kk只能取一半的值,剩下的递归处理,递归到kk只有一个值没取,这样就避免了重复操作,优化到了O(n3log(n))O(n^3log(n))。#include <bits

2016-07-04 08:06:38 516

原创 Codeforces Round #360 (Div. 1)

B. Remainders Game  如果两个数模所有cic_i结果一样,这两个数的差一定是LCM(ci)LCM(c_i)的整数倍。要使得能够唯一确定一个xmodkx mod k,LCM(ci)LCM(c_i)必须是kk的整数倍。#include <bits/stdc++.h>using namespace std;#define ll long longint c[1000010];bool n

2016-07-04 07:56:38 277

原创 something about Educational Codeforces Round 11

这场CF的E、F两题最近才补,拿来说说。比较有意思的是,官方题解给的都不是最优复杂度。。E. Different Subsets For All Tuples  这道题肯定是dp,我的做法是这样的。假设你现在拥有了一个长度为ii的,由mm种字符(或部分)组成的串,然后在最后面添加一个字符’a’,会发生什么呢?我们令’a’具有一般性,用’x’代表除了’a’以外的字符。。比如当前串是”xxaxxxaxx

2016-06-27 00:20:24 271

原创 Codeforces Round #359 (Div. 1)

A. Robbers’ watch  由于两个数位数加起来不能超过7,枚举可能出现的数,暴力统计,有一些小坑要细心。#include <bits/stdc++.h>using namespace std;#define ll long longll change(ll x){ ll res = 0; ll bit = 1; while(x){ res +=

2016-06-24 18:33:54 294

原创 Codeforces Round #358 (Div. 2)

C. Alyona and the Tree  dfs。看看哪些节点需要删去,删掉它为根的子树即可。#include <bits/stdc++.h>using namespace std;#define ll long longconst int maxn = 100010;vector<int> sons[maxn];vector<ll> ew[maxn];ll vw[maxn];int ans

2016-06-24 18:26:13 318

原创 Codeforces Round #357 (Div. 2)

D. Gifts by the List  给的图是若干棵树,对每棵树dfs一次即可解决。如果有解,每个人送礼的对象一定是自己的祖先,这在dfs时可以顺便判断。然后就是每个人送礼对象,不能是他祖先送礼对象的真祖先。   每个人的送礼对象如果和父亲的送礼对象相同则不管,若是父亲送礼对象的后代则加到前面去。。#include <bits/stdc++.h>using namespace std;#de

2016-06-15 21:21:07 340

原创 Educational Codeforces Round 13

D. Iterated Linear Function  线性递推。按照我以前的做法,就是矩阵快速幂了。后来我发现,其实这题可以不需要矩阵。递推一下找找规律x2=a∗x1+bx_2=a*x_1+b,x3=a∗a∗x1+a∗b+bx_3=a*a*x_1+a*b+b,x4=a∗a∗a∗x1+a∗a∗b+a∗b+bx_4=a*a*a*x_1+a*a*b+a*b+b…我们可以发现,xnx_n可以看成由两部分

2016-06-14 23:39:01 379

原创 TopCoder Open 2016 R2B

300  这题让计算三条边分别不超过aa,bb,cc的三角形有多少个,数据范围1e91e9,比赛时写了个O(1e9)O(1e9)的,悲惨爆零。   正确的做法是利用容斥原理O(1)O(1)。如果三条边可以是不超过aa,bb,cc的任何数,答案就是a∗b∗ca*b*c,但是肯定有些情况是非法的,只需要考虑两边长度不大于第三边就行了,把非法的减去就是答案。具体的计算过程还是需要细心推一下的,只需要很基

2016-05-28 20:48:24 562

原创 百度之星2016初赛(第二场) -- Astar Round2B

1003  签到题,其实就是输出一个取模后的组合数,需要用到乘法逆元。#include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> #include <string> #include <string.h> #include <set> #include <vec

2016-05-22 20:14:16 702

原创 快速傅里叶变换(FFT)

首先说一下我用FFT做什么,我要做的是多项式乘法,或者说,加速多项式乘法。   考虑多项式A(x)=∑j=0n−1ajxjA(x)=\sum\limits_{j=0}^{n-1}a_jx^j,它一共有nn项,我们称它的次数界为nn。假设我们有两个次数界为nn的多项式A(x)A(x)和B(x)B(x),要求它们的和是非常简单的,只需要将对应的系数相加,复杂度为O(n)O(n)。如果要求他们的积,则需

2016-05-21 09:10:23 737

原创 hdoj 5681 zxa and wifi

比赛的时候撸了个dp,用线段树优化状态转移,无限T。。然后题解的O(n∗k)O(n*k)看不懂,后来终于自己想出另外一种O(n∗k+n∗log(n))O(n*k+n*log(n))的写法,感觉可能和题解是一个意思。   dp(i,j)dp(i,j)表示前ii户人家装了jj个WIFI的最优解,转移的时候外层循环用jj,即可以理解为一个一个加WIFI。如果第ii户人家的WIFI最右边可以照顾到第rir

2016-05-16 22:25:47 511

原创 Codeforces Round #351 (VK Cup 2016 Round 3, Div. 1 Edition)

A. Bear and Colors  模拟一下就完了。#include <bits/stdc++.h>using namespace std;#define ll long long int a[5010]; int cnt[5010];int ans[5010];int main(){ int n; cin>>n; for(int i=1;i<=n;i++){

2016-05-14 00:32:56 414

原创 hdoj 3507 Print Article

我的第一道斜率优化dp。  首先,O(n^2)复杂度的dp是很容易想到的。现在我们需要用斜率优化把每次转移的复杂度优化到O(1)。考虑从dp(a)和dp(b)转移到dp(i),若从dp(a)转移要优,则有dp(a)+(sum(i)-sum(a))^2+M  于是可以得到这样的关系:(Y(a)-Y(b))/(X(a)-X(b)) 由a转移较优;(Y(a)-Y(b))/(X(a)-X(b))>

2016-05-13 20:56:33 381

原创 2016.5.8 PKU校赛总结

必须感谢PKU的包容,使得我这种没有书读的文盲得以参加off-line比赛,十分excited!下面是流水账。  上个月在群上得知了这个比赛,然后顺带在群上找到了一位高中生队友absi2011,这位同学CF分和我差不多,不过感觉实际水平应该比我强些。他一再强调自己英语水平烂到无法读题,我表示我可以打辅助读题。。我们试图寻找第三名队友,最后以失败告终,于是注册了一个2人team,队名叫“有趣

2016-05-09 13:58:10 1518

原创 hdoj 5677 ztr loves substring

这是一场BC里的题,虽然这套题非常辣鸡,但这题对我来说还是有学习价值的。   首先是暴力跑一下,统计一下不同长度的回文串分别有多少个,然后就是跑存在性的多重背包了,二进制思想不错!#include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> #include <string>

2016-05-01 15:21:10 321

原创 Codeforces Round #349 (Div. 1)

A. Reberland Linguistics  此题重在理解”in a row”的含义。意思是不能有连续相同的两截。正确理解了题意以后,随便dp一下,答案塞到set里面即可。#include <bits/stdc++.h>#include <unordered_map>using namespace std;bool start[4][11111];int main(){ string

2016-04-30 18:39:26 368

原创 模板-KM算法

#include <bits/stdc++.h>using namespace std;const int maxn = 66;const int maxN = 410;int lx[maxN];int ly[maxN];int sx[maxN];int sy[maxN];int match[maxN];int weight[maxN][maxN];int sz;bool path(i

2016-04-29 23:41:36 445

原创 zoj 2342 Roads

在最优策略中,我们只会减少石头路的费用,增加烂泥路的费用,设这个改变量为l(x)l(x)。由于前n−1n-1条边是生成树,对第nn~mm条边中的每一条,它的加入会形成一个圈。在最优解的情况下,圈中的任意一条石头路费用不大于烂泥路的费用。把石头路看作二分图的X部,烂泥路看作Y部,可以得到关于改变量l(x)l(x)的不等式。这个模型直接套二分图最优匹配就行,求出的可行顶标就是改变量。   KM算法还是

2016-04-29 23:39:04 361

原创 Codeforces Round #348 (VK Cup 2016 Round 2, Div. 1 Edition)

A. Little Artem and Matrix  没什么好说的,逆向模拟一下。#include <bits/stdc++.h>#include <unordered_map>using namespace std;#define ll long longint a[10010][5];int ans[111][111];int main(){ int n,m,q; cin>

2016-04-25 21:29:32 366

原创 TopCoder SRM 688

250  这个对子串的操作,可以理解为,把被操作的子串写在纸条上,然后翻转纸条。。仔细分析可以发现,串中匹配的部分,翻转后还是匹配的,所以我们可以把已经匹配的部分去除。去除匹配部分后,剩下的部分肯定是这样的,前面是’)’,后面是’(‘,不可能交替出现两种括号(出现肯定被去掉了)。于是肯定存在只翻转前面一段和后面一段的解。   了解了以上信息,就很容易做了。。具体实现的时候,可以暴力,也可以用栈稍微

2016-04-19 22:50:48 445

空空如也

空空如也

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

TA关注的人

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