AcWing 第59场周赛 https://www.acwing.com/activity/content/competition/problem_list/2015/ AcWing 4491. 数组操作 按题意模拟即可 注意小坑:前缀和包括第0项,多一个答案0 #include <bits/stdc++.h> using namespace std; int main () { int minn = 0, ans = 0, sum = 0;
松鼠的新家 树上差分模板题 - 点差分 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; const int maxn = 3e5 + 10; int val[maxn], dep[maxn], fa[maxn][25], a[maxn]; vector<int>gra[maxn]; void dfs
\(\large \text{Date: 7.6}\) \(\text{Sol. Luogu P4606}\) 战略游戏 —— 【圆方树】解法 题目描述 给出一个简单无向连通图。有 \(q\) 次询问: 每次给出一个点集 \(S(2\le |S|\le n)\),问有多少个点 \(u\) 满足 \(u \not\in S\), 且删掉 \(u\) 之后 \(S\) 中的点不全在一个连通分量
原题链接 题解 考点:带权并查集。 设 \(d[x]\) 表示 \(x\) 节点前面的战舰数量,\(s[x]\) 表示以 \(x\) 节点为首的那一列战舰的总数,合并操作如下: void add(int x,int y) { int a=find(x),b=find(y); fa[a]=b; d[a]=s[b]; s[b]+=s[a]; s[a]=0; } 把 \(a\) 接到 \(b\),\(a\) 前面
1.找gg 这个就是直接用字符串做就好了,注意对大小写不敏感,所以要先把所有的大写字母换成小写的(或者倒过来也行)。 时间复杂度是 \(O(n)\) 的。 代码: #include <iostream> #include <cstring> using namespace std ; int n , p[200005] , tot ; char a[200005] ; int main ( ) { c
1、仅匹配数字字符串 正则表达式: /^\d+$/ 简单解释: ^ 表示字符串的开头 \d+ 匹配一位或多位数字 $ 表示字符串的结尾 2、十进制数 正则表达式: /^\d+(\.?\d+)?$/ 简单解释: \.匹配单个 char 。 ? 表示可选。 () 表示一个组 (\.?\d)? 是一个可选组 3
题目链接:LibreOJ #2876. 「JOISC 2014 Day2」水壶 题意 给定一个 \(H\) 行 \(W\) 列的方格,其中每个方格可能是空地或者障碍。 方格图中存在着 \(P\) 个建筑物,第 \(i\) 个建筑物的坐标是 \((A_i,B_i)\)(保证建筑物的位置一定是在空地上)。 现在,JOI君需要在各个建筑物间往返,但是太阳很
题目链接 有 \(n\) 个物品,你每购买一个物品可以免费获得一个价格严格小于它的物品,求得到所有物品的最小代价。 \(1\le n\le5\times10^5\) 带悔贪心 假如并非“严格小于”,而是“小于等于”,这就是 AGC001A。 但我们依旧可以考虑排序后从大到小决策。不过由于现在的策略比较复杂,需
使用命令gffread -w test.fa -g GRCh38.primary_assembly.genome.fa test.gff3即可实现。 输入文件test.gff3如下所示: 记住:第三类可以写:transcript, protein, cds。不能写其他的字符,不然提取不了。 得到的输出文件test.fa如下所示:
洛谷传送门 CF 传送门 思路 显然线段树。每个节点存最左端的列的并查集和最右端的列的并查集,并且维护这个节点中连通块的数量。merge 时先将 \(res\) 的连通块数量设为两个子结点的连通块数量之和,然后合并左儿子最右端的列的并查集和右儿子最左端的列的并查集,如果合并成功则 \(res
道路相遇 题目链接:luogu P4320 题目大意 给你一个无向连通图,无重边自环,然后每次给你两点,问你有多少个点是两点间路径必有的。 思路 圆方树pre模板题? 圆方树怎么做这里不说,看铁人两项的博客。 那我们知道圆方树的性质就是圆点方点是固定的,而且圆点是原图的点。 那代表着圆点的数量
\(\text{Date: 6.29}\) \(\text{Summary - Better Data Structures}\) \(\text{Contents: Segment Tree, (advanced)B-I-T}\) \(\text{I - Segment Tree}\) 一些信息之所以能用线段树维护,是因为这些信息具有合并性(已知\([l,mid]\)和\([mid+1,r]\)的信息,能否整合推导出\([l,r]\)的
【模板】最近公共祖先(LCA) 倍增 lca 模板 真心觉得二进制太奇妙了 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; #define endl '\n' const int maxn = 5e5 + 10; vector<int>gra[maxn]; int fa[maxn
题目链接 P6139 【模板】广义后缀自动机(广义 SAM) 【模板】广义后缀自动机(广义 SAM) 题目描述 给定 \(n\) 个由小写字母组成的字符串 \(s_1,s_2\ldots s_n\),求本质不同的子串个数。(不包含空串) 输入格式 第一行一个正整数 \(n\)。 以下 \(n\) 行,每行一个字符串,第 \(i\) 行表示字符串
概念 前置芝士:链剖分 链剖分:指一类对树的边进行划分的操作,这样做可以减少某些链上的修改、查询等操作的复杂度。链剖分分为重链剖分,实链剖分和长链剖分(不常见)。 重链剖分:实际上树剖就是重链剖分的常用称呼。可以看看 树链剖分学习笔记 实链剖分:同样将某一个儿子的连边划分为实边,
考虑分治,分别求出左侧后缀和右侧前缀的直径,即需将两者两两合并: 将直径以长度和中心点(将边拆点,使长度为偶数)的方式描述,分别记为$d$和$u$ 此时,对于$(d_{1},u_{1})$和$(d_{2},u_{2})$,合并后的直径长度即$\max\{d_{1},d_{2},\frac{d_{1}+d_{2}}{2}+dis(u_{1},u_{2})\}$ 若直径两端点
link。 点 \(A\) 与 \((0,0)\),\(B\) 共线的充要条件是 \(\frac{y_A}{x_A}=\frac{y_B}{x_B}\),即 \(k_{OA}=k_{OB}\)。又考虑到题目提出刻画斜率相等双点间的关系,所以不妨把所有斜率相同的点看作一个。再考虑刻画点的移动,由于与共线的点是移动后两者之间的哪一者无妨,所以我们可以在
用两次dfs求出树的直径,这两次dfs可以写在一起,当然为了方便理解,这里是分开写的。 1 //两次dfs求树的重心 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 const int N=40005,M=40005*2; 8 int n,m,tot,p,ed; 9 int d[N],he
题面传送门 首先如果整个排列是一个环的话那么答案就是\(0\),由此我们得到了一个在环内构造的方法。 但是如果在环之间切换的话代价至少为\(1\),设环的个数为\(p\),则答案至少为\(2p-2\) 转化一下题目,相当于给每个\(p_i\)分配一个\(s_i\),满足\(s\)整个序列构成一个环。 初始我们先给
inline void dfs(int u, int f) { fa[u][0] = f; dep[u] = dep[f] + 1; for(int i = 1; i <= 26; ++i) fa[u][i] = fa[fa[u][i - 1]][i - 1]; int v; for(int e = hd[u]; e; e = nt[e]) if((v = to[e]) ^ f) dfs(v, u); } inline int LCA(int u, int v) { if(dep[u] < d
(如此简短的题目给人一种莫名的压迫感......) 题目中定义一个数的权值求解函数:F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. 观察可知:权值的表达式与数的位数相关,再加上要分离每个位上的数字,那么就不难想到数位DP了。 dp[pos][j]表示pos位下小等于j的元素个数,代
题面,题解就不打了,写的较好的题解。 主要是借这个题说一下如何正确的思考出来一道题: 首先样例肯定要模,在模的时候就是构建思路的过程,当然一般的小样例无论什么方法都可以得出答案(spj),能过正确的理解题面就行; 然后我们就可以顺着方案A想,看看是否有漏洞(反例)、复杂度(以这个题来说:每个人
Description 给出一个长度为 \(b\) 的数列 \(a\),要进行 \(m\) 次操作,每次操作输入 \(k\), \(l\), \(r\),要求支持以下两种操作: \(k=0\) 表示给 \([l,r]\) 中的每个数开平方(下取整)。 \(k=1\) 表示询问 \([l,r]\) 中各个数的和。 数据中有可能 \(l>r\),所以遇到这种情况请交换 \(l
[USACO12FEB]Nearby Cows G 一道换根DP的板子。但是通过这道题发现了我的一些错误代码细节。 一主要就是对于第二遍DFS的过程中对于自己的第二维(也就是距离那维)应当倒序枚举。因为你要保证你调用自己的某个值时这个值是正确的,又因为只会调用比自己小的dp值,所以倒序枚举就可以避免
倍增算法 类似二分思想 用fa[i][j]表示第i个数的第2^j个祖先 用dep[x]是第x的深度 每次对于两个节点 将深一点的点跳到和浅一点的同一个位置 然后再将两个点同时跳到同一个点 跳的时候跳以2的倍数跳 //预处理fa数组和de数组 //fa[i][j]第i个节点的第2^j个祖先 de[x] x的深度 void