
小技巧
cy41
celery cabbage
展开
-
codeforces 620(Div.2)E.1-Trees and Queries
题目链接:620E题意:给定一颗1e5规模的边权都为1的树,接下来1e5次询问,询问间独立,每次添加一条树中不存在的边,再给定两点询问两点间的路径长度是否可以达到k,两点间的路径可以多次包含相同点,相同边,可以来回走。这个题和我以前做过的一个题很像。一颗树的话两点间的最短路径是唯一的,所以如果没有新的边的话,只要路径长度是小于等于询问值,且两者的奇偶性相同则说明可以达到该询问值。如果加入一...原创 2020-02-16 12:53:03 · 449 阅读 · 0 评论 -
codeforces 619(Div.2)E. Nanosoft
题意:给定一个n∗m,(1<=n,m<=500)n*m,(1<=n,m<=500)n∗m,(1<=n,m<=500)的只含有四种颜色标识的矩阵,定义合法矩阵为:类似这样的四个块相同,且每个块内颜色一致,颜色分布位置也与之一致。接下来有3e53e53e5次询问,每次给出(r1,c1),(r2,c2)(r1,c1),(r2,c2)(r1,c1),(r2,c2)...原创 2020-02-15 00:46:22 · 307 阅读 · 0 评论 -
cf501D(变进制数,康托展开)
题目链接:cf501D题意:给出两个0~n-1的全排列,n<=200000,假设两个全排列分别是第x,y个全排列,现在要你计算第(x+y)%(n!)个全排列,并输出。好久以前做的了,咕咕咕了好久,比赛打完了来更一下。变进制数的概念请见这里:yummy的博客大概有两个应用:将一个全排列转化为变进制数,变进制数转为十进制算出第几个全排列。变进制数转化为全排列。该题先算出两个变进...原创 2019-12-15 10:05:32 · 257 阅读 · 0 评论 -
bzoj3251: 树上三角形
题目链接:bzoj3251题意:有根树,支持两种操作,询问从u->v的简单路径上是否存在三个点权可以构成三角形,单点修改点权。两边之和大于第三边,显然这是个很套路的东西,这个性质就是斐波那契性质,而斐波那契数列至多在五十项左右的时候炸int,故若简单路径长度大于50,那么必然有解,否则暴力check即可。#include<bits/stdc++.h>using names...原创 2019-11-23 09:52:54 · 156 阅读 · 0 评论 -
D. Misha and Permutations Summation(变进制数康拓展开)
题目链接:D. Misha and Permutations Summation题意:两个全排列,算出这两个全排列分别是第几个全排列,然后这两个数字相加,取模(n!),然后再输出一个全排列表示第几个全排列,第几个是从0开始编号的。大概在暑假的时候洛谷上看到一个变进制数的概念,就是将一个全排列转化为一个变进制数:yummy的博客然后将两个变进制数相加,如果最高位还会产生进位说明相加超过了(n!...原创 2019-11-09 15:07:53 · 231 阅读 · 0 评论 -
cf686D(子树的重心)
cf686D题意:求解有根树中所有子树的重心。徐州打铁归来补题。首先树的重心的性质如下:树的重心一定存在于直连儿子中节点个数最大的一个中,或就是本身。树的重心的所有子树中(删去该节点)最大的一颗的节点个数一定小于等于所有节点数量和的一半。重心不下移,若求解出子树的重心,则整个树的重心一定是子树重心或子树重心的父亲。。。。父亲。。。父亲。一颗树最多只有两个重心,并且这两个重心一定是相...原创 2019-11-05 19:02:47 · 452 阅读 · 0 评论 -
P2680 运输计划(二分答案,树上差分)
题意:中文题目链接:自己找二分答案,那么大于答案的边都需要修改一条边,于是将所有的大于答案的链打上标记(边差分),假设这样的链有x条,记录链最大值为k,二分答案为mid,枚举边,如果k-边权<=mid,并且这条边被覆盖了x次,说明该二分答案可行,考虑将答案缩小即可。#include<bits/stdc++.h>using namespace std;typedef lo...原创 2019-09-12 18:36:37 · 309 阅读 · 0 评论 -
2019牛客暑期多校训练营(第五场)B-generator 1(矩阵快速幂的小技巧)
a矩阵的123次幂是不是可以拆成:a120∗a3a^{120}*a^3a120∗a3,a12a^{12}a12是不是可以拆成a10∗a2a^{10}*a^2a10∗a2,于是当我们面对一个超级大的次幂,例如长度为1e6的字符串次幂,我们可以预处理矩阵的0~9次幂出来,然后从前向后计算: int k; char s[1000009]; for(int i=0;i<len;++i){...原创 2019-08-01 21:15:04 · 257 阅读 · 0 评论 -
2019牛客暑期多校训练营(第三场)F-Planting Trees(单调队列的应用)
题意:给定一个n*n的方阵,以及一个数字m,求出最大的矩阵面积,使得这个矩阵内的最大值减最小值小于等于m。首先考虑最暴力的情况,枚举上下左右边界,再n*n的检查。考虑优化,题目中提示n*n*n的算法可行,考虑那么可以想到枚举三个边界,然后得到另一个边界。那么我们可以枚举左右边界,然后对于上下边界,我们枚举下边界,用单调队列来维护上边界,使得矩阵尽量的大,那么我们肯定是希望满足最大值减最...原创 2019-07-26 10:25:05 · 167 阅读 · 0 评论 -
单调队列
很久以前不求甚解的看了一下,然后就没有管了,今天牛客的多校又考到这个点了,遗憾由于根本没有理解单调队列所以没有往这个方向想。单调队列是一个双端队列,他从头到尾,首先维护了下标的递增,其次根据需要维护了值的递增或递减。比较经典的就是滑动窗口了。给定一个大小为k的框,可以框住k个连续的数字,现在问你框不超过k个连续数字使得这些元素和最大。预处理前缀和sum[],那么我们应该使得区间左端...原创 2019-07-25 21:33:16 · 117 阅读 · 0 评论 -
2019牛客暑期多校训练营(第二场)H-XOR(单调栈)
题意:给定一个n*m的01矩阵,求不严格次大子矩阵的大小。(子矩阵中元素必须都为1)就是在求最大子矩阵的过程中加入一些判断,来求次大子矩阵。分为三种情况:如果该子矩阵的值小于最大值,那么用这个子矩阵的值去更新次大值 如果该子矩阵的值等于最大值,首先判断这个矩阵是否被使用过,若没有使用过则次大值等于最大值 如果该子矩阵的值大于最大值,那么次大值等于最大值,最大值等于该子矩阵的值。而...原创 2019-07-21 10:56:20 · 147 阅读 · 0 评论 -
对顶堆(动态维护中位数)
给定序列长度n,每输入奇数个数,求其中位数一次,最后输出所有中位数。一道例题:poj:3784分析:对顶堆做法,开两个堆,大根堆与小根堆,其中大根堆用来存排序后排名为1~n/2的数,小根堆用来存n/2+1~n的数。那么维护好这两个堆,每次查询中位数只需要访问小根堆的堆顶即是中位数。大根堆堆中的数字一定全部小于堆顶,小根堆堆中的数字一定全部大于等于堆顶,相当于排序后序列前一半的数字...原创 2019-04-05 17:31:46 · 1725 阅读 · 0 评论 -
求最长回文子串的长度
本文介绍两种做法,一、manacher算法;二、hash算法加二分(学自《算法竞赛进阶指南》-李煜东著)。一、我不会啊。。没学,记了个板子:#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=110005;char s[ma...原创 2019-04-10 18:55:51 · 1279 阅读 · 0 评论 -
隔板法
有n个盒子,m个苹果(m>=n)。盒子不为空,那么可以考虑用n-1个板子把m个苹果分为n个部分即可,故res=。 盒子可以为空,那么我们可以人为的增加m个苹果,给每个盒子放入一个,就又转化为了盒子不为空的放法,故res=给出百度百科的解释2333:一道题:https://ac.nowcoder.com/acm/contest/553/D...原创 2019-04-10 20:12:20 · 3437 阅读 · 1 评论 -
归并排序求逆序对数
const int maxn=5e5+7;int a[maxn],b[maxn];//原数组,辅助数组;ll change(int l,int mid,int r){ int i=l,j=mid+1; ll res=0; int k=0; while(i<=mid&&j<=r) if(a[i]<=a[j]...原创 2019-04-12 09:18:20 · 389 阅读 · 0 评论 -
双向bfs
可以理解为两个人同时走迷宫,走到同一地方时最少的步数,那么可以开两个队列,每次都各自扩展一层,若遇到自己可以走到的地方,另一个人走到了,那么说明这个地方就是最小的步数处。给一道题:https://ac.nowcoder.com/acm/contest/549/GA:每次可以向八个方向走一步;B:每次可以从四个方向选,可以走两步。那么每次可以考虑为为A扩展一层,为B扩展两次一层,即可。...原创 2019-04-16 09:57:52 · 138 阅读 · 0 评论 -
Subsequence (伪序列自动机)
题目链接:https://nanti.jisuanke.com/t/38232题意:给出一个字符串s,接下来有q次查询,每次输入一个字符串t,求t是否是s的子串(可以不连续)。倒着扫一次,预处理出每一位下一个字母出现的位置。字符串从下标1开始存储。const int maxn=1e5+7;char s[maxn];char t[maxn];int Next[maxn][27]...原创 2019-04-20 20:12:04 · 264 阅读 · 0 评论 -
C++动态开辟数组空间
一维空间 int* a=new int[row],若使用memset函数初始化的话不会起到该有的作用,还是使用for来初始化; 二维空间: v=new int* [n+2];//行开辟; for(int i=0;i<=n+1;++i){ v[i]=new int[m+1];//列开辟; } //初始...原创 2019-04-20 10:52:08 · 5813 阅读 · 2 评论 -
2019牛客暑期多校训练营(第一场)H-XOR
大佬的分析:here给定n个数字,求所有子集的长度之和,子集定义为:该子集合中的所有元素异或为0。学会了另一种线性基的写法。我觉得大佬的解释非常清晰,点击上方链接跳转就好。线性基的一些性质:线性基中的数字都是线性无关的; 若一个数字无法加入线性基中,说明该数字可被线性基中的若干个数字异或而成; 对于n个数字,如果可以找到两个不同的线性基,那么这两个线性基中的数字个数一定相同...原创 2019-07-19 21:13:14 · 332 阅读 · 0 评论 -
高精度乘法压位
vector<ll>v;const int h=1000000000;//压九位;void mutl(ll x){ ll t=0; //可以手动模拟一下十进制的乘法就明白了; for(int i=0;i<v.size();++i){ v[i]=v[i]*x+t; t=v[i]/h; v[i]%=h; ...原创 2019-04-05 17:08:23 · 504 阅读 · 0 评论