1.洛谷P3879 阅读理解
2.WOJ#1830
3.WOJ#4786 正解
4.1102考试T3【√】
做了一上午水题?
WOJ#2604 军队调遣
重载小于符号的时候反了(反正你记不到,每次就试一下)
两个板子(tarjan+最短路)
WOJ#1436 冰壶游戏
sb搜索
(可以迭代加深,效率显然更优)
WOJ#1814 文化之旅
启发式搜索
用set判断一下种类是否冲突
WOJ#1692 因子的排列
直接爆搜??(由于要考虑很多细节,就直接贴std了)
统计排列数的时候有个技巧
由于我们是枚举当前这个质因数选的个数(有种累加的思想)
s 2 = s 2 ∗ ( L D B ) ( y + i ) / i ; s2=s2*(LDB)(y+i)/i; s2=s2∗(LDB)(y+i)/i;
令S2为上一次的排列数,y为上一次选择的质因数的总个数
i从1开始枚举,表示当前这个质因数选的个数
WOJ#4577 山贼集团
不知道哪里来的执念,一定不要看题解
以至于到了现在,仍然没A……
下午再好好想想
剩下这两周:
1.图论
2.动态规划
3.数论
4.字符串
5.以前的考试题
6.杂题
7.NOIp真题
今天下午:
1.1102考试T3【√】+WOJ#4378 【2018提高测试】玩具【×】(晚上问一下lsr)
2.WOJ#4577 山贼集团【√】
3.tarjan复习(起码两道题)
WOJ#4577 山贼集团
呜呜哇哇┭┮﹏┭┮我以前还做过啊!!
现在自己yy,本来复杂度就是错的,顶多算个暴力,,,然后暴力也写挂了呜呜呜呜呜
(hou神说我没学过树上背包)
定义 f [ u ] [ s t a t u s ] f[u][status] f[u][status] 表示在以 u u u为根的子树中,分配status的集团能获得的最大利益
考虑从子树转移来信息,不需要将status代到dfs中去
每次处理的时候就把所有情况处理完
儿子信息根据需要直接调用即可
POJ #3694 Network
找桥,缩点,建树,LCA,并查集
POJ#2942 knight of the round table
补图
性质:奇环
不能把割点拎出来然后跑dfs求 v − d c c v-dcc v−dcc!!!!!!【×】
举个栗子:
这样的情况如果dfs,就不能找到中间的那个 v − d c c v-dcc v−dcc
所以呀,就好好地在tarjan里面求嘛~
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x]){
flag++;
if(rt!=x||flag>1) cut[x]=1;
int z;num++;
do{
z=stk[top];top--;
dcc[num].push_back(z);
}while(z!=y);
dcc[num].push_back(x);//一个割点可以属于多个v-dcc
}
}
else low[x]=min(low[x],dfn[y]);
昨天好废啊……现在只剩了不到两周了
姑娘你浪费不起了
一定要专注!
任务:
1.POJ2942【√】
2.仙人掌
3.考试题【√】
4.WOJ4750【√】
5.观光公交
6.ldx一道
7.总结
今天考试:
T1 85pts
T2 0pts
T3 20pts
Total:105pts
最高:160pts
T1 模拟
好坑啊……对方是负值的时候直接打没有打他优
T2 MST+组合数
数据范围,记得开long long
掉了10pts暴力
hxy好强
考场推出正解
我也发现是MST了啊。。只是太菜了没有和这道题联系在一起
当前求出来的MST的边权和假设为sum
如果 s u m > X sum>X sum>X ,显然无解
如果 s u m < X sum
对于 s u m = = X sum==X sum==X 的情况类似讨论即可
T3
一眼数位dp
结果人家重点是字符串匹配
KMP自动机上dp
gigo好棒☆( ̄▽ ̄)/$:*
考场推出正解【鼓掌!】
update:被Hack了。复杂度是假的。(不碍事儿,能A就是好算法)
大致理一下这个思路吧(还是很清楚的)
你想啊,给定的长串,如果为它建一个Trie树
是问号的地方就相当于有0~9的儿子
那如果(假设我们现在在遍历Trie树)我们知道当前这个节点的子树size(也就是合法方案数),那我们是不是就可以很简单地处理出第k大了呀
问题转化到这里已经解决一大半了
现在考虑如何预处理出当前这个节点的子树信息
首先:
1.我们该如何确定这个节点?
显然位于原串的第 i i i位,这个信息必须要有
但只有这个信息还不够,假设当前第i位之前有很多 ‘ ? ’
那每一个问号对应走到的节点是不一样的,再记一个与短串匹配的位数
所以我们用 f [ i ] [ j ] f[i][j] f[i][j]来表示一个节点(不能显式建树,5e4个节点,105e4)
2. f [ i ] [ j ] f[i][j] f[i][j]表示a串处理到第i位,匹配了b串的j位,i+1~n合法的填数方案。初值: f [ n ] [ m ] f[n][m] f[n][m]=1
由于处理第i+1位的时候,j的变化可能不是j+1,这时候我们需要维护一个类似kmp的next数组
定义 f a i l [ i ] [ k ] fail[i][k] fail[i][k]表示当前在第i位,下一位填k的最长公共前后缀
转移就是: f [ i ] [ j ] + = f [ i + 1 ] [ f a i l [ j ] [ k ] ] f[i][j]+=f[i+1][fail[j][k]] f[i][j]+=f[i+1][fail[j][k]]
3.处理完这些后我们终于可以开始考虑询问了。奈何询问1e5,如果每次都从根节点一直找,那就是nq的了。考虑离线(结果还是会被卡,还是STD的办法好,倍增来找)
好多好多天都没有认真按照计划来执行了
今天一定不能再被分心了,合理安排计划!
今天考试
严重怀疑我们做的是NOI的题。。L可能为了不打击我们的自信心,连成绩都没有发(嘤嘤嘤,菜到真实)
T1:莫比乌斯反演+杜教筛
T2:思维好题
T3:状压dp+矩阵快速幂优化
得嘞。。直接弃疗
11:40~12:15 昨天的总结【√】
12:15~13:05 吃饭+休息
13:05~13:30 中等的字符串暴力+正解【√】(15:30)
任务:
WOJ#4750 中等的字符串
首先,暴力不会。
将所有的串建在AC自动机上,然后类似树形dp
f [ x ] [ d e p ] f[x][dep] f[x][dep]表示走了dep步,当前在x这个节点所得到的最高得分
记忆化搜索即可
考虑优化
这个范围1012,一看就不能傻傻地直接走那么多步
由于我们每次的决策空间是一样的,我们就可以矩阵快速幂优化了
Cf L. Timsort
细节打挂……果然没有想清楚的地方,瞒谁都瞒不过数据
一开始就觉得自己末尾那个地方没有处理清楚(果然,不能轻易放过自己的思维漏洞)
不过整体的思路是自己想出来的还是不错
WOJ#4799 我的订书机之恋
妙极了。。只可意会不可言传
上午任务
WOJ#1829 聪明的质检员
yeah,开心(*^▽^*)
自己yy出来啦~~
只是。。又和昨天一样,细节打挂(由于随着w的增大,答案在递减,所以最后比较的肯定是ans和ans+1)
Cf B. Dev, Please Add This!
建图没有想错,只是怎样建图很关键
把两个’#'中间的部分看做一个分量
那么对于‘*’来说,至少得有一个分量(横/纵)被到达 -----限制①
对于任意一个分量,如果Ball不能到达,则一定不能选择 -----限制②
对于任意两个分量,如果不能互相到达,则一定不能同时选择 -----限制③
这些限制,我们该如何建边呢?其实就是一个2-SAT问题
我们将一个分量看做两个点(0/1),0表示不能到达,1表示可以到达
那么限制①,设这两个分量为idx1,idx2 。那么就是(idx1,0)–>(idx2,1)以及(idx2,0)–>(idx1,1)
限制②就是(ball,1)–>(idx,0)(事实上在代码实现的时候,我们将不能到达的点,(idx1,1)–>(idx1,0))
限制③(idx1,1)–>(idx2,0)以及(idx2,1)–>(idx1,0)
最后Tarjan缩点,如果一个分量的两个点在同一个联通块里,显然矛盾
Cf A. Coloring Roads
一些基础的知识不扎实
树链剖分时由于每次都先搜索重儿子,那么每条重链上的DFS序就是连续的。每条边的信息都存在这条边深度较大的儿子上。
这道题据说做法很多
我选了一个看起来比较友好的做法:树链剖分+单调栈。对于每条重链维护一个关于DFS序的单调递减栈从而维护答案,每次暴力修改,均摊分析复杂度是对的【看起来就像一个可爱的暴力】(每个询问最多被加入一次,删除一次)
WOJ#3210 序列生成
没有怎么理解AC自动机的内涵
实际上,它就是告诉你你的转移往哪里去呀
然后就很简单了
数位dp+AC自动机
(注意前导0!!!)
下午任务
把NOIp真题做完(大部分都是简单题了)
WOJ#1844 Hankson 的趣味题
自己yy了一个做法,复杂度没问题
但是没写出来???最近代码能力是怎么了??
总是想到正解,却写不出来
(难道是因为之前直接粘代码的报应?oh,我要做好码奴)
不需要分开存在数组里,一起分解质因数就好了
不然你要分别存下来,光是memset就把时间卡满了
对于>50000的质因数特殊判断一下即可
这个特判不简单啊……
假设最后剩下了 a 0 , a 1 , b 0 , b 1 a0,a1,b0,b1 a0,a1,b0,b1
首先肯定a0==a1&&b0==b1
如果 a 0 ! = b 0 & & a 0 = = 1 a0!=b0\&\&a0\ ==1 a0!=b0&&a0 ==1 ans<<=1
否则无解
WOJ#1830 观光公交
引自博客
从部分分推正解
按照我自己yy的dp来说,没有理解题目要求最优化的到底是什么
: 是旅客的旅行时间总和最小
但是dp只解决了到达当前这个点的最小时间
而这个贪心就很妙了啊~由于加速器那我们每次选择能惠及人数最多的加速一定最优(每使用一次加速器,对于乘客而言都只能减少1,所以最大化人数即可)
今天考试
(心态爆炸??不不不,没有没有,我没有爆炸,只是没有调整好考试策略,积累一下)
T1 100pts
T2 100pts
T3 0pts
T1 8:00~9:00
样例有毒吧。。复制出来少最后一位
调死我了……最后过了样例就没管了
直接用文件读入
我好像又是伪算法,,直接找规律??
可以证明我通项公式的正确性
推一波双胞胎式子(对称性)
然后等比数列转化一下
事实上也是很套路的一道题了
由于给定的式子 p i = a ∗ p i − 1 + b ∗ p i + c ∗ p i + 1 p_i=a*p_{i-1}+b*p_i+c*p_{i+1} pi=a∗pi−1+b∗pi+c∗pi+1
我们一看就长得像递推的式子,但如果直接这样看,会发现i与i-1和i+1有关,这怎么搞……
显然啊,把i+1挪到一边
得到 c ∗ p i + 1 = ( a + c ) ∗ p i − a ∗ p i − 1 c*p_{i+1}=(a+c)*p_i-a*p_{i-1} c∗pi+1=(a+c)∗pi−a∗pi−1
这样的话,要是我们知道 p 0 p0 p0和 p 1 p1 p1不就随便做了嘛
可是我们知道的是 p 0 p_0 p0和 p 2 n p_{2n} p2n
仔细思考一下,会发现 p 2 = ( ) ∗ p 1 + ( ) ∗ p 0 p2=()*p1+()*p0 p2=()∗p1+()∗p0
然后p0==0所以 p 2 = ( ) ∗ p 1 p2=()*p1 p2=()∗p1
然后就会发现,任意一个 p i p_i pi都可以用 p 1 p_1 p1来表示
做完啦
实际上还可以用矩阵快速幂优化一波
T2 9:30~11:30
细节差一点又处理挂,最后一分钟才找到问题…
读题啊。。。。
把每个细节记在草稿本上或者Highlight,写完程序后返过去检查一下。细节是否处理到位
据说暴力好像均摊复杂度是正确的??
T3 我凉了
根本没看题
据说也是一道不可做题??
emmm……
任务:
WOJ#4490 「GXOI / GZOI2019」旅行者
多源最短路+二进制分组
(mark没有清空,出现了无数多的错误情况。一定要想清楚是否需要清空)
注意:
for(re int i=e[u].size()-1;i>=0;--i)
这样写是不对的,因为STL的size都是存在unsigned 里的
而unsigned是无符号,如果sze=0,然后一减,就会变成极大值
数组清空!!!
根据需要清空数组。不能每次memset都把定义的所有清空(那复杂度不是卡满了的O(n)嘛)
memset(dis,127,sizeof(ll)*(n+2));
第一个括号是数据类型,第二个是需要清空的大小
贪婪大陆
T2异或
今天校庆考试
完全不在状态。。T2伪算法打挂,然后最尴尬的是分段考虑的情况 n ≤ 200 n\le200 n≤200写的居然是 N ≤ 200 N\le200 N≤200
话说我还检查了啊……果然状态不对的时候强迫自己检查是没有任何用处的。。
今天中午的时候和rich浪,没有睡觉
废了一下午,我死了
下午回家的时候先睡了一觉,然后吃了个饭
感觉好点了,不容易走神了
理一理任务吧:
今天的T2,T3
贪婪大陆
T1 100pts
T2 20pts
T3 0
Total:120pts
最高:204pts
T1 背包
T2
假结论就不说了
正解:
从优化n3的暴力开始
其实我们不需要枚举每一个可能的根节点,只要有一个可能的根节点出现,如果它递归下去的子树不满足条件,则一定不满足条件
这是一个结论:题目中给定的序列合法的充要条件是对于任意一个区间,都存在一个数使得这个数与区间其他数的差的绝对值不超过 k。
然后就变成n2啦
我们如果从 l, r 同时向中间找,也就是第 t 步判断 l + t 和 r-t 是否是合法的 i,那么时间复杂度变成了
T(n) = T(k) + T(n k 1) + min{O(k), O(n k)} = O(n log n),
T3
完全不知道如何下手。
考虑现在在每一个交点的地方我们都对向交换,那么最后得到的顺序一定正确,这就是最多的对向交换次数(交点数)
那么最少的对向交换次数呢?
由于没有学过群论,目前还不知道为什么是n-置换数