tg 92 solution
T1
首先看出第一步
枚举每个数作为最大公约数,
把边权为当前数\(now\)的倍数拿出来维护连通性
如果从大到小枚举\(now\)的话,第一次满足询问两点连通的\(now\)就是这次询问的答案
然后考虑优化上述过程
用bitset维护这些边出现的所有点
然后对于每个出现的点,bitset维护每个询问,
每一位是\(1\)表示和这个点有一个还没有得到合法答案的询问
然后当前点每个询问的另一个点必须也在这个集合
此时bitset一个按位与就是交集
然后我们处理的询问就可以直接找出来了
直接搞这样的询问,并查集维护每组询问两个点是不是连通的
如果连通那就更新答案
早就知道bitset有叫做_Find_first()/_Find_next就直接拿了搞\(T2\)没准就切了
Brute Force
暴力时间复杂度还有常数没收住
写的太烂和别人暴力一比少20
T2
上次做过一个区间\(\cos\)的
这次来个区间求\(\varphi\)的
正解隔壁势能分析线段树
zasdcn写的确实可以所以就扔上去了
考虑\(\varphi\)单次变化,奇数变偶数,偶数至少除\(2\)
除\(2\)很好啊?直接暴力搞这个东西,时间复杂度\(O(n\log n)\)
然后等这个\(y\)变成\(1\)以后就相当于给\(x\)区间加个\(1\)
然后线段树上暴力就好了
奇人轶事
我维护了两棵线段树分别针对x和以及y的和
for循环分支判断每个位置是否满足y=1
然后别的都是对的
最后我发现,虽然确实只会修改差不多3e6次
但是我暴力判断直接就废了
后来把`for`换成维护没有变$1$的一个`set`变$70$
然后发现我现在时间复杂度确实是对的,但是线段树常数太大
我修改3e6次直接就寄了
后来看到y修改点修区查换了树状数组过了
赛时写的是直接拿for搞的只有\(40\)
后来把for换成维护没有变\(1\)的一个set变\(70\)
后来维护\(y\)的数据结构从线段树换成树状数组,这才过
没错我就是那个傻逼
T3
扫描线
好像有一个套路就是每次加一列删一列
考虑到列宽这个必须靠枚举了所以考虑尽可能少枚举列
然后就如果比较瘦就翻转一下
这样时间复杂度\(O(nm\sqrt{n\cdot m})\)
考虑后续过程
一个区域\(𝑃\)的答案是\(max 𝑃 ∗ 𝑠𝑖𝑧𝑒(𝑃) − ∑ _{𝑖,𝑗∈𝑃} 𝑎_{ 𝑖,𝑗}\) ,
我们现在相当于转化为了序列上的问题:
统计所有子区间的和的和以及最大值乘区间长度之和,
后者可以对序列建笛卡尔树处理,
即在每个节点处处理左端点在左子树以及右端点在右子树的子区间,
相当于固定了区间最大值。
T4
树上差分
说句闲话

浙公网安备 33010602011771号