Codeforces Round #457 (Div. 2) 916 笔记
Posted surrender
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #457 (Div. 2) 916 笔记相关的知识,希望对你有一定的参考价值。
A. Jamie and Alarm Snooze
给出一个x<60,一个时间hh mm,求倒退多少次x能使得hh mm含7
B. Jamie and Binary Sequence (changed after round)
给出n,k (1?≤?n?≤?1e18,?1?≤?k?≤?1e5)
要求给出k个数,使得sum(2^a[i])=n(1<=i<=k),若无,输出no,要求k个数中的最大值最小,此时若还有多种情况,要求字典序最小
C. Jamie and Interesting Graph
给出n,m <1e5 求一个n点m边的简单图,使得MST为素数,1到n的最短路为素数
D. Jamie and To-do List
要求完成以下操作,n个询问,要求在线(n<=1e5)
set ai xi 将ai设置为xi
remove ai 移除ai
query ai 查询比ai优先级高的个数,xi越低,优先级越高
undo di 撤销之前di个操作
E. Jamie and Tree
给出一个n点组成的树和q组操作(1?≤?n?≤?1e5,?1?≤?q?≤?1e5)
有3种操作:
1.将根换成x
2.将包含u,v的最小子树的所有点权值加x
3.求以x为根的子树的点权和
笔记(非题解):
A 模拟
B 较复杂模拟,位数分解,贪心拆数
将n分解成二进制,1的总数为m,若m>k则无解,否则,每次尝试将最高位所有的数转化为下一位,这样的话每次最高位个数*2,直到总和超过k,此时已无解,因此倒退一步,即确定了最大的值,然后继续拆最大值,直到m=k,然后贪心放置位置即可
C 构造
先一条线串1,2,3,...,n,并且1,1,1,直到最后补成素数
然后1-2,1-3,...1-n,2-3,2-4,...2-n,...(n-1)-n用2,最后比最后的素数大
以此类推,直到凑够了m条边
D 可持久化线段树
对每条指令,维护一个变量,表示当前的版本,使用undo时直接跳到这个版本即可
E LCA 线段树 换根 树链剖分
如果没换根操作,LCA+线段树可解,加了换根操作后,分类讨论,大概想到一种用树链剖分解的方法。
求子树权值和
root不在x的子树中,不变
root在x的子树中,sum(x)-sum(root)-sum(root,x)(树链剖分)
求u,v的最长公共祖先,然后修改
如果lca(u,root)=root或者lca(v,root)=root,那么ans_lca(u,v)=root
此时直接修改所有点
否则,必不在u,v路径上,lca不变,
设lca(u,v)=t,若root不在t的子树中,直接修改子树
否则,对t的子树增加x,然后add(t,root,-x)(树链剖分), add(root,-x), add(root,x), add(t,x)
以上是关于Codeforces Round #457 (Div. 2) 916 笔记的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #457 (Div. 2) CJamie and Interesting Graph
Codeforces Round #457 (Div. 2) A Jamie and Alarm Snooze
Codeforces Round #457 (Div. 2) BJamie and Binary Sequence
Codeforces Round #457 (Div. 2) D. Jamie and To-do List 主席树