VIrtuoso

两把多兰剑加个布甲鞋

导航

03 2019 档案

Codeforces Round #545 (Div. 2) D 贪心 + kmp
摘要:题意 两个01串s和t,s中字符能相互交换,问最多能得到多少个(可交叉)的t 题解 即将s中的01塞进t中,预处理出next(tlen),然后每次填完移到next(tlen)继续填即可 代码 c++ include using namespace std; int sl,pl,i,j,a,b,e,f 阅读全文

posted @ 2019-03-31 17:02 VIrtuoso 阅读(126) 评论(0) 推荐(0)

Educational Codeforces Round 58 (Rated for Div. 2) F dp + 优化(新坑) + 离线处理
摘要:题意 有n个城市,m辆卡车,每辆卡车有起点$s_i$,终点$f_i$,每公里油耗$c_i$,可加油次数$r_i$,每辆卡车的油箱大小一样,每次加油都会加满,在城市之间不能加油,问最小油箱大小能满足每辆卡车顺利到达终点 题解 n define ll long long define MAXN 5000 阅读全文

posted @ 2019-03-31 16:56 VIrtuoso 阅读(89) 评论(0) 推荐(0)

Educational Codeforces Round 58 (Rated for Div. 2) D 树形dp(自下往上) + 数学
摘要:题意 一颗n个点的树,找出一条gcd 1的最长链,输出长度 题解 容易想到从自底向长转移 因为只需要gcd 1即可,所以定义$dp[u][i]$为u的子树中和u相连的gcd含有i的最长链长度,i为素因子 这样对于每个点u,维护$dp[u][i]$,用两条最长子链和u构成的链更新答案即可 代码 c++ 阅读全文

posted @ 2019-03-31 16:30 VIrtuoso 阅读(137) 评论(0) 推荐(0)

Codeforces Round #536 (Div. 2) F 矩阵快速幂 + bsgs(新坑) + exgcd(新坑) + 欧拉降幂
摘要:题意 数列公式为$f_i=(f^{b_1}_{i 1} f^{b_2}_{i 2} ... f^{b_k}_{i k})$mod$P$,给出$f_{1}...f_{k 1}$和$f_{n}$,求$f_{k}$,其中$P$等于998244353 题解 3是998244353的离散对数,所以$f^{b_ 阅读全文

posted @ 2019-03-31 16:18 VIrtuoso 阅读(146) 评论(0) 推荐(0)

Educational Codeforces Round 58 (Rated for Div. 2) G 线性基
摘要:题意 一个有n个数字的数组a[],将区间分成尽可能多段,使得段之间的相互组合异或和不等于零 题解 根据线性基的定义(线性无关),任意线性基组成的集合的异或和都不会等于0,因为假如等于零,说明一定存在一个基能被其他基异或表示 依次将数组a插入线性基中,最后非0线性基的数量就是答案 代码 c++ inc 阅读全文

posted @ 2019-03-31 15:41 VIrtuoso 阅读(139) 评论(0) 推荐(0)

Codeforces Round #532 (Div. 2) F 线性基(新坑) + 贪心 + 离线处理
摘要:题意 一个有n个数组c[],q次询问,每次询问一个区间的子集最大异或和 题解 单问区间子集最大异或和,线性基能处理,但是这次多次询问,假如每次重新建立基向量会超时 考虑区间的优先级,假如我只插入不删除的话,区间的优先级和左端点没有关系 贪心一下,只保留后面插入的基,这样就可以离线解决询问,然后查询的 阅读全文

posted @ 2019-03-31 15:24 VIrtuoso 阅读(102) 评论(0) 推荐(0)

Codeforces Round #548 (Div. 2) F splay(新坑) + 思维
摘要:题意 有m个人,n道菜,每道菜有$p_i$,$s_i$,$b_i$,每个人有$inc_j$,$pref_j$,一个人可以买一道菜的条件是 1. $p_i \leq inc_j \leq s_i$ 2. $|b_i pref_j| \leq inc_j p_i$ ,问每个人分别能买多少道菜 题解 转化 阅读全文

posted @ 2019-03-31 15:05 VIrtuoso 阅读(99) 评论(0) 推荐(0)

Codeforces Round #548 (Div. 2) E 二分图匹配(新坑) or 网络流 + 反向处理
摘要:题意 有n个学生,m个社团,每个学生有一个$p_i$值,然后每个学生属于$c_i$社团, 有d天,每天首先随机去除一个人,然后再从每个社团挑选一个学生(假如社团没有学生就跳过这个社团),使得这些学生组成的集合的mex值最大,输入每天的mex值 题解 假如这道题发现是二分图匹配就很好做 左边用$p_i 阅读全文

posted @ 2019-03-31 14:14 VIrtuoso 阅读(140) 评论(0) 推荐(0)

CodeCraft-19 and Codeforces Round #537 (Div. 2) E 虚树 + 树形dp(新坑)
摘要:题意 一颗有n个点的树,有q个询问,每次从树挑出k个点,问将这k个点分成m组,需要保证在同一组中不存在一个点是另一个点的祖先这种情况,问有多少中分组方案 题解 首先解决转移问题,假设一次询问全颗树的分组方案数,定义dp[u][i]为到树节点u,分了i组的方案数,其中num(fa[u])为u的祖先节点 阅读全文

posted @ 2019-03-31 13:24 VIrtuoso 阅读(197) 评论(0) 推荐(0)

Codeforces Round #548 (Div. 2) C dp or 排列组合
摘要:题意 一颗有n个点的树,需要挑选出k个点组成序列(可重复),按照序列的顺序遍历树,假如经过黑色的边,那么这个序列就是好的,问有多少个好的序列 题解 黑边不连,红边连,假如两个点不在同一并查集,那么一定经过黑边 定义$dp[i][j][k]$为选择前i个点,起始点为j,是否已经经过黑边(k)的方案数 阅读全文

posted @ 2019-03-31 12:41 VIrtuoso 阅读(150) 评论(0) 推荐(0)

Educational Codeforces Round 62 (Rated for Div. 2) C 贪心 + 优先队列 + 反向处理
摘要:题意 每首歌有$t_i$和$b_i$两个值,最多挑选m首歌,使得sum($t_i$) min($b_i$)最大 题解 假如最小的$b_i$确定了,那么拿得越多越好 枚举最小的$b_i$然后取剩下最大的$t_i$ 两种做法 1.从$b_i$大向小扫,这样用优先队列维护最大的那些$t_i$(丢弃最小的) 阅读全文

posted @ 2019-03-30 22:07 VIrtuoso 阅读(84) 评论(0) 推荐(0)

Codeforces Round #536 (Div. 2) E dp + set
摘要:题意 一共有k个红包,每个红包在$[s_i,t_i]$时间可以领取,假如领取了第i个红包,那么在$d_i$后才能领取下一个红包,每个红包价值$w_i$,对方假如有机会领取红包他一定会领取,你有m次阻止对方领取的机会,问对方最少可以拿到多少红包 题解 定义dp[i][j]为前i秒用了j次机会让对方拿到 阅读全文

posted @ 2019-03-30 21:11 VIrtuoso 阅读(127) 评论(0) 推荐(0)

Codeforces Round #547 (Div. 3) G 贪心
摘要:题意 在一棵有n个点的树上给边染色,连在同一个点上的边颜色不能相同,除非舍弃掉这个点,问最少需要多少种颜色来染一棵树 题解 选择弃掉度数最高的k个点,然后第k+1个点的度数就是答案 代码 c++ include define N 200005 define pb push_back using na 阅读全文

posted @ 2019-03-30 20:13 VIrtuoso 阅读(89) 评论(0) 推荐(0)

Codeforces Round #547 (Div. 3) F 贪心 + 离散化
摘要:题意 一个大小为n的数组a[],问最多有多少个不相交的区间和相等 题解 离散化用值来做,贪心选择较前的区间 代码 阅读全文

posted @ 2019-03-30 19:52 VIrtuoso 阅读(135) 评论(0) 推荐(0)

Codeforces Round #539 (Div. 2) D 思维
摘要:题意 将一个回文串切成一段一段,重新拼接,组成一个新的回文串,问最少切几刀 题解 首先无论奇偶串,最多只会切两刀 然后对于偶数串,看看有没有循环回文串,有的话只需要切一刀 代码 c++ include using namespace std; int n,m,i,j,ok,ans; string s 阅读全文

posted @ 2019-03-30 19:34 VIrtuoso 阅读(118) 评论(0) 推荐(0)

Codeforces Round #539 (Div. 2) 异或 + dp
摘要:题意 一个n个数字的数组a[],求有多少对l,r满足$sum[l,mid]=sum[mid+1,r]$,sum为异或和(n define M 3000005 define ll long long using namespace std; ll f[M][3],a[M],ans; int n,i; 阅读全文

posted @ 2019-03-30 19:12 VIrtuoso 阅读(105) 评论(0) 推荐(0)

Codeforces Round #546 (Div. 2) E 推公式 + 线段树
摘要:题意 给你一个有n个数字的a数组,一个有n 1个数字的k数组,两种操作: 1.将a[i]+x,假如a[i]+k[i] a[i+1],则a[i+1]要变成a[i]+k[i],直到某个a[j]+k[j] 2.询问某个区间的和 题解 利用题目性质将题目转化到你会的东西的性质 令$t_i=k_1+..+k_ 阅读全文

posted @ 2019-03-29 16:15 VIrtuoso 阅读(168) 评论(0) 推荐(0)

牛客练习赛42 C 反着计算贡献
摘要:题意 给你一个矩阵, 每次从每行挑选一个数,组成一个排列,排列的和为不重复数字之和,求所有排列的和(n,m define ft first define se second define MOD 1000000007 define MAXN 2005 define mk make_pair defi 阅读全文

posted @ 2019-03-29 15:41 VIrtuoso 阅读(122) 评论(0) 推荐(0)

Codeforces Round #548 (Div. 2) D 期望dp + 莫比乌斯反演
摘要:题意 每次从[1,m](m 发现每加入一个数,gcd会变为原来gcd的因数 $dp[x]$ $dp[gcd(x,i)]$ 但是方程却是反方向的 图片 代码 c++ include define MOD 1000000007 define MAXN 100005 define ll long long 阅读全文

posted @ 2019-03-25 23:07 VIrtuoso 阅读(160) 评论(0) 推荐(0)

Educational Codeforces Round 62 E 局部dp + 定义状态取消后效性
摘要:局部dp + 定义状态取消后效性 题意 给你一个某些位置可以改变的字符串,假如字符串存在回文子串,那么这个字符串就是坏的,问有多少好的串(n $dp[i][0]=dp[i 1][0] (k 2)+dp[i 1][1] (k 1)$ $dp[i][1]=dp[i 1][0]$ 分开讨论[A, 1, 1 阅读全文

posted @ 2019-03-23 22:06 VIrtuoso 阅读(109) 评论(0) 推荐(0)

CodeCraft-19 and Codeforces Round #537 (Div. 2) D 多重排列 + 反向01背包 + 离线处理
摘要:多重排列 + 反向01背包 题意: 给你一个字符串(n 即正常累加01背包的时候都是反着扫,但是用总方案减去非法方案的时候需要正着扫 附上线性逆元,阶乘,逆元阶乘打表板子 代码 c++ include define P 1000000007 define M 100005 define ll lon 阅读全文

posted @ 2019-03-20 22:10 VIrtuoso 阅读(113) 评论(0) 推荐(0)

后缀数组板子
摘要:poj1743 下标从0开始版本 c++ include include include include define M 20005 using namespace std; int x[M],y[M],sa[M],rk[M],c[M],h[M],s[M]; int n,i,l,r,mid,m,m 阅读全文

posted @ 2019-03-17 20:24 VIrtuoso 阅读(120) 评论(0) 推荐(0)

ac自动机板子
摘要:hdu2222 c++ include define ll long long define M 500005 using namespace std; int tr[M][30],T,n,i,fail[M],cnt[M],sz; char s[1000005]; void add(char s){ 阅读全文

posted @ 2019-03-17 20:19 VIrtuoso 阅读(81) 评论(0) 推荐(0)

kmp算法笔记
摘要:链接讲得很详细,画几个重点方便以后忘了捡 next[]数组从第i位递推算出第i+1位,所以遍历s[0,len 2]即可 next[i]计算的是s[0,i 1]的最长公共前后缀长度,失配时,模式串向右移动的位数为:已匹配字符数 失配字符的上一位字符所对应的最大长度值,即j nt[j] 关于计算next 阅读全文

posted @ 2019-03-14 12:54 VIrtuoso 阅读(155) 评论(0) 推荐(0)

Codeforces Round #546 (Div. 2) D 贪心 + 思维
摘要:贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n using namespace std; int n,m,a[300005],u,v,i,ok,ans; vectorA;set vi; int main(){ cin n m; for(i=1;i a[i]; for(i=0;i u v; 阅读全文

posted @ 2019-03-13 23:40 VIrtuoso 阅读(165) 评论(0) 推荐(0)

Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树
摘要:欧拉函数 + 区间更新线段树 题意 对一个序列(n 欧拉函数性质 1. 假如$p$是一个质数,$\varphi(p)=p 1$,$\varphi(p^k)=p^{k 1} (p 1)=p^k \frac{p 1}{p}$ 2. 假如p,q互质,$\varphi(p q)=\varphi(p) \va 阅读全文

posted @ 2019-03-12 19:56 VIrtuoso 阅读(184) 评论(0) 推荐(0)

Codeforces Round #538 (Div. 2) E 随机数生成
摘要:题意 交互题,需要去猜一个乱序的等差数列的首项和公差,你能问两种问题 1. 数列中有没有数比x大 2. 数列的第i项是什么 最多只能问60次 题解 首先用第一种问题+二分问出数列最大的数是多少,最多二十次 然后用第二种问题尽可能分散的询问第i项,然后将问出的数组排序,对相邻两个数的差求gcd 随机数 阅读全文

posted @ 2019-03-12 13:21 VIrtuoso 阅读(125) 评论(0) 推荐(0)

Codeforces Round #538 (Div. 2) C 数论 + 求b进制后缀零
摘要:题意 给你一个数n( $a=p_1^{x_1} p_2^{x_2} p_3^{x_3}... p_n^{x_n}$, $b=q_1^{y_1} q_2^{y_2} q_3^{y_3}... q_n^{y_n}$ p,q为素因子,后缀零个数为min(floor($x_i/y_i$)) 求p在n!中的个 阅读全文

posted @ 2019-03-12 12:51 VIrtuoso 阅读(119) 评论(0) 推荐(0)

Codeforces Round #541 (Div. 2) G dp + 思维 + 单调栈 or 链表 (连锁反应)
摘要:题意 给你一排m个的骨牌(m define ll long long define mxN 300005 define mxM 10000005 define inf 0x3f3f3f3f using namespace std; ll n,m,i,j,k,N,q,x,y,p; int l[mxM] 阅读全文

posted @ 2019-03-11 15:16 VIrtuoso 阅读(95) 评论(0) 推荐(0)

Codeforces Round #541 (Div. 2) E 字符串 + 思维 + 猜性质
摘要:题意 给你n个字符串,字符串长度总和加起来不会超过1e5,定义字符串相乘为$s s1=s1+s[0]+s1+s[1]+s1+...+s1+s[size 1]+s1+s[size]+s1$,求n个字符串依次相乘后最长连续字符相同的子序列长度 题解 鬼畜的题意 or 难以优化的复杂度,都需要观察性质才能 阅读全文

posted @ 2019-03-11 12:38 VIrtuoso 阅读(136) 评论(0) 推荐(0)

Codeforces Round #541 (Div. 2) D 并查集 + 拓扑排序
摘要:题意 给你一个n m二维偏序表,代表x[i]和y[j]的大小关系,根据表构造大小分别为n,m的x[],y[],使得两个数组中最大的数尽量小 题解 按照偏序表,构造出从小到大的拓扑图 如何解决相等的数的偏序关系? 用并查集缩点后再进行拓扑排序 如何解决最大的数最小? 只需要使得同一层的数相同就行,可以 阅读全文

posted @ 2019-03-11 11:57 VIrtuoso 阅读(156) 评论(0) 推荐(0)

Educational Codeforces Round 60 D dp + 矩阵快速幂
摘要:题意 有n个特殊宝石(n define P 1000000007 define ll long long define M 105 using namespace std; struct N{ ll a[M][M]; }; ll m,n,i,j; N mul(N x,N y){ N z; memse 阅读全文

posted @ 2019-03-09 20:43 VIrtuoso 阅读(93) 评论(0) 推荐(0)

Educational Codeforces Round 60 C 思维 + 二分
摘要:题意 在一个二维坐标轴上给你一个起点一个终点(x,y define ll long long using namespace std; ll sx,sy,ex,ey,n,x[100005],y[100005],i,l,r,mid; char s[100005]; int ok(ll d){ ll p 阅读全文

posted @ 2019-03-09 20:09 VIrtuoso 阅读(149) 评论(0) 推荐(0)

Codeforces Round #544 (Div. 3) dp + 双指针
摘要:题意 给你n个数(n dp[i][j] 2. 和前面的分组 dp[lt[i] 1][j 1] dp[i][j] 怎么确定i前面的哪个点是最大的? 选择能和i分到一组的最前面的数 因为选择最前面的数可以降低前一组的上限 用双指针or单调队列处理 双指针板子 c++ for(l=r=n;l =1;){ 阅读全文

posted @ 2019-03-09 19:49 VIrtuoso 阅读(228) 评论(0) 推荐(0)

Codeforces Round #542(Div. 2) CDE 思维场
摘要:C 题意 给你一个$n m$(n,m define pii pair define se second define ft first define mk make_pair using namespace std; int dx[]={0,0, 1,1}; int dy[]={ 1,1,0,0}; 阅读全文

posted @ 2019-03-09 15:45 VIrtuoso 阅读(116) 评论(0) 推荐(0)

Educational Codeforces Round 61 F 思维 + 区间dp
摘要:思维 + 区间dp 题意 给一个长度为n的字符串( define ll long long using namespace std; ll n,f[505][505]; char s[505]; ll dfs(int l,int r){ if(l r)return 0; if(l==r)return 阅读全文

posted @ 2019-03-07 10:46 VIrtuoso 阅读(141) 评论(0) 推荐(0)

Educational Codeforces Round 61 D 二分 + 线段树
摘要:二分 + 线段树(弃用结构体型线段树) 题意 有n台电脑,只有一个充电器,每台电脑一开始有a[i]电量,每秒消耗b[i]电量,充电器每秒可以给一台电脑充x电,假如有一台电脑在某一秒末电量 define M 200005 define ll long long using namespace std; 阅读全文

posted @ 2019-03-07 10:19 VIrtuoso 阅读(161) 评论(0) 推荐(0)

Educational Codeforces Round 61 C 枚举 + 差分前缀和
摘要:枚举 + 差分前缀和 题意 有一段[1,n]的线段,有q个区间,选择其中q 2个区间,使得覆盖线段上的点最多为多少? 题解 一开始用贪心搞,搞到一半发现需要枚举的情况太多 只能用暴力搞,即枚举被去掉的两个区间,那么如何判断去掉哪两个区间比较好? 维护去掉后剩下的点数即答案 代码 c++ includ 阅读全文

posted @ 2019-03-07 09:20 VIrtuoso 阅读(153) 评论(0) 推荐(0)

Codeforces Round #543 (Div. 2) F dp + 二分 + 字符串哈希
摘要:题意 给你一个有n( 比如存在一个首字符在i和一个首字符在j的串,那么比较的时候哈希值分别都要乘以(size i)和(size j),得到权级都是size的串 两层for已经是n n复杂度,还需要判定后面的串是否是前面串的子串? 一开始想法就是用一个map[i]记录每个位置之前哈希值的出现次数,但是 阅读全文

posted @ 2019-03-07 09:01 VIrtuoso 阅读(157) 评论(0) 推荐(0)

Codeforces Round #543 (Div. 2) D 双指针 + 模拟
摘要:题意 给你一个m(=k (n 1)$,可以用双指针,对于每个l可以处理出最小的r满足要求 这样就把数组分成了三段[1,l 1],[l,r],[r+1,m],第一段[1,l 1]删除数字使得可以被k整除(没有限制随便删除),第二段[l,r]分成两种情况: 1. (r l+1) k:去掉(r l+1 k 阅读全文

posted @ 2019-03-06 22:12 VIrtuoso 阅读(183) 评论(0) 推荐(0)

Codeforces Round #543 (Div. 2)B,C
摘要:B 题意 给你n( 因为每个数只会出现一次,所以对于某个和来说,组成的每个数对都是唯一的 代码 c++ include using namespace std; int n,k,m,a[1005],i,p[1005],j,vi[1005],d,ans,mk[1005]; double ti=0.5; 阅读全文

posted @ 2019-03-06 22:07 VIrtuoso 阅读(277) 评论(0) 推荐(0)