- 博客(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
1019
原创 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
1075
原创 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
679
原创 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
444
原创 VK Cup 2017 - Round 1
感觉自己代码能力太差了,这场比赛的题都调得很痛苦。。C. Bear and Tree Jumps 对于一棵有根树来说,dfs可以得到每个节点到树根的距离。注意到跳跃距离最大为5,我们可以把距离最多分为五类,同样地,dfs出所有节点到根的距离信息。 我的解法分为两次dfs。第一次dfs可以得到节点1为树根时的距离信息。第二次dfs的目的是“换根”,也就是让每个节点以dfs序作为树根,统计与当前
2017-03-23 12:22:27
518
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
544
原创 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
473
原创 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
509
原创 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
851
原创 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
899
原创 计蒜之道2016 总决赛
虽然说我已经身败名裂了,但还是很感谢蒜头。 今年复赛打了rank60+(去年好像是爆零了,不过今年确实简单些),结果前面有的人不去把机会让给了我。 蒜头还特别土豪,帮买了机票,开了五星级酒店(里面各种高端设施,找拖鞋还找了很久),把选手都当成爷,伺候得很好,唯一办挫的事大概就是最后一天选的旅游团大坑。
2016-08-07 15:53:21
2260
原创 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
402
原创 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
347
原创 (中国剩余定理模版)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
447
原创 积分!!! hdoj 5761 Rower Bo
第一次做高等数学题,比赛的时候不会解微分方程,模拟积分过程,精度不够。。其实我感觉这种题,如果让手动分微元模拟积分,才能体现出计算机的作用,不然就是纯数学题。 后来发现,解微分方程是相对复杂的,可以巧妙列积分方程去解。 设前进方向与y轴反方向的夹角θ\theta是时间tt的函数,即θ=θ(t)\theta=\theta(t),经过时间TT达到目的地。 对水平方向,在水流的作用下时刻
2016-07-29 21:15:33
436
原创 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
413
原创 Codeforces Round #363 (Div. 1) C LRU
C. LRU 按最近最少使用原则,维护nn首歌曲的缓存,缓存容量为kk,只有最近出现过的kk首歌会出现在缓存内。每首歌有一定的被选择的概率,问很长时间以后每首歌出现在缓存中的概率。 倒过来考虑,问题等价于不断按给定概率选取歌曲,直到选取了kk首为止,问每首歌被选择的概率。 用一个20位的二进制数来表示歌曲的集合,dp求每个集合可取得的概率,具体见代码。#include <bits/st
2016-07-26 23:57:43
468
原创 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
513
原创 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
371
原创 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
766
原创 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
545
原创 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
339
原创 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
311
原创 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
329
原创 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
350
原创 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
367
原创 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
416
原创 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
603
原创 百度之星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
749
原创 快速傅里叶变换(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
817
原创 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
544
原创 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
448
原创 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
419
原创 2016.5.8 PKU校赛总结
必须感谢PKU的包容,使得我这种没有书读的文盲得以参加off-line比赛,十分excited!下面是流水账。 上个月在群上得知了这个比赛,然后顺带在群上找到了一位高中生队友absi2011,这位同学CF分和我差不多,不过感觉实际水平应该比我强些。他一再强调自己英语水平烂到无法读题,我表示我可以打辅助读题。。我们试图寻找第三名队友,最后以失败告终,于是注册了一个2人team,队名叫“有趣
2016-05-09 13:58:10
1593
原创 hdoj 5677 ztr loves substring
这是一场BC里的题,虽然这套题非常辣鸡,但这题对我来说还是有学习价值的。 首先是暴力跑一下,统计一下不同长度的回文串分别有多少个,然后就是跑存在性的多重背包了,二进制思想不错!#include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> #include <string>
2016-05-01 15:21:10
347
原创 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
439
原创 模板-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
508
原创 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
400
原创 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
402
原创 TopCoder SRM 688
250 这个对子串的操作,可以理解为,把被操作的子串写在纸条上,然后翻转纸条。。仔细分析可以发现,串中匹配的部分,翻转后还是匹配的,所以我们可以把已经匹配的部分去除。去除匹配部分后,剩下的部分肯定是这样的,前面是’)’,后面是’(‘,不可能交替出现两种括号(出现肯定被去掉了)。于是肯定存在只翻转前面一段和后面一段的解。 了解了以上信息,就很容易做了。。具体实现的时候,可以暴力,也可以用栈稍微
2016-04-19 22:50:48
488
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人