摘要:
题面传送门 不小心抢了个最优解,比第二少了$0.6s$ 分块+根号分治套路题。 看到这种跳着加的就知道是根号分治了。 对于$x>s$的直接加,用分块维护。 对于$x<s$的,维护数组$f_{i,j}$表示跳$i$个,从$j$开始加了几次。为了之后统计方便,还要前缀和。 统计时,一部分是分块直接统计。 阅读全文
摘要:
题面传送门 一道好题。 首先有一个操作:如果有$n$个$a$,$n$个$b$,那么可以通过$n$次变成$2n$个$c$ 那么考虑倍增,每次选取两块拿来合并。 然后对于前一部分和后一部分分别倍增就好了。 代码实现: #include<cstdio> using namespace std; int n 阅读全文
摘要:
题面传送门 首先有一个结论就是不存在二次变换。 如果存在二次变换,那么二次变换那个点的至少一个方向会新出现一个点,但是要新出现一个点那个方向必定原来就存在一个点。所以不成立。 那么就可以从上到下做扫描线,当碰到一列最上面的点时给树状数组那个位置加一,最下面减一就好了。 代码实现: #include< 阅读全文
摘要:
题面传送门 这道题暴力dp是很好想的。 就是分别从上一天,最晚可转移的天,凭空买来转移。 因为有状态自然叠加所以只要转移最晚可转移的天就好了。 然后会发现这个是可以正反两边单调队列优化的。 复杂度$O(TP)$ 代码实现: #include<cstdio> #include<cstring> #de 阅读全文
摘要:
题面传送门 一不小心抢了最优解。 首先跑出$1$到所有点的最短路,因为那个梗在先,所以用堆优化dj 然后这道题显然要让我们求最小瓶颈路之类的东西。 所以就可以建出克鲁斯卡尔重构树。在树上倍增。 同时处理子树内距离最小值。倍增到的那个点的值就是答案了。 代码实现: #include<cstdio> # 阅读全文
摘要:
题面传送门 考虑暴力建分层图dp 实际上就是对于每个时间建到下一层的图就好了。 然后停留就是自环,爆炸就连向永远走不出来的点。 其实这个东西是可以矩乘优化的。 然后复杂度就降到$O(logtn^3)$ 代码实现: #include<cstdio> #define mod 2017 using nam 阅读全文
摘要:
题面传送门 一道套路题。 考虑把图分解成链与环。 然后我们会发现其实路径就是一条链加上一堆环。 因为从链走到环的路径会被异或两次为$0$ 所以就直接上线性基就好了。 代码实现: #include<cstdio> using namespace std; int n,m,k,x,y,flag[1000 阅读全文
摘要:
题面传送门 首先用两颗线段树维护每个点所在的亮灯联通块。 然后再建一颗二维线段树,每个点表示到当前为止,有多少个时刻能从$i$到$j$。 对于每次修改,依靠两颗线段树维护的区间,来修改。 这里有一个小技巧,在修改时加上$q-t$,修改时减去,就是答案,还能累加。 查询就查当前点就好了。 代码实现: 阅读全文
摘要:
题面传送门 可以算一道线段树维护hash的模板题了吧。 hash要满足两个条件:相同的数hash值一定一样与hash冲突尽量少。 这道题hash序列可以用幂次方来hash 然后用线段树随便维护一下就好了。 代码实现: #include<cstdio> #include<algorithm> #def 阅读全文
摘要:
题面传送门 数据太大了,所以要hash。 多取几个模数正确性更高。 代码实现: #include<cstdio> #define mod 1000000007 using namespace std; int x,y,z,n,m,k,head,ans[100039],fff; long long t 阅读全文