05 2020 档案
摘要:题面传送门 显然可以 暴力很好想,循环时直接更新答案即可。 考虑优化。 显然,如果每头牛都分成组,那么代价为,所以我们每次枚举状态时种类不能超过,否则为无用转移。 那种类数之内的最左端点怎么搞呢? 显然可以尺取法。跑$\
阅读全文
摘要:题面传送门 一眼看上去就是矩乘套路题。 又因为异或满足交换律与结合律,所以确定可以矩乘。 但是对于每个询问直接矩乘显然复杂度会 因为是矩乘,又因为询问只问了号点,所以可以拿原来的向量乘以预处理的矩阵,复杂度降为$O(n3logn)-O(qn^2log
阅读全文
摘要:题面传送门 来一发不用单调队列的解法。 循环还是单调队列的循环,只不过把单调队列换成一个变量记录有几个,循环时加减一下就好了。时间复杂度 代码实现: #include<cstdio> #define max(a,b) ((a)>(b)?(a):(b)) #define min(a
阅读全文
摘要:题面传送门 直接即可。 代码实现: #include<cstdio> #include<queue> #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; int a[1539][1539],x,y,n,m,k,ans,tot,pu
阅读全文
摘要:题面传送门 没啥好说的,模拟即可。 #include<cstdio> #include<iostream> #include<cstring> #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; int n,m,k,ans,tot,pus,
阅读全文
摘要:题面传送门 显然是全部把个倒到一个水壶中最优。 那么我们可以前缀和。枚举右端点,利用前缀和算左端点。 #include<cstdio> #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; int n,m,k,a[1000039],q[
阅读全文
摘要:题面传送门 显然可以 第一次,定义为在子树下距离在以内的总和。 第二次可以容斥,用父亲节点的减去儿子节点的值。 代码实现: #include<cstdio> #include<cstring> using namespace std; int n,m,
阅读全文
摘要:题面传送门 看着像线段树。 直接二进制拆掉就可以取反操作了。 拆掉以后就是异或或者的操作了。 时间复杂度 代码实现: #include<cstdio> using namespace std; int n,m,k,x,y,zs,head,a[100039],f1[
阅读全文
摘要:题面传送门 明显可以尺取法。 先把每一位取反,则枚举右端点,左端点单调不降则直接暴力枚举即可。 代码实现: #include<cstdio> #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; int n,m,k,a[300039],q[3
阅读全文
摘要:题面传送门 第二道题目。感觉还是很良心的。 区间相同个数,很容易想到。 然后可以用莫队维护出来,最后与一下就好了。 但是相同的数怎么办呢? 离散的时候把位置空出来,之后维护一下有几个就好了。 注意加一些常数优化之类的。 代码实现: #include<cstdio> #in
阅读全文
摘要:看来别的博客都没有讲清楚,那我就来讲一下。 一下纯属作者个人思路,若有不对请提出。 在这篇文章中,表示向下取整的除。 求的解 显然是不定方程。有无解我们可以用裴蜀定理验证,此处当做其有解。 我们可以尝试用表示出,比如这样:
阅读全文
摘要:题面传送门 启发式合并大法吼啊。 优雅的暴力。 暴力:遍历整个数组去修改,时间复杂度 换一个思路暴力:对于每一个维护一个队列,每次把两个队列合并。时间复杂度仍是 那可不可以优化一下呢? 每次我们不能把小的合并到大的上面去吗,这样可以减少点常数。 等等,你确定是常
阅读全文