我已经是一条咸鱼了
随便写下两个星期来干的闲事
[USACO13JAN]Cow Lineup
Description
长度为$N(1 \le N \le 10^5)$的数字序列$(1 \le a_i \le 10^9)$,最多可删除$k$种数字。求同一种数字能够连续出现的最大长度。
Solution
猫说可以二分。
然后我就开始二分了。
直接二分答案,最大长度。但是要把相同的数字用链表穿起来。判断是否可行的时候,枚举作为答案的那个数字,然后看看是否存在某一段之间存在不同的数字小于等于$k$。
写法比较工业,主席树在线询问区间不同数字个数。
具体怎么用主席树写这个吗,下面有。
每次判断的复杂度均摊下来是$O(Nlog_2N)$的。其中扫数字$O(N)$,查询$O(log_2N)$。再加上二分所以总复杂度是$O(Nlog_2^2N)$。
Code
|
|
[SDOI2009]HH的项链
Description
长度为$N(1 \le N \le 5 \times 10^4)$的序列,$Q(1 \le Q \le 2 \times 10^5)$次询问,每次询问区间$[L_i,R_i]$之间不同数字的个数。
Solution
离线可以用莫队,好久以前写过。
某天晚上闲着无聊,睡觉又太早,就写个板子娱乐一下。
在线做法主席树。
对每个点建立一棵线段树,线段树$i$维护${-1,0,1}$序列表示原序列的区间$[1,i]$ 上的值的贡献(${-1,0,1}$表示贡献)。
新加入数字$a_i$,若该数字以前在位置$pre[i]$出现过,那么线段树$i$就应该在其维护的序列上的位置$i$设为$1$,$pre[i]$设为$-1$。
例如,序列${1,5,2,4,3,5,6,7}$,其中第$5$棵线段树所维护的序列应该是${1,-1,1,1,1,1,0,0}$。
每次询问$[L,R]$,只需在第$R$棵线段树上查询$[L,R]$的和即可。
可持久化即可。
值得注意的是,每次加入一个数可能之前还要修改某个位置为$-1$,也就代表着可能新增$2$条链,即$log_2N$个点。注意数组。
Code
|
|
[SCOI2008]奖励关
Description
复制下来占地方
$k \le 100, N \le 15$
Solution
本来不会做,看到数据范围就会了。
状压DP。
$f[i][x]$代表当前是第$i$轮,已经获取过的宝物集合为$x$。
每一轮枚一下出来宝物的种类,状态为$O(K \times 2^N)$,转移为$O(N)$。总复杂度是$O(K \times N \times 2^N)$。
Code
|
|
[AHOI2009]中国象棋
Description
在一个$N$行$M$列的棋盘上,让你放若干个炮(可以是$0$个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法,模$9999973$。$N,M \le 100$
Solution
此题巧妙无比,看了题解才会做。
套路啊。
反正每一行每一列放的数量只可能是${0,1,2}$。
$f[i][a][b]$代表前$i$行,有$a$列放了$0$个炮,有$b$列放了$1$个炮,那么有$M-a-b$列放了$2$个炮。
这一行可以不放,也可以放$1$个。也可以放$2$个。
分类讨论统计答案即可。
这种状态定的简直妙啊。
Code
|
|
[SCOI2005]最大子矩阵
Description
这里有一个$n\times m$的矩阵,请你选出其中$k$个子矩阵,使得这个$k$个子矩阵分值之和最大。注意:选出的$k$个子矩阵不能相互重叠。$1 \le n \le 100,1 \le m \le 2,1 \le k \le 10$。
Solution
对$m$分情况讨论。
$m=1$。暴力DP。随便搞。
$m=2$。
先记录三个前缀和,单独第1列,单独第2列,两列加起来。
$f[a][b][t]$表示第1列最后一个选取的位置是a,第2列最后一个选取的位置是b,一共选了t个矩形。讨论当前新选一个矩形是完全处于第1列还是完全处于第2列还是宽为2。
DP转移的时候枚举前一个矩形的结尾,当前矩形的开头用RMQ在前缀和上查询。
状态为$O(n^2 \times k)$,转移为$O(n)$,总复杂度为$O(n^3 \times k)$。
网上别人的做法貌似是$O(nk)$的,我还是太辣鸡了。
Code
|
|
[SCOI2005]互不侵犯King
Description
在$N \times N$的棋盘里面放$K$个国王,使他们互不攻击,共有多少种摆放方案。$N \le 9$
Solution
本来不会做,看了范围才会。
状压DP,转移时枚举上一行状态。
时间复杂度$O(N \times 2^{2N})$。
然后也是某个晚上闲着无聊,睡觉又太早就娱乐了一波。
Code
|
|
[USACO5.1]Musical Themes
Description
转化一下题意之后,求最长重复子串。$N \le 5000$
Solution
链一波易大佬的DP做法。
然而我太菜了不会DP,只好用后缀数组的套路来做。
二分答案,对height分组。都是套路没什么好说的。
Code
|
|
[HAOI2008]硬币购物
Description
硬币购物一共有$4$种硬币。面值分别为$c_1$,$c_2$,$c_3$,$c_4$。某人去商店买东西,去了$tot$次。每次带$d_i$枚$c_i$硬币,买$s_i$的价值的东西。请问每次有多少种付款方法。$d_i,s \le 100000, tot \le 1000$。
Solution
要是没有硬币的个数限制就背包。
具体叫什么名字忘记了。
加上了硬币个数,就把不合理的强行减去。容斥。蛇皮操作,写法奇丑无比。
[USACO06DEC]Milk Patterns
Description
农夫John发现他的奶牛产奶的质量一直在变动。经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠。我们称之为一个“模式”。 John的牛奶按质量可以被赋予一个0到1000000之间的数。并且John记录了N(1<=N<=20000)天的牛奶质量值。他想知道最长的出现了至少K(2<=K<=N)次的模式的长度。
Solution
后缀数组的套路题,二分答案,计数。
[HAOI2012]高速公路
Description
Y901高速公路是一条由$N-1$段路以及$N$个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为$1$~$N$,从收费站$i$行驶到$i+1$或从$i+1$行驶到$i$需要收取$V_i$的费用。高速路刚建成时所有的路段都是免费的。
政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政策涨价或降价。
无聊的小A同学总喜欢研究一些稀奇古怪的问题,他开车在这条高速路上行驶时想到了这样一个问题:对于给定的$l,r(l \lt r)$,在第$l$个到第$r$个收费站里等概率随机取出两个不同的收费站$a$和$b$,那么从$a$行驶到$b$将期望花费多少费用呢?
所有C操作中的$v$的绝对值不超过$10000$
在任何时刻任意道路的费用均为不超过$10000$的非负整数
$N, M \le 10^5$
Solution
显然我们只要考虑道路。
设道路$i$连接点$i$和点$i+1$。
对于道路$i$,被选到的概率应该是$l$在$i$左边,$r$在$i+1$右边的概率。
推下式子。
所以,维护三个值$\sum V_i$,$\sum V_i \times i$和$\sum V_i \times i^2$。
不用像网上大多数题解说的维护$\sum i^2$和$\sum i$,修改的时候利用公式做前缀差分就行了。
Code
|
|
[SDOI2011]计算器
练了下快速幂和扩展欧几里得,学了下BSGS求离散对数。没什么好讲的。
Code
|
|
[SDOI2013]随机数生成器
Description
题面占地方。
Solution
设$v$次之后到达。发现展开之后是个多项式。
后一项用等比数列化简,第一项再通分后合并次数为$v-1$的项。求逆元后转化为离散对数。
Code
|
|
未完留坑