- 博客(20)
- 收藏
- 关注
原创 AtCoder Beginner Contest 220 - F : Distance Sums 2
F - Distance Sums 2 题意:求树上每个点到树上n个点的距离之和,边权值为1题解:ans为点i到所有节点距离之和,node为以i为根的子树的节点数量选择节点1为根节点,跑一遍dfs求出1到所有点的距离之和void dfs1(int u,int fa,int depth) { ans[u]=depth; node[u]=1; for(auto v:g[u]) { if(v==fa) continue; dfs1(v,u,depth+1); ans
2021-11-28 19:42:05
106
原创 Codeforces Round #751 (Div. 1) B. Frog Traveler
B. Frog Traveler题意:蛤蟆在深为n的井底,ai和bi分别表示在深度i时能往上跳最多ai米,跳完后停在深度i时会下滑bi米,问你要跳到地面(深度为0)最少跳跃步数,并且输出跳跃的方案.解 有一个观察就是从n开始往上跳到的深度j是最小的步骤,之后几次跳到该点的步骤都大于它第一次跳跃时,[ n-a[n],n-1 ]这个区间都被跳到,之后跳到的步骤肯定没有第一次跳的优秀,那么就可以把可跳跃的区间减到[ 0,n-a[n]-1 ]使用bfs去模拟这个跳跃的过程注意队列存的是跳后的深度,此时还未
2021-11-16 20:34:08
277
原创 51nod 1051 最大子矩阵和
1051求m行n列的最大子矩阵和int main() { ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); //ifstream s("photo.in"); //ofstream c("photo.out"); cin>>n>>m; //m是行数,n是列数 rep(i,1,m) rep(j,1,n) cin>>a[i][j]; rep(i,1,m) rep(j,1,n)
2021-09-26 19:17:31
62
原创 51nod 1040 最大公约数之和
51nod 1040预备知识:欧拉函数f[x]=x*(1-p1)*(1-p2)…(1-pn) pk指x的质因子。枚举n的每个因子,求gcd(n,i)=x 的个数,因子x的贡献即为x乘个数gcd(n,i)=x 转化为gcd(n/x,i/x)=1,进而求取f[n/x]
2021-09-20 16:15:37
55
原创 Educational Codeforces Round 111 (Rated for Div. 2) C
C. Manhattan Subarrays读好题。。。题意:找到一个子序列使得其中其中不包含3点组成单调递增或单调递减,那么该子序列对答案贡献为1。求有多少这样的子序列在这里插入图片描述
2021-08-13 11:30:13
56
原创 LIS dp
B. Orac and Models题意是找最长的序列,序列满足(原序列的下标)ij | ij+1且aij<aij+1定义dp[i]为以a[i]为结尾的最长的序列,ans最后O(n)更新,很容易想到对i来说可以用i的所有因子更新dp[i],如果是质因子那么很好处理,处理因子有点麻烦。对于i来说,它可以更新2*i,那么状态转移方程就出来了dp[j]=max{dp[i]+1}Greatest Common Increasing SubsequenceLICSE - Good Sequenc
2021-07-28 19:44:56
80
原创 cf1528A -树形dp
1528A掌握程度还是太浅了,简单的树形dp居然没看出来,构造半天。dp[i][0]+=max{dp[j][1]+abs(r[j]-l[i]),dp[j][0]+abs(l[v]-l[i])}dp[i][1]+=max{dp[j][1]+abs(r[j]-r[i]),dp[j][0]+abs(l[v]-r[i])}答案是max{dp[1][0],dp[1][1]}所以我1600了?具体就是每个点我只考虑边界,0表示左边界,1表示右边界,更新父节点时,使用相邻节点的右节点就应该只使用右边界去更新。
2021-06-10 21:13:19
86
原创 1513B. AND Sequences解题报告
1513B. AND Sequences题意是长n的序列,对任意i来说,a1&a2&…&ai==ai+1&…&an那么这个序列是好序列,找到所有的好序列,不同位置的数的排放视为不同。找不同位置1的数量,奇偶分情况啊,组合数学做到崩溃,数学基础太薄弱。看题解后,恍然大悟,只要考虑1和n位置上的数是不是序列中最小的数字即可,然后用全排列乘法。具体原理对于1个序列pre2≤pre1前缀,suf2≤suf3后缀,pref1是最小和sufn是序列中最小的数后中间无论什
2021-06-08 11:00:42
199
原创 1458A解题报告
Codeforces Round #691 (Div. 1)-1458A又不是不会欧几里得,又不是不会更相减损术gcd(a,b) → gcd(a,b-a)gcd(a,b,c) → gcd(a,b-a,c-b)gcd(a1+bj,…,an+bj)转化为gcd(a1+bj,a2-a1,…,an-an-1)求出后面那段的gcd,然后每次用a1+bj求gcd即可,负数细节...
2021-05-27 22:04:08
82
原创 cf1509C解题报告
cf1509C//不要再差一点了看了题解才过的,卡test6一开始思路是把一样的数放一堆,根据堆来做dfs,看题解后发现想太多了,直接对区间进行dfs(区间dp学的太菜,没打出来),记忆化搜索也写丑了。很简单的一道题dpwhile(tt--) { cin>>n; int c=0; rep(i,1,n) cin>>a[i]; sort(a+1,a+1+n); rep(i,1,n) rep(j,1,n) dp[i][j]=1e18; rep(
2021-05-25 22:08:53
157
原创 埃氏筛以及其的计数思想
这样一个问题:给你一个正整数n,求某个数,该数的所有因子和等于n埃氏筛int vis[N],prime[N];void esieve(int n) { int cnt=0; for(int i=2;i*i<=n;i++) { if(!vis[i]) { prime[++cnt]=i; for(int j=i*2;j<=n;j+=i) vis[j]=1; } }}//没深入理解算法的本质,太菜了利用埃氏筛的思想我们能轻松地计算出数i的所有因子和在第二层循
2021-05-25 20:28:47
83
原创 最大子段和
求解最大子段和可以通过dp的方式,如果涉及修改操作,在修改后再进行dp爆time,通过线段树log级的时间复杂度可在修改后快速得到答案大致思路:节点表示区间的最大和,该最大和由左子节点的最大和、右子节点的最大和以及左子节点的最大后缀和+右子节点的最大前缀和更新。说下为什么不直接用后缀和+前缀和更新:往下走有的节点的最大值是不加上右节点的,那么这个时候不能形成连续的段,因此最大和应该补上后缀+前缀区间的最大前缀由左子节点的最大前缀或者左子节点和+右子节点前缀更新区间的最大后缀由右子节点的最大后缀或者右
2021-05-21 19:29:05
49
原创 Gym102942
计数dp?i-----jk=j-i+1思路:最右边的-可有选择k,根据这个选择的排列靠左边那一个会有k,k-1…1种选择,从这个思路出发,我们把-的个数抽象为进行轮数,我们可以认为当-个数为1时,有一个k,它的贡献就是数量乘k,到第二轮的时候会有1个k(k的数量总是1),1个k-1…1个1,我们用它们的数量乘本身可得到第二轮答案,到这里,答案很明显了,我们只要算出第b轮1到k的数量即可,实际上我们k从什么开始也会影响答案,这里用一个dp[i][n][k]表示从i(最大可选择的数)开始进行到n轮时数k的
2021-04-15 21:31:52
88
原创 UVA10382
//author:aTSL#include <iostream>#include <algorithm>#include <cstring>#include <vector>#include <map>#include <cmath>#include <algorithm>#include <queue>#define max(a,b) a>b?a:btypedef long long.
2021-02-19 11:54:31
51
原创 2020ICPC·小米 网络选拔赛第一场 D Tarjin
D-Router Mesh代码一写就会,再写就忘了这题一看,跟我最近学的求割点好像,考虑一堆,删除单独成块的点块总数-1,删除块里的点分俩,非割点总块不增减,割点删后块数+1(后来WA了一发后想到删割点增加块数可能比1多,然后就不知道怎么操作了)链式前向星建图,背模板吧,习惯到0结束(边数组开俩倍大)ans[i]表示删去i点后增加多少块,在求割点算法标记为1的基础上修改如果该点不是根节点的话,ans为1望有不抄模板的能力吧struct team { int to,next;}edge
2020-10-28 19:52:12
130
原创 Codeforces 1405C
1405C好题啊。一开始想法是用一个sum[i]数组,遇到1 sum[i]++,遇到0 sum[i]- -,用cnt[i]表示前i位有多少个?,从k开始遍历sum,sum[i]-sum[i-k]表示长度为k的串中多出多少个0或1,用绝对值表示为res。同理cnt[i]-cnt[i-k]表示该串中?数量,如果该值大于等于res,那么该区间可以用?号表示0或1来使得区间的0,1数量相等贴下WA代码int main() { int tt;cin>>tt; while(tt--) { i
2020-10-16 10:59:10
82
原创 codeforces 1426F dp题
1426F2k分的dp哦给一个带?的字符串,?可以为a,b,c。找有多少个abc子序列(不是找最大的那个子序列)dp[i]表示到第i个位置的个数dp[i]记录什么?a的数量?ab的数量,abc的数量?dp[i][0]到第i位a的数量dp[i][1]。。。ab的数量dp[i][2]。。。abc的数量关键点,dp过程中遇到?字符,原串个数应当乘以3,比如?a,读到a的时候,该位的个数+3,为什么?a,b,c能取三种值ac?b?c,读到第一个?时候,a的个数应该乘3,再加上一个k,这个时候a的
2020-10-14 22:00:47
99
原创 2020/6/20比赛解题报告
F题考试成绩——拓扑排序算法操作:将入度为0的节点入队——把节点存入数组——然后删除以该节点为起始点的边(入度- -)主要代码在快读之后#include <iostream>#include <cstdio>#include <cstring>#include <queue>#define mem(a) memset(a,0,sizeof(a)) //using namespace std;const ll mx=500+5;inl
2020-06-22 11:44:12
156
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人