04 2021 档案

摘要:题意:要求就是有 \(n <= 7e5\) 长度的序列,然后要求给 \(n\) 个操作,每次删除一个数,删除的是在当前序列中,讲前 \(po_i\) 个数移到后面后的序列中最前面的数。 题解:权值线段树求第 \(k\) 大,然后这个 \(k\) 是根据删除的位置,一次一次找到规律推出来。 代码: # 阅读全文
posted @ 2021-04-28 17:22 u_yan 阅读(49) 评论(0) 推荐(0)
摘要:原题链接 题意:很多链,然后让每条链中各个元素都要挨在一起,然后给他们每个元素分配层数,层数相同的要以元素大小从左往右。 题解:就是两个栈模拟一下贪心即可。 代码: #include <algorithm> #include <cstring> #include <cstdio> #include 阅读全文
posted @ 2021-04-28 11:29 u_yan 阅读(88) 评论(0) 推荐(0)
摘要:原题链接 题意:静态区间询问比 \(k\) 大的数、小的数。 题解:主席树,但是问题是离散化的时候要注意,那个 \(k\) 也得加入离散化。 代码: #include <iostream> #include <algorithm> #include <vector> #include <cstdio 阅读全文
posted @ 2021-04-27 11:01 u_yan 阅读(36) 评论(0) 推荐(0)
摘要:原题链接 题意:一棵树,每个点上有点权,然后求简单路径上第 \(k\) 小。 题解:用的朴素做法,看到静态第 \(k\) 小,就用了主席树,然后在图上操作,要感性理解一下,用 \(lca\),即用 \(u,v\) 的版本然后剪掉双倍 \(lca\) 注意因为 \(lca\) 本身是包括的所以不要剪两 阅读全文
posted @ 2021-04-27 09:10 u_yan 阅读(29) 评论(0) 推荐(0)
摘要:#include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int N = 2e5 * 20; int a[N], b[N], root[N]; struct President_Tree 阅读全文
posted @ 2021-04-26 21:27 u_yan 阅读(28) 评论(0) 推荐(0)
摘要:原题链接 题意:就是给了一棵树,然后求任意两个点之间的距离异或和最大值是多少。 题解:很显然的是,随便定义数根,然后就是发现,如果计算 \(u\) 和 \(v\) 的边权异或和,那么就是可以是计算出 \(u->root\) 和 \(v->root\),因为如果重叠的话,\(lca->root \op 阅读全文
posted @ 2021-04-26 16:01 u_yan 阅读(55) 评论(0) 推荐(0)
摘要:原题链接 题意:线段树经典问题,多组询问,问区间内,最大连续字段和。 题解:难的地方在于询问时候的处理,就是返回的是一个结构体,然后里面有 \(Lmax\) 即前缀最大连续子段和, \(Rmax\) 后缀最大连续子段和还有 \(datamax\) 即最大连续子段和,还有 \(sum\) 即区间内的和 阅读全文
posted @ 2021-04-26 11:18 u_yan 阅读(53) 评论(0) 推荐(0)
摘要:原题链接 题意:就是多组询问,和多组操作,操作只有一种,就是在 \(l\) 到 \(r\) 加上新的地雷,询问是问在 \(l\) 到 \(r\) 一共有多少种地雷。 题解:这题应该是数据结构的一个经典套路,就是记录 \(l\) 和 \(r\) 的位置,在单点 \(l\) 和 \(r\) 上 \(a_ 阅读全文
posted @ 2021-04-23 14:49 u_yan 阅读(43) 评论(0) 推荐(0)
摘要:原题链接 题解:二维树状数组,第一次遇见,就是快速的计算出前缀和。 代码: #include <cstdio> #include <iostream> #include <queue> #include <cstring> #include <vector> #include <algorithm> 阅读全文
posted @ 2021-04-23 13:41 u_yan 阅读(39) 评论(0) 推荐(0)
摘要:const ll N = 1333; int n; struct BIT { int tag[MAXN], t[MAXN], Tag; void reset() { ++Tag; } void add(int k, int v) { while (k <= n) { if (tag[k] != Ta 阅读全文
posted @ 2021-04-23 13:38 u_yan 阅读(33) 评论(0) 推荐(0)
摘要:原题链接 题解:手推一下就知道了是要维护一个平方和的序列,然后就大力码码码。 代码: #include <cstdio> #include <iostream> #include <queue> #include <cstring> #include <vector> #include <algor 阅读全文
posted @ 2021-04-23 11:19 u_yan 阅读(52) 评论(0) 推荐(0)
摘要:#include<iostream> #include<cstdio> #include<cmath> #include <cstring> #include <queue> #include <stack> #include <set> #include <map> #include <vecto 阅读全文
posted @ 2021-04-22 17:50 u_yan 阅读(20) 评论(0) 推荐(0)
摘要:原题链接 题意:给出 \(n <= 1e5\) 个网格图点位置,然后让求所有点连起来的最小花费,即特殊的最小生成树,两个点之间相连的花费是 \(min(|x_a - x_b|, |y_a - y_b|)\) 题解:好像和之前做过一道dij的cf题类似。首先 \(n^2\) 建边不可取,那就是先按横坐 阅读全文
posted @ 2021-04-22 12:06 u_yan 阅读(56) 评论(0) 推荐(0)
摘要:原题链接 题意和思路:挺有意思的一道题,就是两个操作,第一个操作是在 \(l\) 到 \(r\) 的区间上加上首项为 \(k\),公比为 \(d\) 的等差序列。第二个操作是询问第 \(x\) 个数是多少。其实就是区间修改 \(+\) 区间查询,操作一就是在 \(l\) 上加上 \(k\),然后在 阅读全文
posted @ 2021-04-22 10:35 u_yan 阅读(70) 评论(0) 推荐(0)
摘要:#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 5e5 + 9; ll n, m, root; ll a[N]; struct segmentTree { struct node { 阅读全文
posted @ 2021-04-21 13:09 u_yan 阅读(36) 评论(0) 推荐(0)
摘要:原题链接 题意:给一个地图大小和二维平面上两个点,然后第一个人要让这两个点重合,然而第二个人要防止两个点重合,第二个人可以涂胶水,防止两个点重和,如果第一个人让某个点走到了胶水上,则不能移动这个点了。 题解:提供一种做博弈题的思路,就是手动模拟大量情况,然后找规律,可以发现距离过远能过早得布局好,然 阅读全文
posted @ 2021-04-17 11:10 u_yan 阅读(33) 评论(0) 推荐(0)
摘要:原题链接 题意:在一个环中,给每个数涂色,要求不同的相邻的数字颜色不同。 题解:很显然的是,偶数只要是 \(121212\) 就可以保证都不相同,如果是奇数环,那么要小心头尾会相遇,那么如果还是 \(1212\) 那么如果 \(a_{n-1}\) 和 \(a_{1}\) 都 \(\neq a_{n} 阅读全文
posted @ 2021-04-17 10:14 u_yan 阅读(169) 评论(0) 推荐(0)
摘要:原题链接 题解:解决了历史遗留问题。很显然的是,这样操作总和不会变,然后所有 \(gcd\) 的可能的取值都是会是 \(sum\) 的因子,所以可以 \(O(\sqrt {sum})\) 的时间复杂度来枚举 \(gcd\),然后 \(O(n)\) 遍历用最小操作来看是否是小于 \(k\),最后取最大 阅读全文
posted @ 2021-04-15 21:58 u_yan 阅读(65) 评论(0) 推荐(0)
摘要:题解:又是dp想不出来的。\(dp_{i, j}\) 代表了,第 \(i\) 位时(从左到右),余数为 \(j\) 的数量。然后发现,状态转移的时候,如果 \(s_i = ?\) 则 \(dp_{i,(j * 10 + k) \% 13} =\sum dp_{i-1, (j * 10 + k) \% 阅读全文
posted @ 2021-04-15 19:31 u_yan 阅读(77) 评论(0) 推荐(0)
摘要:题目链接 题解:想到了菊花图,没想到最值就是一棵树,然后是菊花图,然后要让合法点对减少的操作,就是给两个叶子连边,这样就删除了。 代码: #include <iostream> #include <algorithm> using namespace std; typedef long long l 阅读全文
posted @ 2021-04-15 11:59 u_yan 阅读(41) 评论(0) 推荐(0)
摘要:原题链接 题意:给一个流网络,问有多少条边,使得增加他们容量可以增加最大流。 题解:就是先跑出最大可行流,首先 \(f(u, v) \neq 0\),那么这条边不可以作为,显然其实感性理解就可以了。然后再枚举边,看看边的左端点是否存在一条路径从源点到左端点,边的右端点是否存在一条路径从右端点到汇点, 阅读全文
posted @ 2021-04-14 12:06 u_yan 阅读(42) 评论(0) 推荐(0)
摘要:原题链接 题解:建图就类似二分图找最大匹配,然后如果输出方案的话,那就是残留网络中流量为0的正向边就是使用的,所以直接找即可。 代码: #include <iostream> #include <queue> #include <map> #include <cstring> using names 阅读全文
posted @ 2021-04-13 09:32 u_yan 阅读(28) 评论(0) 推荐(0)
摘要:网络流模板 EK求最大可行流 #include <iostream> #include <queue> #include <cstring> using namespace std; const int N = 2000, M = 20090; int h[N], ne[M], to[M], f[M 阅读全文
posted @ 2021-04-12 20:25 u_yan 阅读(49) 评论(0) 推荐(0)
摘要:原题链接 题解:注意建立边 代码: #include <iostream> #include <algorithm> #include <cstring> #include <cmath> using namespace std; const int N = 5e3 + 9; const int M 阅读全文
posted @ 2021-04-11 12:25 u_yan 阅读(19) 评论(0) 推荐(0)
摘要:原题链接 题解:不要看到多重关系就慌张,其实本质上还是一对一对的关系,所以要提取出来,关键不得不做的信息,然后建图。 代码: #include <iostream> #include <algorithm> #include <cstring> using namespace std; const 阅读全文
posted @ 2021-04-11 11:32 u_yan 阅读(37) 评论(0) 推荐(0)
摘要:P4782 【模板】2-SAT 问题 #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N = 2e6 + 9; const int M = 2e6 + 9; int 阅读全文
posted @ 2021-04-10 21:46 u_yan 阅读(29) 评论(0) 推荐(0)
摘要:题目链接 题解:主要是了解了直线交点的求法是根据相似三角形然后用向量起点加上某个比例而成的。 代码: #include <algorithm> #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #inc 阅读全文
posted @ 2021-04-10 15:53 u_yan 阅读(39) 评论(0) 推荐(0)
摘要:题解:问题转化很重要,表面上是求是否存在一条直线,然后让所有线段在其投影上有公共部分,其实就是问是否存在一条直线可以穿过所有线段。本质上所有的问题都可以通过遍历点来解决,所以就是遍历每两个点,形成一条直线,然后判每条边是否在两边。 代码: #include <algorithm> #include 阅读全文
posted @ 2021-04-10 11:20 u_yan 阅读(32) 评论(0) 推荐(0)
摘要:原题链接 题解:普通小模拟。也学到了一些东西,所有的几何题,如果可以整数,那就用int,实在是不行才用double 代码: #include <algorithm> #include <cmath> #include <cstdio> #include <cstring> #include <ios 阅读全文
posted @ 2021-04-10 09:42 u_yan 阅读(26) 评论(0) 推荐(0)
摘要:#include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; const int N = 2800; map<string, int>GotTime; map<string 阅读全文
posted @ 2021-04-09 21:19 u_yan 阅读(76) 评论(0) 推荐(0)
摘要:原题链接 题意:遍历每个非关键边,预处理出来两个 \(MST\) 中的点到最近公共祖先的最长的边的距离,然后就是 \(\frac{cnt}{sum - Max_{i,j}}\) 枚举 \(i,j\) 即可,简直就和求最小生成树的过程一模一样。 代码: #include <cstring> #incl 阅读全文
posted @ 2021-04-09 09:18 u_yan 阅读(34) 评论(0) 推荐(0)
摘要:次小生成树 非严格 #include <cstring> #include <iostream> #include <queue> #include <algorithm> #include <vector> using namespace std; const int N = 1111; cons 阅读全文
posted @ 2021-04-09 08:42 u_yan 阅读(33) 评论(0) 推荐(0)
摘要:原题链接 题解:求非严格次小生成树,先钦定一个最小生成树,枚举每一条非树边。可发现加入枚举的这条边,定能成环,然后再在环上断开最大的是树边的一条边,然后枚举取最小值。为了缩小时间瓶颈,用了倍增法,预处理最小生成树上两个点之间到最近公共祖先的路上最长的边长,然后 \(\log\) 复杂度的查询。 代码 阅读全文
posted @ 2021-04-09 08:40 u_yan 阅读(37) 评论(0) 推荐(0)
摘要:原题链接 题解:考虑容斥,即假设是有向的完全图,那么边的数量必然是 \(n\times(n-1)\),考虑并不是强连通图,那么最接近的情况即是两个强连通分量,考虑如何形成,那么就是在原图缩完点的基础上,保留一个入度或者出度为零的~~(我就是没想到还有可能是出度为零)~~强连通分量不与除了自己以外的任 阅读全文
posted @ 2021-04-08 20:21 u_yan 阅读(28) 评论(0) 推荐(0)
摘要:Tarjan 有向图 强连通分量 void tarjan(int u) { dfn[u] = low[u] = ++times; stk[++top] = u;instk[u] = 1; for (int i = h[u]; i != -1; i = ne[i]) { int v = to[i]; 阅读全文
posted @ 2021-04-08 16:36 u_yan 阅读(91) 评论(0) 推荐(0)
摘要:原题hdu链接 原题poj链接 题解:做得比较通透的题,首先知道一条性质,边双连通分量缩点后会变成一棵树。要想知道加边后还有几个桥,那就相当于在一棵树上加边,找到这两个点的最近公共祖先,然后就可以找到经过了多少条边,这些全是桥,并且当经过后,这些桥都不再起作用了。 代码: #include <ios 阅读全文
posted @ 2021-04-08 16:01 u_yan 阅读(40) 评论(0) 推荐(0)
摘要:原题链接 题解:算是比较心累的一道题了,发现复杂的图论题尤其是涉及联通分量,就是大模拟+分类讨论。题中意思是,问两个点,是否能有两条不同路径。不同是指没有经过同一个点除了起点和终点。所以如果在同一个连通分量中,并且连通分量的大小大于2,那么必然是两条及以上。如果两个点不在一个集合,即没有道路。如果两 阅读全文
posted @ 2021-04-08 14:24 u_yan 阅读(46) 评论(0) 推荐(0)
摘要:原题链接 代码: #include <iostream> #include <vector> #include <cstring> #include <cstdio> #include <queue> #include <map> using namespace std; const int N = 阅读全文
posted @ 2021-04-08 11:18 u_yan 阅读(42) 评论(0) 推荐(0)
摘要:原题链接 题解:贴个链接吧 代码: #include <iostream> #include <vector> #include <cstring> #include <queue> using namespace std; const int N = 20009; const int M = 15 阅读全文
posted @ 2021-04-07 20:51 u_yan 阅读(23) 评论(0) 推荐(0)
摘要:原题链接 题意:给你N个集合,第i个集合S[i]有C[i]个元素(注意此处集合并非C++的set,而是允许存在两个相同元素)。每个元素为1到10000之间的整数。接着给你几个问题。对于每个问题给出的元素i,j,你要判断它们是否同时属于一个集合。换句话说,是否存在k(1<=k<=N)可以使i和j均存在 阅读全文
posted @ 2021-04-02 11:17 u_yan 阅读(59) 评论(0) 推荐(0)
摘要:题意:给一张有向简单图,给出邻接矩阵,求长度为 \(K\) 的路径条数,答案对 \(10^9+7\) 取模。 题解: 代码: #include <algorithm> #include <cmath> #include <cstdio> #include <cstring> #include <bi 阅读全文
posted @ 2021-04-02 09:31 u_yan 阅读(112) 评论(0) 推荐(0)
摘要:题目链接 题意:小G定义LY数对为两个数x,y在二进制的异或操作后恰好有两位是1。小G现在有两个数组a,b长度分别为n,m。现在小G想知道有多少对i,j满足(1<=i<=n,1<=j<=m),满足a[i]和b[j]是LY数对。 题解:非正解暴力的做法是 \(O(n\times 30\times 29 阅读全文
posted @ 2021-04-01 19:56 u_yan 阅读(73) 评论(0) 推荐(0)
摘要:原题链接 题意:你有两种轮胎,雪地胎和普通轮胎。雪地胎可以在任何路况行驶,而普通轮胎只能在不下雪的时候行驶。你现在知道你的雪地胎最多能用 \(k\) 天。现在告诉你总天数 \(n\),和每天是否下雪。问你,最少要换几次轮胎,才能保证下雪天都在用雪地胎,并且雪地胎使用天数不超过 \(k\) 天。你初始 阅读全文
posted @ 2021-04-01 15:12 u_yan 阅读(65) 评论(0) 推荐(0)
摘要:原题链接 题意:给一个 \(n\) 个点,\(m\) 条边的无向简单带权连通图, 要求删边至最多剩余 \(k\) 条边.定义"好点"是指删边后, 1号节点到它的最短路长度仍然等于原图最短路长度的节点.最大化删边后的好点个数. 题解:求出来最短路径树,然后就选 \(k\) 个点或者不选之类的就行。 代 阅读全文
posted @ 2021-04-01 14:41 u_yan 阅读(39) 评论(0) 推荐(0)
摘要:原题链接 题意:给一个数列和m,在数列任选若干个数,使得他们的和对m取模后最大 \(1<=n<=30\) 题解:首先看到 \(n\) 非常小,考虑暴力枚举,显然纯暴力是 \(O(2^n)\) 的复杂度,过不了,那么只能是考虑别的方法,显然 \(O(2^{\frac{n}{2}})\) 是可以过的,于 阅读全文
posted @ 2021-04-01 10:45 u_yan 阅读(246) 评论(0) 推荐(0)
摘要:原题链接 题意:如果 \(A_i\) 和 \(A_j\) 同色,那么必须满足 \(i < j\) 并且 \(A_i < A_j\),求最小的颜色来涂满整个序列。 题解:很显然的是,要求最长不上升子序列,然后因为只能求最长上升子序列,和最长不下降子序列,然后又已知结论最长不上升子序列又是可以转化为,原 阅读全文
posted @ 2021-04-01 09:15 u_yan 阅读(95) 评论(0) 推荐(0)