
acm
文章平均质量分 57
_Jyq
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
第十一届山东省大学生程序设计竞赛 K Piggy Calculator 笛卡尔树+倍增
link题意:定义运算符号x(i), A x(i) B =(A+B)*i,i越大优先级越大,其次从左往右。,给定一个只有该符号的式子,q次询问求区间表达式的值。题解:对符号建笛卡尔树,区间操作转化为在树上跑链的操作(要先维护前驱结点),存储一些信息后倍增就可以了。#include<bits/stdc++.h>#define mp make_pair#define pb push_back#define SZ(x) (int)(x.size())#define all(x) x.原创 2021-05-11 16:09:11 · 449 阅读 · 1 评论 -
树上背包正确姿势
三个限制:sz[u]i-j<=sz[u]-sz[v]j<=sz[v]void dfs(int u,int fa) { sz[u]=dp[u][1]=1; for(int v:G[u]) if(v!=fa) { dfs(v,u); sz[u]+=sz[v]; for(int i=sz[u];i>=1;i--) { for(int j=max(1,i-sz[u]+sz[v]),rk=min(sz[v原创 2021-05-09 18:03:54 · 111 阅读 · 0 评论 -
The 18th Zhejiang Provincial Collegiate Programming Contest F D B
linkF. Fair Distribution看到数据范围应该想到与根号有关,那么分两种情况讨论:①:机器人个数<sqrt(x)②:机器人个数>sqrt(x)---->机器人平均能源数<sqrt(x)分别枚举即可。#include<bits/stdc++.h>#define mp make_pair#define pb push_back#define SZ(x) (int)(x.size())#define all(x) x.begin(),x原创 2021-05-09 00:55:35 · 718 阅读 · 0 评论 -
cf 1485 F Copy or Prefix Sum 奇怪的dp
link题意有一数组BBB,求满足以下条件的数组AAA的个数B[i]=A[i],ORB[i]=∑j=1iA[j]B[i]=A[i] ,OR \\B[i]=\sum_{j=1}^{i}A [j]B[i]=A[i],ORB[i]=j=1∑iA[j]题解dp[i][j]dp[i][j]dp[i][j]表示∑k=1iA[k]=j\sum_{k=1}^{i}A[k]=j∑k=1iA[k]=j的方案数,那么显然有n2log2nn^2\log_{2}^{n}n2log2n的转移方程dp[i][j]原创 2021-02-14 21:59:54 · 296 阅读 · 1 评论 -
cf 1450 F The Struggling Contestant
link题意:给一长度为n的数组A,求以排列p满足A[pi],A[pi-1]不同,定义每一个排列的权值为abs(pi-pi-1) >1 的i的个数。输出满足条件排列的最小权值。无解输出-1思路:如果不考虑权值的话就是一个插数的过程,那么有解的情况就是出现次数最多的数要小于(n+1)/2。考虑怎么构造权值最小的排列。首先对于ai==ai-1的这些位置是一定要分开的。记为k,那么此时最小可能的答案就为k(翻转,重拍每个排列后每个端点的代价都为1),考虑什么情况下这个k会变大,无非就是某个数作为端点的原创 2020-12-10 12:42:44 · 325 阅读 · 0 评论 -
codeforces 1442 D Sum 可撤销01背包QwQ
link题意:有n个单调不减数组,求从这n个数组中选择k个数的最大和,(只能拿数组的一个前缀)n,k<3000思路:因为数组是单调的,所以能得到一个结论就是我们最多只会拿不全一个数组(当有两个数组都拿一部分时,那么肯定可以通过减少某个数组拿的数字去拿另一个数组来增大这个和)。所以我们就可以通过枚举哪个数组不全选,然后对剩下的数组跑01背包,在枚举当前数组选几个来更新答案,但可惜这是O(nnk)的,有一个巧妙的优化就是,我们分治整个区间,对于一个l,r维护不选这个区间内的数字的dp值。那么当原创 2020-11-09 20:44:16 · 605 阅读 · 0 评论 -
Educational Codeforces Round 97 (Rated for Div. 2) F ,G
linkF: Emotional Fishermen题意:n个数,求这n个数满足下面要求的排列数量max[i-1]2<=a[i] OR max[i-1]>=2a[i]思路:对于每一个前缀来说,出现的数字个数最多为 num[max[i]]+1,其中num表示max[i]>=a[j]的j的数量。所以有dp[i]表示最大值为ai时的方案数转移方程为:dp[i]=sigma(dp[j]A(n-num[j]-2,num[i]-num[j]-1))其实就是在更新前缀最大值时,考虑他所原创 2020-10-30 19:03:22 · 275 阅读 · 0 评论 -
D. Bouncing Boomerangs 模拟
link题意:n*n的矩阵,上面放着障碍物。现在有一个人分别在第i列投掷一个飞镖,沿着投掷方向前进,在遇到障碍物时会向右转弯,直到飞出矩阵。现在给你在每列投掷飞镖遇到的障碍数Ai<=3。还原障碍物所在位置,要求每行每列障碍物不能超过2个。思路:由于在考虑如何放当前列的障碍物时要考虑当前咧后面的列的障碍物是怎样放的,所以要从后往前枚举每一列来放障碍物,ai=1时在当前列随意放一个就行ai=2时那么只能放在i之后的j使得aj==1并且每个j只能用一次ai=3时有两种情况:1.放在之后的aj=原创 2020-10-23 10:53:50 · 225 阅读 · 0 评论 -
Codforces 1248 G Lucky Numbers (多重背包)
题意:把n划分成k个数,求最大价值,每个数的价值 由Fi和该数的第i位上是否为3的倍数决定。给定k<1e6,Fi i<6。Q次询问n思路:按位考虑的k个数的贡献,那么可以将第i位看成容量为3k的背包,就是一个多重背包,可以用二进制优化,但是这样直接分有问题。因为只能在3的倍数之间转移。那只需要先直接求出每个数的价值,然后背包容量就变成了3(k-1)接着转移就可以了。#include<bits/stdc++.h>using namespace std;typedef long原创 2020-10-21 19:40:21 · 247 阅读 · 0 评论 -
牛客练习赛71 C 数学考试
link题意:求长度为n的排列有多少个 要求满足 m个条件 :pi 表示前pi个数不是1~pi的全排列m<n<=2000思路:1️⃣:考虑用总方案数减去不符合条件的方案数:即对于位置 x 为,x! - (不符合条件)。设F[i]为前i-1个条件满足,第i个条件不满足的方案数,并且我们增加一项p[m+1]=n,那么F[m+1]即为答案转移方程:F[i]=sigma(F[j]*(j-i)!)(1<=j<i)第一次遇到这样的dp状态-_- 很奇妙。。 它是通过枚举最后一个不满足原创 2020-10-10 17:18:25 · 255 阅读 · 0 评论 -
CodeForces 1417 F Graph and Queries 无向图连通块问题转化为树上问题 重构树
link题意:给一无向连通图,每个点有一个权值,q次操作 每次操作有两种1,v 寻找v所在连通块内权值最大的点,并输出这个权值并且把改点权值变成02.x 删掉第i条边思路: 查询图上连通块内最大值和修改我们只学过在一棵树上利用dfs序,然后线段树维护。那么考虑如何将此题转化成一棵树。我们把删边考虑为倒着加边。在加边过程中利用并查集维护连通块。并且将每一时刻每一个点的连通块转化为一颗’子树’,这样在查询的时候就可以通过查询子树点权最大值来得到结果。如何将各个时刻的连通块转化为一颗树?只需要在加原创 2020-10-03 22:32:02 · 983 阅读 · 0 评论 -
Grakn Forces 2020 D E F
Dn个人,m个摄像坐落于二维平面上,x,y位置摄像能监视到的范围为(0 x, 0 y)每次移动可以选择将所有人x+1,或者将所有人y+1;问最少移动次数使得所有人都不在监视范围内;坐标<1e6考虑枚举操作x+1多少次,然后O1计算此时还需要操作y+1多少次来更新答案。mx[i][j]表示第i个人执行x+1 j次后还需要执行 y+1 的次数。那么所有人执行j次x+1后 还需执行y+1 的最少次数就为 max(mx[1~n][j]) 预处理即可。EMST 好题题意:有m个由1~n中的若干不同原创 2020-10-01 10:16:25 · 1759 阅读 · 2 评论 -
codeforces 1392 F Omkar and Landslide
link题意:有一长度为n的单调递增序列 。现在这个序列很不稳定,每秒钟都会发生如下变化:如果满足a[i]+1<a[i+1] 那么a[i]++,a[i+1]–。求最终序列。由于保证单调递增,所以说,只要有一个位置发生+1的变化,那么这个影响会一直传递到1。直到a[1]=a[2],此时,若在发生变化会使a[2]++。那么可以发现最后的序列为一个公差为1的等差数列,但是其中允许有一对相同的数字。那么求和 直接模拟即可最后的a[i]=i-1+(s-n*(n-1)/2)/n+(s-n*(n-1)/原创 2020-08-19 16:58:16 · 273 阅读 · 0 评论 -
HDU 6774
link丨T丨<=20, 丨S丨<=1e5最长公共子序列加速。O(m^2)dp[i][j]为T串前i个当前最长公共子序列为j时,在S串中最短的位置#include<bits/stdc++.h>#define pb push_back#define SZ(x) ((int)(x).size())#define all(x) (x).begin(),(x).end()using namespace std;typedef long long ll;typedef ve原创 2020-07-24 11:46:29 · 240 阅读 · 0 评论 -
hihocoder 后缀自动机
link重复旋律5求不同子串个数,SAM后统计所有节点的mx-mi+1即可#include <bits/stdc++.h>using namespace std;typedef long long ll;const int SZ = 26;const int maxn = 1e6+5;namespace SAM{ struct SamNode{int trans[SZ],slink,mi,mx;}sam[maxn<<1]; int tot; char s[maxn原创 2020-07-06 13:14:11 · 222 阅读 · 0 评论 -
后缀自动机
endpos相同的所有子串都会走到同一点。增量法构造,每新增一个字符,相当于多i+1个后缀,考虑这些后缀的endpos是否都为z(最长那个)。我们沿着slink_path(u)一直走,出现sam[u].trans[c]!=-1时说明发生endpos集合变化(即此后缀在之前出现过)这里又分两种情况1)对新增的串对状态x的endpos无影响2)产生影响,例:abcxabcxbc+x时 abcx 的endpos 由abcx,bcx,cx,x变为abcx+bcx的endpos。所以需要拆点。(待补)原创 2020-07-05 21:23:21 · 233 阅读 · 0 评论 -
Acesrc and Travel 换根
link换根DP,建议用以下写法,通过存储前缀极值,从而不需要复杂的分类讨论#include<bits/stdc++.h>#define fi first#define se second#define pb push_back#define SZ(x) ((int)(x).size())#define all(x) (x).begin(),(x).end()#define rep(i,a,b) for(ll i=(a);i<=(b);i++)#define per(i原创 2020-06-30 15:22:13 · 188 阅读 · 0 评论 -
Victor and String 回文树拓展
link前后端同时插入,增加前缀fail指针,发现对于每个节点,前缀fail和后缀fail相同。那么分情况直接更新就好了。并且在前面插入字符时不会影响原树的fail。因为每个节点的fail长度比他本身小。并且要注意,当插入一个节点时,如果它新生产的回文串的长度等于此时总串的长度,要同时更新L_last,R_last#include<bits/stdc++.h>using namespace std;typedef long long ll;///len表示当前节点对应回文子串长度原创 2020-06-25 12:02:33 · 212 阅读 · 0 评论 -
双倍回文
link容易发现满足要求的回文串的长度一定是 4的倍数,并且有长度为其一半的后缀回文。建立fail树后记忆化搜索即可#include<bits/stdc++.h>#define pb push_backusing namespace std;typedef long long ll;;const int SZ = 26;///字符集const int maxn = 5e5 + 6;struct PAM { struct PamNode{int fail,trans[S原创 2020-06-24 19:53:08 · 223 阅读 · 0 评论 -
Palindrome Mouse 回文自动机
link考虑每个点对答案贡献为除他本身外,所在fail链上节点个数和回文树上该节点祖先节点个数。这样写会有两个问题1.重复节点2.时间复杂度考虑递推,该节点的贡献为其父亲节点贡献+它所延伸出fail链的个数+1#include<bits/stdc++.h>using namespace std;typedef long long ll;;const int SZ = 26;///字符集const int maxn = 1e5 + 6;struct PAM { s原创 2020-06-24 17:42:18 · 152 阅读 · 0 评论 -
回文自动机
目录Palindrome auto machineQ1 节点会不会很多?Q2 怎么建树?Q3 建树后可以求什么?Q4 怎么求?模板例题:P5496Palindrome auto machine又称回文树,顾名思义,对于一个字符串的回文树来说,每个节点表示一个回文串。例:abbabba对应节点有:a,b,bb,bab,abba,bbabb用于统计某字符串有多少个回文子串之类问题。Q1 节点会不会很多?考虑每添加一个字符对回文树节点个数的影响如图所示,当添加c后,考虑以c为结尾最长的回文串A,原创 2020-06-23 20:31:37 · 1287 阅读 · 0 评论 -
楼教主 男人八题之一 Poj 1741 Tree
link树上距离小于等于k点对对数点分治模板首先考虑经过某一点zx的对数,那么我们可以通过dfs处理出所有点到zx的距离后求dis [a]+dis[b]<=k的个数(排序后双指针),但是这样算的时候还有可能两点没过zx,所以要容斥一下(减去所有以儿子节点为根的数量即为不经过zx的数量)。如果随便枚举zx的话,最坏复杂度会达到O(n^2)所以我们让每次枚举的点为重心,复杂度为O(nlog n) (每次都会减少大于s/2个节点)#include<bits/stdc++.h>#de原创 2020-06-17 13:06:08 · 189 阅读 · 2 评论 -
Pangu and Stones UVALive - 8177 区间dp
link石子合并变形,每次只能将[ L ,R ]堆石子合并为一堆.在普通石子合并dp [i] [j]上 添加一维 dp[i][j][k] 表示i~j区间还剩k大堆的最小花费那么dp[i][j][1]=min dp[i][j][z] l<=z<=r而当k>1时转移的意义相当于不断划分石子,有转移方程dp[i][j][k]=min dp[i][z][1]+dp[z+1][j][k-1]#include<bits/stdc++.h>#define ls rt<&原创 2020-06-16 19:29:58 · 172 阅读 · 0 评论 -
CodeForces Round #549 U2
考虑每一个点可得 bx+c>=y-xx有左侧直线在点{x,y-xx}上方,维护上凸壳即可#include<bits/stdc++.h>#define ls rt<<1#define rs rt<<1|1#define fi first#define se second#define pb push_backusing namespace std;typedef long long ll;typedef vector<int> VI;原创 2020-06-16 16:59:55 · 142 阅读 · 0 评论 -
Codeforces Round #549 (Div. 2) E. Lynyrd Skynyrd
链接倍增 :当前点要找的下一个点是固定的,利用倍增加速注意初始化和遍历顺序#include<bits/stdc++.h>#define ls rt<<1#define rs rt<<1|1#define fi first#define se second#define pb push_backusing namespace std;typedef long long ll;typedef vector<int> VI;typedef p原创 2020-06-16 15:19:56 · 157 阅读 · 0 评论 -
CDQ 分治
目录概述题目P3810P4169概述能够解决一些三维偏序 或者 二维矩阵上的 问题。第一维排序,第二维归并,第三位树状数组本质上就是利用归并排序的性质,在合并两个小区间的同时,由于小区间内的贡献已经算完,所以只剩下左边小区间对右边小区间的贡献,那么当我们在合并的时候对第三维维护一个树状数组即可算出三维偏序。剩下的就是一些细节问题:求偏序时,需要离散化,因为当某两点三维向量都相等时在归并过程中只计算了左边对右边的影响。题目P3810模板:P3810统计 对于0<=d<n, F(i原创 2020-06-09 23:13:11 · 320 阅读 · 0 评论 -
codeforces 645 Are You Fired?
链接令s[i]=a[i]+…+a[i+k-1],s[i+1]=a[i+k]-a[i],s[i+2]=a[i+k+1]-a[i+1]则转变为所有前缀和最小值 >01️⃣.k>=n/2 ----> s[1]=a[1]+.,…+a[k] , s[2]=x-a[1] , s[3]=x-a[2];把s[1]->0后取减缀和 的前缀min M[ ],则 a[1]+…+a[k]+M[n-k+1] 即为最小值2️⃣k<n/2令s[i]=a[i]+…+a[i+k-1]&g原创 2020-05-27 16:58:24 · 222 阅读 · 0 评论 -
HDU 4912 贪心
HDU4912任选一点为根后,贪心优先填所有点对中LCA大的点。那么以LCA为根的子树的所有点都为不能再选的点#pragma GCC optimize(2)#include<bits/stdc++.h>#define ls rt<<1#define rs rt<<1|1#define fi first#define se second#defi...原创 2020-05-05 12:05:43 · 187 阅读 · 0 评论 -
Educational Codeforces Round 86 (Rated for Div. 2) E - Placing Rooks
链接想使所有格子全被覆盖,要么所有行都有棋子,要么所有列都有棋子。假设现在是所有行都有棋子,那么其中k对棋子互相攻击就可以看成n-k列放n个棋子。那么答案就为2*C(n,n-k)把n个物品放n-k个集合的方案数。最后一项为第二类斯特林数,记S{n,k}为n个物品放k个集合的方案数公式:S{n,k}=sigma{C(k,i)(k-i)^n (-1)^i} 0<=i<=k递推公...原创 2020-04-27 11:48:57 · 489 阅读 · 1 评论 -
Master of Data Structure 虚树
链接m<2000建虚树后暴力维护虚树中两点间的实际点的个数 模拟即可巨丑的代码#pragma GCC optimize(2)#include<bits/stdc++.h>#define ls rt<<1#define rs rt<<1|1#define pb push_back#define fi first#define se se...原创 2020-04-22 17:27:40 · 971 阅读 · 4 评论 -
Codeforces Round #630 (Div. 2) E. Height All the Same 思维
链接操作1可以将所有的高度变成0 or 1(像俄罗斯方块一样)并且这其中的0和1可以全局互换操作2和操作1可以移动这些1,并且将相邻的0 0 -> 1 1那么问题就转换成,放置偶数个位置0,或偶数个位置1所以当n*m%2==1时 0和1总会有一个是偶数否则,也可以简单的构造出一个组合数公式,并化简为(a+b)^c的组合形式思考问题的方向是个很重要的东西,一道题能不能快速的解出...原创 2020-04-01 17:44:15 · 273 阅读 · 0 评论 -
Codeforces Round #629 (Div. 3)
第一次AK写篇题解庆祝一下~~文章目录A.Divisibility ProblemB. K-th Beautiful StringC. Ternary XORD. CarouselE. Tree QueriesF. Make k EqualA.Divisibility Problem看代码吧#include<bits/stdc++.h>#define pb push_bac...原创 2020-03-27 10:31:02 · 190 阅读 · 0 评论 -
Codeforces Round #625 World of Darkraft: Battle for Azathoth
链接Answer :可以把怪兽看成二维坐标上的一些点,每个点有一些权值。然后对于所有的x=ai(攻击)的轴上都有m个bi(防御)那么对于每一个bi它所能打死的所有怪兽就是当前的轴的左面所有y小于bi的怪兽所以问题就转化为一个区间求和+区间最大值的问题 用线段树维护就好了坑点:把握好题目给的条件,以及输入顺序(怪兽是先给的防御力 …好坑)Code:#include<bits/st...原创 2020-03-18 13:29:31 · 184 阅读 · 0 评论 -
Codeforces Round #532 (Div. 2) E. Andrew and Taxi 二分+拓扑序
Andrew and Taxi Question:给一n个节点m条边的有向有权图 现可以改变其中一些边的方向 总代价是这些边的最大值,问使该图无环的最小花费 n,m<1e5Solution:由于代价为所有边的最大值,想到二分然后对所有大于mid的边进行拓扑排序后,如果没有环那mid这个值就是可行的。并且把不在图中的边(即权值小于mid)并且top【u】>top【v】的边翻...原创 2020-02-21 18:31:35 · 156 阅读 · 0 评论 -
Codeforces Round #619 (Div. 2) E. Nanosoft 前缀和
E. Nanosoft Question:定义一个logo 形状颜色如下类推 ,现在有一个关于logo的颜色矩阵长n宽m 并有q次询问:r1,c1 r2,c2 直接最大的logo有多大n,m<=500 q<=1000;Solution:记录每种颜色数量的二维前缀和 ,那么对于一个区域 是否为logo只需分别判断其中颜色数量即可,并且以某个点为起点的logo最多只有一个 ...原创 2020-02-17 15:20:07 · 202 阅读 · 0 评论 -
Codeforces Round #556 (Div. 1) B - Three Religions DP
B - Three Religions DPQuestion:现有一个主串S 和 三个空串 A,B,C(只含小写字母)。问每次操作后 S 是否能包含 A B C (在保证 A B C 串内字母顺序不变的情况下组成S的一个子序列)操作是在某个串后面添加或删除字母一共q次操作|A| ,|B| ,|C| <= 250 。|S| <= 100000 。 q<1000我们要及...原创 2020-02-17 10:24:15 · 163 阅读 · 0 评论 -
Codeforces Round #618 E. Water Balance 贪心
Water Balance题意:n个数 可进行以下操作任意次:选择区间【l,r】其中的A【i】都变成这个区间的平均数,要求最小字典序思路:由于最后答案使单调不减的那假设前i个元素答案以求出,看当前位置的元素能否对当前答案优化,即前面元素的个区间答案 加 上当前元素能否使区间均值变小,一直维护一个答案序列就可以了教训...原创 2020-02-10 19:31:25 · 211 阅读 · 0 评论 -
HDU-2243考研路茫茫 AC自动机 + 矩阵快速幂
hdu-2243n个模式串,求满足长度小于等于k且至少包含其中一种模式串的串数(只包含小写字母)k<2^31-1多模式串的计数问题,我们用AC自动机来解决那么问题来了1)怎么求至少包含一种的串数?正难则反,我们用所有串数减去一种都不含的就是至少包含一种的方案2)所有长度小于等于k的串数怎么求?即26+26^2+26 ^3+……26 ^k首先想到的是利用 等比数列前n项和 a...原创 2020-02-05 12:01:37 · 206 阅读 · 0 评论 -
nefu 2027Ac自动机 + 状压dp
想不出来啊 想不出来????(全局变量数组开大还会RE。。。。。)官方题解:**多模式串匹配的问题用 AC 自动机来解决。**首先用输入的这些串构建出 AC 自动机,然后用状压在 AC 自动机上对答案进行搜索。设 res[now][S][l],表示的意思是在自动机上当前节点为 now,状态是 S,已经匹配的长度为 l,有多少种方案数。用记忆化搜索将答案统计出来,就可以了。问题1) 为什么可以用状...原创 2020-01-31 21:51:26 · 181 阅读 · 0 评论 -
洛谷P5357 AC自动机模板题
P5357对应输出n个模式串在文本串中出现的次数AC自动机????#include<bits/stdc++.h>using namespace std;typedef long long LL;typedef pair<int,int>pii;typedef pair<LL,LL>pll;const int maxn=2e6+5;const int ...原创 2020-01-31 16:15:37 · 376 阅读 · 0 评论