自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Lynstery's blog

Think twice and code once.

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

原创 [数论杂题] BZOJ1951: [Sdoi2010]古代猪文

为了数论而数论的题…..没什么技术含量… 就是求: G∑i|n(ni)%P=G(∑i|n(ni)%ϕ(P))%PG^{\sum_{i|n} {n\choose i}} \text{%} P=G^{(\sum_{i|n} {n\choose i}\text{%} \phi(P))} \text{%} P 现在需要求 (∑i|n(ni))%M(\sum_{i|n} {n\choose i})\

2017-11-28 20:36:04 474

原创 [SG函数 + 分块] BZOJ4035: [HAOI2015]数组游戏

博弈好题。这种博弈的01取反的模型可以把白色看做有奇数个石子,黑色看做偶数个,因为同一位置偶数个石子SG值异或会抵消….. 这么理解的话,可以把一个石子,即一个白块看做一个独立的游戏。 现在只需求SG值。 SG(i)=mex{0,SG(2i),SG(2i) ^ SG(3i),SG(2i) ^ SG(3i) ^ SG(4i),...} SG(i)=\text{mex}\{0,SG(2i),SG

2017-11-28 19:36:29 447

原创 [虚树 + DP] BZOJ2286: [Sdoi2011]消耗战

虚树入门题。 所谓虚树就是只保留需要的关键节点及互相的lca进行重建树,在虚树上跑DP之类的,是的复杂度之和关键点个数相关。 建虚树代码:void buildVT(){ inT.clear(); sort(S.begin(),S.end(),_cmp); stk[top=1]=1; inT.push_back(1); for(int i=0;i<S.size();i++)

2017-11-26 20:11:09 343

原创 [DP+AC自动机] BZOJ1212: [HNOI2004]L语言

直接 DPDP,fif_{i} 表示前 ii 个是否合法。fi|=fi−len(aj)(s[i−len(aj)+1]=aj)f_{i}|=f_{i-len(a_j)}(s[i-len(a_j)+1]=a_j) 用ACAC自动机加速转移的匹配过程。#include<cstdio>#include<queue>#include<algorithm>#include<cstring>using

2017-11-26 16:33:05 335

原创 [矩阵乘法] BZOJ2326: [HNOI2011]数学作业

我们一个一个接上,应该是 res=res∗10t(i)+ires=res*10^{t(i)}+i 这样的形式,其中t(i)t(i) 表示 ii 的位数。 怎么样快速算呢,看成递推式:f(i)=f(i−1)∗10t(i)+if(i)=f(i-1)*10^{t(i)}+i 。显然可以用矩乘加速。位数相同的一起搞就行了。#include<cstdio>#include<cstring>#includ

2017-11-26 16:27:17 395

原创 [SG函数] BZOJ1188: [HNOI2007]分裂游戏

可以发现,一颗石子可以看作是一个独立的游戏。 nn 很小,瞎暴力求 SGSG 函数就好啦。#include<cstdio>#include<algorithm>using namespace std;const int maxn=105;int _test,n,allsg,a[maxn],sg[maxn],vis[maxn],clk,ans,ans1,ans2,ans3;int main

2017-11-26 16:20:07 346

原创 [DP] BZOJ4321. queue2

套路DP…这种和相邻数有关的一般考虑从小到大插入。 fi,j,0/1f_{i,j,0/1} 表示放了前 ii 个数,有 jj 个间隙两数相邻,0/10/1 表示 ii 和 i−1i-1 是否相邻。就好了。#include<cstdio>#include<algorithm>using namespace std;const int maxn=1005,MOD=7777777;typedef

2017-11-10 14:28:07 281

原创 [二分图最大独立集] BZOJ4808:马

棋盘01染色,然后把互相能打到的点连边,发现是个二分图。 二分图最大独立集 == 点数 −- 最大匹配数 Dinic练手…#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;const int maxn=40005,maxe=400005,flag[8][2]={{

2017-11-10 11:53:34 354

原创 [DP] Codeforces #714E. Sonya and Problem Wihtout a Legend

不严格的比较简单,其实严格的可以转化成不严格的: i<j,aj−ai≥j−i⇔ai−i≤aj−ji<j,\quad a_j-a_i \ge j-i \Leftrightarrow a_i-i \le a_j-j 就是满足 ai−ia_i-i 不严格递增就好了。 不严格的做法就是直接 DPDP,改变的值肯定是原本就有的数,数的值范围是 O(n)O(n)。直接 fi,jf_{i,j} 表示前 ii

2017-11-09 11:26:14 382

原创 [杂题] Codeforces #598B. Queries on a String

简单题。直接考虑原来的某个位置的元素最后到了哪里….O(nm)O(nm)#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=10005,maxm=305;int n,m,L[maxm],R[maxm],rd[maxm];char s[maxn],res[maxn];

2017-11-08 20:36:36 348

原创 [杂题 计数 图论] Codeforces 51E. Pentagon

挺烦的题…..很容易wa… 总之就是求出 Bi,jB_{i,j} 表示 ii 到 jj ,走两步的方案,Ci,jC_{i,j} 表示走三步。 然后 ∑Bi,j∗Ci,j\sum B_{i,j}*C_{i,j}。然后会有不合法的和重复的… 不合法的大概是 一个三角形多出一个脚…或者就是一个三角形… 在纸上大力分类讨论一下,把它们都扣去就好了。 参考了网上dalao的实现。#include<cs

2017-11-08 20:12:50 420

原创 [循环卷积 || 循环矩阵] HHHOJ #120. 随

首先推一下式子,变成求 1nm∑(ak1ak2..akm mod P)=1nm∑kk∑[ak1ak2..akm mod P==k]\frac{1}{n^m}\sum(a_{k_1}a_{k_2}..a_{k_m} \text{ mod } P)=\frac{1}{n^m}\sum_{k} k\sum[a_{k_1}a_{k_2}..a_{k_m} \text{ mod } P==k] 注意模 P

2017-11-08 16:03:08 1214

原创 [杂题 组合] Codeforces #40E. Number Table

题很关键的一点是注意到 kk 严格小于 max(n,m)max(n,m),所有一行或一列是完全空的。 然后就很简单了,只需考虑一维的限制。 瞎搞就好了。#include<cstdio>#include<algorithm>using namespace std;typedef long long LL;const int maxn=1005;int n,m,K,cnt[maxn],v[

2017-11-07 16:31:54 443

原创 [杂题 图论 构造] Codeforces #639B. Bear and Forgotten Tree 3

瞎搞题。 从 11 往下构造出两条长度分别为 d, h−dd,\ h-d 的链,然后剩下的点全部堆到某个点下面,注意当 d=hd=h 时特殊考虑一下。#include<cstdio>#include<algorithm>using namespace std;int n,H,D;int main(){ //freopen("cf639B.in","r",stdin); //

2017-11-06 16:01:38 332

原创 [拓扑] Codeforces #510C. Fox And Names

sb题。直接建出大小关系然后拓扑。#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;const int maxn=105,maxe=105;int n,m,len[maxn],d[maxn],res[maxn];int fir[maxn],nxt[maxe],so

2017-11-06 15:50:36 246

原创 [杂题 图论] Codeforces #437C.The Child and Toy

简单题。考虑一条边 (x,y)(x,y) 对答案的贡献,可能是 axa_x 或 aya_y ,取决于哪个点先被删。 那显然我们从大到小删就可以做到每条边的贡献是 min{ax,ay}min\{a_x,a_y\},是最优的。#include<cstdio>#include<algorithm>using namespace std;const int maxn=1005;typedef lo

2017-11-06 14:49:57 378

原创 [DP 倍增Floyd] LOJ#539.「LibreOJ NOIP Round #1」旅游路线

不算很难想。首先看到总钱数比较少,考虑 DPDP 出 fi,jf_{i,j} 表示从 ii 出发,已经在 ii 加了油,带了 jj 块钱,能走多远。 考虑如何转移,注意到油量比较大,所有不可能把它记到状态里。那我们就枚举下一次在哪里加油: fi,j=maxk{fk,j−pj+gi,k}f_{i,j}=\max_{k}\{ f_{k,j-p_j}+g_{i,k} \} 其中 gi,kg_{i

2017-11-05 16:00:07 549

原创 [表达式求值 矩阵乘法] ZROI 2017提高10A. Calc

神思路,第一次见到这种操作… 构造矩阵来进行状态的转移。 A+B∗CA+B*C ,我们记3元组 (S,M,T)(S,M,T) 表示当前状态,其中S=A, M=B, T=B∗CS=A,\ M=B,\ T=B*C。 这样记录,每多一个字符,转移可以表示成乘上一个矩阵。 数字 kk : (S,M,T)→(S,M,T∗10+M∗k)(S,M,T) \to (S,M,T*10+M*k) ++ : (

2017-11-04 16:18:38 519 1

原创 [背包 贪心] Codeforces #365D. Free Market

思维题。 首先要挖掘一下性质,这个交换的操作限制很大,较难处理。 可以发现,我们进行一次交换,价值总和增长不会超过 dd 。 若我们要从 SS 变到 TT,需用 S−S∩TS-S \cap T 交换得 T−S∩TT-S \cap T ,需满足 Sum(S−S∩T)+d≥Sum(T−S∩T)→Sum(S)+d≥Sum(T)Sum(S-S \cap T)+d \ge Sum(T-S \cap T

2017-11-03 22:13:11 436

原创 [贪心] Codeforces #545D. Queue

大胆猜想一下,就过了…怎么说服自己呢? - 对于些固定必选的人,从小到大排最优。 - 最后的序列里肯定只保留对答案有贡献的人,其他的随便堆在后面就好了。 - 两人都有贡献的情况下,小的更有价值。 ……具体见代码#include<cstdio>#include<algorithm>using namespace std;const int maxn=100005;typede

2017-11-03 16:37:37 319

原创 [组合] Vijos P1943:[AHOI2015 Junior] 上学路上

简单组合题。想想卡特兰数的推导,肯定能想到答案就是 (x1+y1x1)(x2+y2x2)−(x2+y1x2)(x1+y2x1) {x_1+y_1\choose x_1}{x_2+y_2\choose x_2}-{x_2+y_1\choose x_2}{x_1+y_2\choose x_1}#include<cstdio>#include<cstring>#include<algorithm>

2017-11-03 16:07:14 360

原创 [组合] Codeforces #575H. Bots

题意即求 ∑i=0n∑j=0n(i+ji)=∑i=0n(i+n+1i+1)=(2∗n+2n+1)−1\sum_{i=0}^n \sum_{j=0}^n { i+j \choose i}= \sum_{i=0}^n {i+n+1\choose i+1}={2*n+2\choose n+1}-1 就是一些组合数的变形#include<cstdio>#include<cstring>#inc

2017-11-03 15:39:33 415

原创 [分治] BZOJ3745: [Coci2015]Norma

显然是分治套路题。分段求,搞一堆的前缀和就行了。#include<cstdio>#include<algorithm>using namespace std;typedef long long LL;const int maxn=500005,MOD=1e+9;int n,a[maxn];LL _min[maxn],_max[maxn],s1[maxn],s2[maxn],s12[max

2017-11-03 15:18:58 359

原创 [KMP fail树] BZOJ3670: [Noi2014]动物园

题目要求的 numinum_i 就等于 failfail 树中 ii 的满足编号 ≤⌊i2⌋ \le \lfloor \frac i 2\rfloor 的祖先的最大深度。 如何求 numinum_i 呢?其实暴力一点的话把 failfail 树建出来倍增肯定是可以的。实际上可以做到线性。 求 numinum_i 可以用类似求 nxtnxt 数组的方法,应该有 numi+1<=numi+1num_

2017-11-02 22:22:19 295

原创 [容斥] 51Nod1829 函数

简单的容斥 ∑i=0m(−1)i(m−i)n(mi)\sum_{i=0}^m (-1)^i(m-i)^n{m \choose i}#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1000005,MOD=1e9+7;typedef long long LL;i

2017-11-02 16:45:01 353

原创 [杂题] HDU5288: OO’s Sequence

显然是考虑一个数的贡献。我们相当于要对于每个数 aia_i,找到最大的 LL 满足 L≤i, aL|aiL \le i,\ a_L|a_i,最小的 RR 满足 aR|aia_R|a_i。 注意到这个想借助调和级数搞的话,复杂度是不太对的,因为 aa 中的数可以有重复,比如说一堆 11 。 其实暴力搞就好了,直接扫两趟,对于每个 aia_i 直接枚因子… 复杂度 O(nV−−√)O(n\sqrt

2017-11-02 16:12:46 266

原创 [two-pointer ST表] HDU5289: Assignment

这种什么对于所有区间,最大值最小值的问题,我们一般考虑求控制区间,或者分治。 分治一般都可做,按套路搞就行了。但可能不是太方便。 这题就很简单了,就考虑对于一个固定的右端点,合法左端点的区间。 很显然最小左端点位置是单调的,直接ST表预处理出区间最值,two pointertwo\ pointer 扫一扫就好了。#include<cstdio>#include<cmath>#include

2017-11-02 15:03:19 294

原创 扩展欧几里得算法及其应用——学习(复习)笔记

推导过程求 ax+by=gcd(a,b)设已递归求得x′,y′满足: bx′+(a%b)y′=gcd(b,a%b)=ax+bybx′+(a−a/b∗b)y′=ax+bybx′+ay′−b(a/b)y′=ax+bya(y′−x)+b(x′−(a/b)y′−y)=0x=y′y=x′−(a/b)y′b=0 时,ax=a,取 x=1,y=0\\求\ ax+by=gcd(a,b) \\设已递归求得x',y

2017-11-01 22:13:37 312

原创 中国剩余定理及其扩展——学习(复习)笔记

普通的中国剩余定理很简单,大概就是个简单的构造 x≡a1(modm1)x≡a2(modm2)x≡a3(modm3)...x≡∑iaiMiM−1i(modM)x \equiv a_1 \pmod{m_1} \\x \equiv a_2 \pmod{m_2} \\x \equiv a_3 \pmod{m_3} \\...\\x\equiv \sum_i a_iM_iM_i^{-1}\pmo

2017-11-01 21:35:10 323

原创 [数论 拓展欧拉定理] HHHOJ #97【BalkanOI 2016】Power-towers

扩展欧拉定律的运用。 ab≡⎧⎩⎨⎪⎪ab%ϕ(p)           gcd(a,p)=1ab                  gcd(a,p)≠1,b<ϕ(p)ab%ϕ(p)+ϕ(p)   gcd(a,p)≠1,b≥ϕ(p)(modp)a^b\equiv \begin{cases}a^{b\%\phi(p)}~~~~~~~~~~~gcd(a,p)=1\\a^b~~~~~~~~~~~

2017-11-01 18:04:47 427

原创 [组合] Codeforces #660E. Different Subsets For All Tuples

这种题做起来贼爽… 套路考虑一个子序列的贡献,有个问题就是每种 aa 串只计算一次,如何避免重复。 很简单,对于一个串 aa ,只在第一次出现这个子序列的位置算贡献。 考虑一个子序列,下标分别为 k1,k2,...,ktk_1,k_2,...,k_t。11 到 k1−1k_1-1 不能出现 ak1a_{k_1} ,k1+1k_1+1 到 k2−1k_2-1 不能出现 ak2a_{k_2},…

2017-11-01 16:43:09 408

原创 [二分+并查集] BZOJ1821 : [JSOI2010]Group 部落划分 Group

二分距离最小值。两个点的距离小于这个值,就一定要在同一个部落中。并查集判断一下就行了。#include<cstdio>#include<algorithm>#define sqr(x) ((x)*(x))using namespace std;typedef long long LL;const int maxn=1005;int n,m,a[maxn],b[maxn],fa[maxn]

2017-11-01 15:45:40 300

原创 [杂题 数论] BZOJ2705: [SDOI2012]Longge的问题

就是求 (ϕ∗id)(n)(\phi *id)(n) 的值。直接暴力。#include<cstdio>#include<cmath>#include<algorithm>using namespace std;typedef long long LL;const int N=100000;LL n,ans;int p[N+5];bool vis[N+5];void get_P(){

2017-11-01 15:11:20 275

原创 [DP] BZOJ1801: [Ahoi2009]chess 中国象棋

大水题。显然限制就是同行同列个数不能超过2。fi,j,kf_{i,j,k} 表示前 ii 行,放了 00个的列数是 jj,放了 11 个的列数是 kk 。就好了…#include<cstdio>#include<algorithm>using namespace std;const int maxn=105,MOD=9999973;typedef long long LL;int n,m;

2017-11-01 14:29:59 281

空空如也

空空如也

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

TA关注的人

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