POI做题记录
嘿嘿,偷学一波!
由于博主做的题比较少,所以没按年份整理,直接按照做题时间放上来了。
2020年9月20日
[POI2013]LUK-Triumphal arch
给你一颗\(n\)个点的树(\(n\leq300000\)),1号节点已被染黑,其余是白的,两人轮流操作,一开始B在1号节点,A选择\(k\)个点染黑,然后B走一步,如果某一时刻B能走到A没染的节点则B胜,否则当A染完全部的点时,A胜。求能让A获胜的最小的\(k\)。
比较容易想到的错解是计算每一个点及祖先的出度作为染色总数。
但这样做忽略了一个事实:A的决策会影响B的决策。B每次一定是朝着对A最为不利的方向移动的。
正确的方法是二分\(k\)的大小,然后自下而上统计出到每个点之前需要染掉这个子树内的多少个点才能来的及抢在B抵达任意一个点之前将那个点染黑,这样如果到1之前需要染掉的节点个数超过1的话,即可判定k过小。
[POI2015]KUR
给定\(n,a,b,p(2\leq n\leq10^9,1\leq p,a,b,m<n,1\leq m\leq10^6)\),其中\(n,a\)互质。定义一个长度为\(n\)的01串\(c[0..n-1]\),其中\(c[i]=0\)当且仅当\((ai+b)\bmod n < p\)。给定一个长为\(m\)的小01串,求出小串在大串中出现了几次。
差一点想出来。
本来的思路是枚举一开始那个位置的数,然后利用小01串构建\(m\) 个约束条件,然后在利用\(\operatorname{Exgcd}\)暴力算出每个数在序列中的出现次数,然而数的个数依然可能很多。
原因在于我忽略了\(n,a\)互质的条件。
\operatorname{lcm}(n,a)=n\times a
\]
所以在前\(n\)项中\(a\times i\)在模\(n\)意义下互不相同。
所以这\(m\)个条件的交集就是答案。
具体来说,设开始位置为\(s\),对于第\(i\)个约束条件(假设小串中\(s_{i}=0\),若\(s_{i}=1\)则条件相反),需要满足:
a\times s+a\times i+b< p\pmod n
\]
不难发现,对于任意一个约束,符合条件的\(a\times s\)一定是条线段,最后对线段求交,但是对线段求交较难实现,所以我们利用正难则反的思想转化为对线段的补集求并即可。
转化为补集后的条件:
0\leq a\times s+a\times i+b\leq p-1(s_{i}=1)
\]
2020年9月21日
[POI2012]ODL-Distance
给你一个序列\(a\)(长度为\(10^5\),值域为\(10^5\)),定义\(\operatorname{d}(i,j)\)为每次操作对\(a_{i},a_{j}\)其中之一乘一个质数\(p\)或除以一个质数\(p\)(\(p\)必须为被除数的约数),让\(a_{i}=a_{j}\)的最少操作步数。
对于每个\(i\),求\(\operatorname{d}(i,j)\)最小的\(j\),若有多个解,输出最小的\(j\)。
题意转化后即是对于每个数找出一个数,使得这两者除掉\(\gcd\)之后质因子系数之和最小.
由于值域不大,我一开始考虑暴力分解质因数之后通过枚举质因数的系数,但是这样时间复杂度无法从\(n^2\)降下来。
根据题解的思路,我们考虑到每个答案都对应着一个\(\gcd\),我们枚举这个\(\gcd\),这样我们可以求出每个数的所有可能答案以及一些一定不会是最优的多余答案,取最大的答案即可.
由于枚举倍数的时间复杂度为调和级数,所以时间复杂度为 \(\Omicron(n\log n)\)。
2020年9月27日
[POI2008]BBB-BBB
一个长度为\(n\)的记账单,\(+\)表示存\(¥1\),\(-\)表示取\(¥1\)。现在发现记账单有问题。一开始本来已经存了\(¥p\),并且知道最后账户上还有\(¥q\)。
你要把记账单修改正确,使得 :
1:账户永远不会出现负数;
2:最后账户上还有\(¥q\)。
你有2种操作:
1:对某一位取反,耗时\(x\);
2:把最后一位移到第一位,耗时\(y\)。
求最小耗时。
一开始还在思考操作1,2的综合贪心策略,但是发现好像可以暴力枚举执行了几次2操作。
问题在于如何判断要执行几次1操作。
贪心的想,肯定从前往后执行1操作。
刚刚由于不熟悉黑BZ不小心看到了题解的标签(单调栈),但是并没有头绪,不过想到了一种基于线段树的暴力方法,即暴力维护前缀和。仔细一想发现可以不用线段树,可以用优先队列来进行维护。
2020年9月28日
[POI2006]EST-Aesthetic Text
输入\(M,N\),代表文章的某一行的总长度不能超过\(M\)。\(N\)代表有\(N\)个单词 第二行给出\(N\)个数,代表这\(N\)个单词各自的长度。你的任务就是进行文章排版操作.使文章的不和谐度最小。相邻两行见的不和谐度为这两行的长度的差的绝对值。如果文章只有一行的话,则不和谐度为0.你可以将多个连续的单词放到同一行去,任两个单词间用一个空格格开,但这一行的总长度不能超过\(M\)。 \(1<=M<=10^6,1<=N<=2000,1<=Ai<=M\)。
\(dp_{i,j}\)表示当前句子中最后一个单词为第\(i\)个单词,前一句话的最后一个单词是\(j\)。
可以转化题意,把空格算入每个单词中,给每个单词长度加1,两行长度之差不变。
转移方程:
令\(F(i,j)=S_{i}-S_{j}\times2\).
\(dp_{i,j}=min\lbrace dp_{j,k}+|F(i,j)+S_{k}|\rbrace\).
转移的过程中可以用前缀和优化,对于每个状态\(dp_{j}\)的所有合法状态\(dp_{j,k}\),我们按照\(S_{k}\)排序,分别预处理\(dp_{j,k}+S_{k}\)和\(dp_{j,k}-S_{k}\)的前后缀最小值。然后枚举所有合法后继状态\(dp_{i,j}\),转移时二分绝对值函数拐点并分类讨论即可。
2020年10月6日
咕咕咕~
2020年10月7日
咕咕咕~
2020年 10月16日
咕咕咕~
2020年10月17日
[POI2011]LIZ-Lollipop
给一个长度为\(n\)的由1和2构成的序列,\(m\)次询问,每次询问有没有一个子串的和为\(k\)。
\(1\leq n,m\leq10^6,1\leq k\leq2\times10^6\).
一道很好的思维题,可惜被我乱搞过掉了。。。
首先可以将原序列转化,将所有的2展开成2个1。
此时题意转化为:给你一个序列,有一些位置不能作为开头,有一些位置不能作为结尾,问你是否能选出一个长度为\(k\)的子串。
我们深入分析,发现这个新序列有着以下性质:
- 对于任意一个不能作为结尾的位置,它的后一位一定可以作为结尾。
- 对于任意一个不能作为开头的位置,它的前一位一定不能作为结尾。
- 序列最后一个位置一定可以作为结尾。
总结以上两条性质可以得出:
- 对于任意两个不能/可以(状态相同)作为结尾的位置,他们一定对应了一个合法的子串。
- 对于一个询问\(k\),如果无解,那么每一对距离为\(k\)的位置一定恰好一个可以作为结尾,一个不能作为结尾。
那么我们可以对整个序列进行染色,黑色表示这个位置可以作为结尾,白色表示这个位置不能作为结尾。
然后我们发现,整个序列一定会被划分成长度为\(k\)(除最后一段)的若干块,相邻两块中同一位置的所有颜色必定相反。
那么我们可以预处理出这个新序列的哈希值和将颜色反转之后的哈希值,这样就可以快速判定相邻两块中是否存在合法的子串。
至于如何定位这个子串的左端点,只需要在块内二分即可。
同时注意到对于每一个k我们都可以只做一次,这样的话时间复杂度为\(\Omicron(n\times(\frac{1}{1}+\frac{1}{2}+…+\frac{1}{n}))=\Omicron(n\log n)\),而定位每个串的端点时间复杂度为\(\Omicron(m\log n)\),所以总时间复杂度为\(\Omicron((n+m)\log n)\),可以通过本题。
注意:这道题在loj上时限非常小,必须使用单哈希才能通过。
hoho!正解挖坑!
持续咕咕咕~~
POI做题记录的更多相关文章
- POI做题记录:第二届POI
Trees Memory limit: 32 MB Trees occur very often in computer science. As opposed to trees in nature, ...
- UOJ 做题记录
UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...
- project euler做题记录
ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...
- Sam做题记录
Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...
- 退役IV次后做题记录
退役IV次后做题记录 我啥都不会了.... AGC023 D 如果所有的楼房都在\(S\)同一边可以直接得出答案. 否则考虑最左最右两边的票数,如果左边>=右边,那么最右边会投给左边,因为就算车 ...
- 退役III次后做题记录(扯淡)
退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...
- 退役II次后做题记录
退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...
- BJOI做题记录
BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难 ...
- FJOI2017前做题记录
FJOI2017前做题记录 2017-04-15 [ZJOI2017] 树状数组 问题转化后,变成区间随机将一个数异或一,询问两个位置的值相等的概率.(注意特判询问有一个区间的左端点为1的情况,因为题 ...
随机推荐
- 如何用5000行JS撸一个关系型数据库
首先声明,我不是标题党,我真的是用5000行左右的JS实现了一个轻量级的关系型数据库JSDB,核心是一个SQL编译器,支持增删改查. 源代码放到github上了:https://github.com/ ...
- Java知识系统回顾整理01基础05控制流程06break
一.break break:结束循环 二.练习--直接结束当前for循环 public class HelloWorld { public static void main(String[] args ...
- python-格式化(%,format,f-string)输出+输入
1-格式化输出: % 1.print('我的姓名是%s,身高%s cm'%(name,height)) 2.%s -str() ; %d–十进制3.传入值的时候一定是个元组,不是列表4.当指定长度时: ...
- 【漏洞复现】WinRAR目录穿越漏洞(CVE-2018-20250)复现
前言 这漏洞出来几天了,之前没怎么关注,但是这两天发现开始有利用这个漏洞进行挖矿和病毒传播了,于是想动手复现一波. WinRAR 代码执行相关的CVE 编号如下: CVE-2018-20250,CVE ...
- 【题解】[SDOI2017]数字表格
Link #include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=1e6; in ...
- Codeforces Global Round 11 个人题解(B题)
Codeforces Global Round 11 1427A. Avoiding Zero 题目链接:click here 待补 1427B. Chess Cheater 题目链接:click h ...
- shell-的变量-局部变量
1. 定义本地变量 本地变量在用户当前的shell生产期的脚本中使用.例如,本地变量OLDBOY取值为ett098,这个值只在用户当前shell生存期中有意义.如果在shell中启动另一个进程或退出, ...
- 云原生 go-zero 微服务框架
0. go-zero介绍 go-zero是一个集成了各种工程实践的web和rpc框架.通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验. go-zero包含极简的API定义和生成工具goc ...
- coder初入职场必备:Eclipse+Tomcat8+MAVEN+SVN 工作环境搭建
1.JDK的安装 首先下载JDK,这个从sun公司官网可以下载,根据自己的系统选择64位还是32位,安装过程就是next一路到底.安装完成之后当然要配置环境变量了. ----------------- ...
- java 环境变量配置(win10)
到官网下载jdk,链接https://www.oracle.com/technetwork/java/javase/downloads/index.html 安装好,进行环境变量配置,打开环境变量 1 ...