自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

陈颜的博客

公众号『陈颜Blog』

  • 博客(15)
  • 收藏
  • 关注

原创 牛客最长树链

题目链接 最长树链给出一颗树,每个结点都有一个权值,求出最长的一条链满足该链上所有点的最大公因数大于1。和队友讨论了一下,队友给出了暴力建图跑树的直径思路,我感觉会tle,不过经过好几轮hack和反hack,慢慢摸索出了一种正解。因为所要找的链的最大公因数要大于1,也就是这条链上所有结点都要有一个相同的质因子。按照结点权值的质因子对所有结点进行分类,分类后按照质因子进行建图,对每个新建的图跑一次树的直径就是一条最长链。例如样例,总共有2、3、52、3、52、3、5三个质因子,第一次考虑质因子222

2020-09-30 16:00:26 3687

原创 Pokémon Army (easy version)

题目链接 给出n个数 让你找到一个子序列aj1−aj2+aj3−aj4+aj5......a_{j1}-a_{j2}+a_{j3}-a_{j4}+a_{j5}... ...aj1​−aj2​+aj3​−aj4​+aj5​......和最大。其实很快就想到过dp[i][2]记录前i个数两种状态结尾的最大值,不过没细想下去。dp[i][1]表示前i个数以减号结尾的最大值,dp[i][0]表示前i个数以加号结尾的最大值先处理出dp[i][0]为前i个数的最大值(也就是只选最大值以加号结尾)然后有四种状态

2020-09-29 10:47:48 3631

原创 黑龙江省赛热身赛05

题目链接被精心构造卡了long longAC代码:#include <bits/stdc++.h>using namespace std;long long sum[70];int main(){ fill(sum, sum + 66, 0); long long temp, n; scanf("%lld", &n); long long summ = 0; for (int i = 1; i <= n; i++) {

2020-09-26 19:36:57 3587

原创 洛谷P3384轻重链剖分模板题

题目链接 P3384 【模板】轻重链剖分树剖模板题。树剖码量真大(树剖主要是把树形结构处理成链式结构,从而可以用诸如线段树、树状数组的数据结构进行维护。学习树剖之前得先会线段树、了解LCA以及树型结构的一些专有名词:树链剖分专有名词图文讲解1.首先是一个dfs函数,处理出结点的父亲、重儿子、深度、子树重量。非常简单:void dfs1(long long now, long long fa, long long dep) { father[now] = fa; depth[no

2020-09-25 18:16:00 3698 2

原创 洛谷P3258松鼠的新家-树上差分

题目链接比较裸的树上点差分,需要注意的是每次差分的终点作为上次的起点会重复计算,因此除了第一个点都需要减一。AC代码:struct node{ int v, next;} e[600010];int ct = 1;int head[300010];void add(int u, int v){ e[ct].v = v; e[ct].next = head[u]; head[u] = ct++;}int a[300010];int father[30

2020-09-25 10:27:43 3625

原创 树上差分之边差分

学会了点差分,边差分就很简单了。给定一棵树,给出若干次修改操作以及少次查询操作修改操作:给定两个点u,vu,vu,v,将u,vu,vu,v路径上所有的边权值+k+k+k查询操作:询问点xxx到其父亲结点的边权值思路:树上边差分,要修改u,vu,vu,v路径上的所有边权值,只需f[u]+=kf[u]+=kf[u]+=kf[v]+=kf[v]+=kf[v]+=kf[lca(u,v)]−=2∗kf[lca(u,v)]-=2*kf[lca(u,v)]−=2∗k点xxx到其父亲结点的边权值就是以xxx

2020-09-24 20:09:48 3837

原创 树上差分之点差分

给定一棵树,给出若干次修改操作以及一次查询操作修改操作:给定两个点u,vu,vu,v,将u,vu,vu,v路径上所有的点权值+k+k+k查询操作:询问点xxx的权值思路:树上差分,要修改u,vu,vu,v路径上的所有点,只需f[u]+=kf[u]+=kf[u]+=kf[v]+=kf[v]+=kf[v]+=kf[lca(u,v)]−=kf[lca(u,v)]-=kf[lca(u,v)]−=kf[father[lca(u,v)]]−=kf[father[lca(u,v)]]-=kf[father[

2020-09-23 17:28:05 3696

原创 字符串哈希On求最长回文子串

模板题链接 AcWing139. 回文子串的最大长度众所周知,manacher可以On求最长回文子串,但是神奇的字符串hash也可以做到求最长回文串。步骤:预处理字符串,类似于manacher,每两个字符中间插入‘#’,因为这样才能枚举中心。预处理正哈希和逆哈希,如果正哈希[l,r]==逆哈希[l,r],说明两个字符串相同。枚举回文中心,二分求回文半径。可以看出,时间复杂度是O(nlogn)O(nlogn)O(nlogn),代码如下:unsigned long long order1[2

2020-09-18 20:07:11 5331 5

原创 字符串Hash

字符串Hash原理,将字符串映射成一个值,是一个单向加密的过程。比较简单和常用的是进制哈希,我们把字符串看成是p进制数,然后使用unsigned long long的自然溢出(相当于是对264−12^{64}-1264−1取模),如果两个字符串的hash值相同,则可以认为两个字符串相同。单个字符串的Hash值要求长度为len的字符串str的Hash值先预处理出一个pwd[]数组,pwd[i]表示pip^ipi。Hash[]表示字符串的哈希值(p进制取模值)。显然有Hash[i]=(Hash[i−1

2020-09-16 18:03:59 3797

原创 洛谷p1637三元上升子序列

题目链接求序列中i<j<k且a[i]<a[j]<a[k]的三元组数量i< j<k且a[i]<a[j]<a[k]的三元组数量i<j<k且a[i]<a[j]<a[k]的三元组数量类似于线段树求逆序对,前后跑两遍即可。AC代码:#define MAX 500010struct node{ int k, l, r, sum;} tr[4 * MAX];int a[MAX];int b[MAX];void pushu

2020-09-12 11:25:33 3645

原创 洛谷P3373线段树

洛谷P3373线段树模板题,主要对懒标的处理要求比较高。有三种操作:区间加法区间乘法区间求和查询tips:我们对一个区间进行乘k操作的时候,他之前可能存在加法lazy还没pushdown,这时候,加法lazy和乘法lazy都需要乘k。因为这个lazy是为儿子节点准备的,儿子还没进行加法操作,这次的乘法肯定也会作用于前面的加法。另外,线段树的一些基本知识点漏洞这次也暴露了出来: pushdown操作,我们知道,每个结点的懒标都是为儿子结点准备的,所以在查询/修改到x结点的时候不需要pushd

2020-09-11 10:47:28 3725

原创 从入门到头秃周末休闲赛37诚实的人

题目链接题目大意:有n个人,这些人分成两部分:1.诚实的,他说的话全是真实的。2.不友善的,他说的话可能是真也可能是假。每个人说了ai句话:第i个人的第j句话是:x是y的,其中x表示一个人的编号,y是1或者0,表示诚实和不友善。现在问最多可能有多少人是诚实的。解题思路:看到了n的范围小于15,考虑二进制枚举出所有情况,然后分别加以判断。例如有五个人,其中一种二进制枚举出的情况是00110,那么我们只需要判断第三和第四个人说的话是否矛盾即可,其余的人可以直接跳过。判断思路:如果a说x是诚实的,但

2020-09-04 20:42:48 3817

原创 LCS

LCS:最长公共子序列对于两个长度为n的序列,要求最长公共子序列,我们可以用dp[i][j]表示a序列的前i位和b序列的前j位的最长公共子序列,最后dp[n][n]就是答案。状态转移:if(a[i]!=b[j]) dp[i][j]=max(dp[i-1][j],dp[i][j-1]);if(a[i]==b[j]) dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);代码:long long a[1010], b[1010];long long dp[1010][1010

2020-09-04 10:45:39 3562

原创 LISnlogn写法

LIS可以用dp解决。下面给出两种简单的dp写法:代码1:long long a[100010];long long dp[100010]; //dp[i]表示'以a[i]结尾'的子序列中的最长上升子序列长度int main(){ long long n, ans = 0; scanf("%lld", &n); for (int i = 1; i <= n; i++) scanf("%lld", &a[i]); for (in

2020-09-04 10:30:25 4597

原创 洛谷P5318遍历图

题目链接题目要求分别以dfs和bfs遍历图,并且要满足字典序最小。题目难度不大,但是要满足字典序最小,貌似用链式前向星写不了。改成vector用sort就可以过了。AC代码:/* * @Author: hesorchen * @Date: 2020-07-03 17:05:01 * @LastEditTime: 2020-09-02 21:40:38 * @Description: https://hesorchen.github.io/ */#include <map>#

2020-09-03 15:16:44 3781

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除