04 2024 档案
摘要:原题链接 题解 1.如果一开始没有 个相同的卡片,答案是 2.否则将按照如下步骤 取 个相同卡片 如果取出卡片后,没有剩余卡片了,随便放 个卡片进去,游戏结束 否则把 个卡片全部变成剩余卡片中的一个,情况回到第一个步骤 code #
阅读全文
摘要:原题链接 题解 1.题目对 没有限制,也就是说,i可以大于j,可以小于j,也可以等于j 2.找普适规律。不管谁和谁成功配对,要么两个数长度相等;要么前面的数长度大于后面的数,于是前面的数分后半部分出来;要么后面的数大于前面的数,于是后面的数分前半部分出来; code #include
阅读全文
摘要:原题链接 题解 暴力。 知识点 : 返回 如果这里先把所有的素数求出来的话,也要 也就是 ,所以直接遍历就好了 code #include<bits/stdc++.h> #define ll long lon
阅读全文
摘要:原题链接 题解 被自己蠢哭了 没思路的时候先暴力想想看,暴力思路怎样?按输入顺序遍历仓库,然后再来一个循环,找到第一个大于自己的仓库,怎么找?循环找呗 时间复杂度 貌似可以 code #include<bits/stdc++.h> using namespace std; stru
阅读全文
摘要:原题链接 #include<bits/stdc++.h> using namespace std; int dis[105][105]; int xx[4]={1,0,-1,0},yy[4]={0,1,0,-1}; int a[105][105]; int vis[105][105
阅读全文
摘要:原题链接 题解 1.没有棋下也算一种情况!!!!!!!!! 2.前k次放置,如果放在对角线上,会把原先n阶矩阵分解成n-1阶矩阵,如果没放在对角线上,会分割成n-2阶矩阵 3.不管如何放置,到最后第一列总有且仅有一颗棋子,第一列的第一行只能放白棋,第2到第n行可以放白棋或黑棋,所以第一列的放置有 \
阅读全文
摘要:原题链接 题解 1.身份证号长度必须为18,且均为数字 2.如果申请人身份证合法,且身体状况为1,就把他放进ans2,(申请顺序) 3.身份证一定不同,姓名可能相同 4.得到口罩的输出是发放顺序 code #include<bits/stdc++.h> using namespace std; ma
阅读全文
摘要:原题链接 题解 1.把输出直接看成一个向量整体存在map里 2.如果两个向量 代表a的字典序比b大 code #include<bits/stdc++.h> using namespace std; int vis[100005]={0}; int dlx[100005]={0};
阅读全文
摘要:原题链接 题解 说用k种颜色, 没说用少于k种 code #include<bits/stdc++.h> using namespace std; vector<int> G[505]; int vis[505]={0}; int color[505]={0}; int v,e,k,n; int s
阅读全文
摘要:原题链接 题解 找到终点,然后终点往前移,起点往后移,奇数时输出终点所在位置..直到起点终点重合,这时输出尾节点是-1 code #include<bits/stdc++.h> using namespace std; struct node { int data,next,from; }a[100
阅读全文
摘要:原题链接 题解 1.后面的列车排到前面最小的比自己大的列车后面 code #include<bits/stdc++.h> using namespace std; int len=0; int a[100005]={0}; int main() { int n; cin>>n; fill(a, a
阅读全文
摘要:原题链接 题解 复杂图论题做多了这种题不会做了 直接模拟即可,标记被摧毁的城市,然后遍历所有城市,能一次性搜索到的城市是一个城市群,累积有几个城市群 code #include<bits/stdc++.h> using namespace std; vector<int> G[505]; int v
阅读全文
摘要:原题链接 题解 把不需要删的放一边,需要删的放一边,大模拟题,注意结尾特判(为什么?想象极限条件) code #include<bits/stdc++.h> using namespace std; struct node { int val,next; }chain[100005]; int vi
阅读全文
摘要:原题链接 题解 确定起点和终点,求救援人数最长,路径最短的路径,只需要集群算法中优先队列中重载比较符修改一下就就行,由于数据量很小,所以输出路径的时候搜索就行(最优解唯一) code #include<bits/stdc++.h> using namespace std; struct node {
阅读全文
摘要:原题链接 题解 找出右端点大于等于当前区间的左端点且左端点小于等于当前区间的右端点的所有区间,由于查询前这样的区间具有单调性,所以可以用二分,但是怎么快速删除呢? 欸stl大法来了,用set存储区间,查找和删除和添加都是 级的 code #include<bits/stdc++.h
阅读全文
摘要:原题链接 题解 ,太不容易了 所以对于每一个数而言,最多有两个配对,最少有一个配对。即排序之后,前后哪个离自己更近就和谁配对 把配对看成区间 令 代表有多少个区间的左端点大于 把查询按右端点排序,顺序遍历
阅读全文
摘要:原题链接 题解 1.由于每个点最多修改6次,所以我们可以暴力循环遍历所有点进行修改。然后可以把无需再修改的点跳过,即并查集,指向右端第一个仍然需要修改的值的下标 这样就是单点修改加区间查询,树状数组 时间复杂度 (单点修改)+ (区间查询)
阅读全文
摘要:原题链接 题解 莫队算法是局限性非常大的优化,离线+无修改,它通过邻近区间修改复杂度为 的特性让区间排序,然后再做修改,排序的规则是按块排序,然后左端点 在一个块里的按右端点排序 code #include<bits/stdc++.h> using namespace
阅读全文
摘要:原题链接 题解 本题的优化真的很重要!! 把所有元素出现的下标用map套vector存起来,然后二分查找 code #include<bits/stdc++.h> using namespace std; map<int,vector<int> > mp; int main() { ios::syn
阅读全文
摘要:原题链接 题解 1 看代码,最简单的 这叫什么思想?不知道,我暂时叫做信息标记法,但是标记的角度清奇 code1 #include<bits/stdc++.h> using namespace std; int late[100005]={0};//离自己最近的相同元素的位置 int maxleft
阅读全文
摘要:原题链接 题解 本题虽然有思维题做法,但是我认为不具有普世意义,本题的特点在于分治法,即普通算法在平均条件下表现良好,但是在极端条件下极慢,这时候我们需要将极端条件拎出来另做判断 code #include<bits/stdc++.h> #define ll long long using name
阅读全文
摘要:原题链接 题解 请看这 我补充一点:由于 和 很明显不对劲,所以要特判一下 二点:像这种看起来需要模拟来找答案的不妨手推一下数学式子来找答案 code #include<bits/stdc++.h> using namespace
阅读全文
摘要:原题链接 1.极限构造法 ,黑珠数量 , 白珠数量 再观察样例,发现刚好把1全部放左边,0全部放右边时等号成立 code #include<bits/stdc++.h> using n
阅读全文
摘要:原题链接 题解 极端试探法,既然要求 k 的最大值,k 最大为 n,当 k 能取 n 是什么时候?是所有数都相等的时候。 k能不能取n-1?能,给n-1个数同时乘上一个数,等价于剩下的那个数除以一个数(相对大小),而把所有数都除到1,它们就相等了 举例: 2 3 4 5 给后面3个数同时乘上2 \(
阅读全文
摘要:原题链接 题解 1.这个前缀长度必须等于暗号和那条信息长度的较小者 ,因此,找出信息是暗号的前缀的信息和暗号是信息的前缀的信息 code #include<bits/stdc++.h> using namespace std; int tree[500005][2]={0}; int jg[5000
阅读全文
摘要:原题链接 题解 1.把字符串离散成数字(总不可能有重名的吧) 2.树状数组计算逆序数(比归并排序好写多了),即计算小于 的数的出现次数总和 code #include<bits/stdc++.h> #define lowbit(x) ((x)&(-x)) using namespace
阅读全文
摘要:原题链接 题解1 本质:求一个数前面有几个数大于它,我们把序列分成几段,然后对每段分别进行排序,然后找出这个数在前面已经排好序中的序列里有几个大于它 code #include<bits/stdc++.h> using namespace std; #define ll long long ll a
阅读全文
摘要:原题链接 题解 1.最小数在操作之前是第一位,操作之后也必然是第一位,这就导致了如果原数组最小数后的数遍历不到,如果非有序就真的没法有序了,否则每个数都刚好大于前面一个数一定有序 code #include<bits/stdc++.h> using namespace std; int a[2000
阅读全文
摘要:原题链接 题解 只需要存在两个叶子节点之间距离等于d就好了,于是我们构造一条链,令节点一为滑动变阻器,则根据d改变与节点n的距离即可 code #include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while
阅读全文
摘要:原题链接 题解 具体想 是如何一步一步变成 是很复杂的,所以我们换个角度思考(比如贡献) 遍历每一个 看看他们能帮助哪些 变成 而且不妨碍 中 的元素,用数学语言表达就是 \(use[j]=
阅读全文
摘要:原题链接 题解 如果存在某一条边的 那么这条边一定有点剩余无法连接,为什么?这条边上每取两个点作为底边点,就一定能去外面一个点作为顶点,且无交叉(顺时针或逆时针) code #include<bits/stdc++.h> #define ll long lo
阅读全文
摘要:原题链接 题解 设想每一个 代表中控台,中控台颜色改变它控制的颜色也会跟着改变,我们倒过来求,这样就能确保每个中控台有没有控制的颜色 code #define ll long long #include<bits/stdc++.h> using namespace std; cons
阅读全文
摘要:原题链接 题解 观察数据范围,看到 便确定了 左右的算法,这样一来我可以遍历所有的区间 虽然每个 对应的答案区间都不同,但一定能遍历到,所以我可以再遍历一遍k,算出以该区间为答案区间时的 但是这样一来时间复杂度就超了,
阅读全文
摘要:原题链接 题解 假如一开始是一个完全单调递增函数,那么没有任何链接,这时我们交换两个数 ,则 成了一个连通块,这时我们再取出 内的元素与 交换,则 成了一个连通块 所以 \([i,l]\
阅读全文
摘要:原题链接 题解 不仅要学会怎么打cf,还要学会怎么解决问题:把条件写下来,对着条件写,然后对着程序在脑海中充分模拟 code #include<bits/stdc++.h> using namespace std; char s[20005]; int main() { int t; cin>>t;
阅读全文
摘要:原题链接 题解 每一个任务都有一个最小起点能力值,和通过任务后获得的能力值,我们从最小起点开始遍历,如果遍历到某一点累加的能力值+最小起点能力值够不到当前任务的最小能力值,我们把最小起点向右移动直至够到当前任务的最小能力值。 code #include<bits/stdc++.h> using na
阅读全文
摘要:原题链接 题解 巧妙模拟题 1. 所以可以暴力枚举k 2.把翻转的区间具象化,我们可以发现序列中值为 1 的地方覆盖了偶数个区间, 0 的地方覆盖率奇数个区间 所以我们遍历字符串的时候,在遇到的第一个0开始建立以其为左端点的区间,如果遇到 1 的区间覆盖数为奇数,那就再建
阅读全文
摘要:原题链接 题解 明确每个变量的意义 code #include<bits/stdc++.h> #define ll long long using namespace std; ll a[200005]; int main() { ll t; cin>>t; while(t--) { map<ll,
阅读全文
摘要:原题链接 题解 本质上是做题,所以观察题目数据,很小,直接暴力遍历所有点走单源最短路 code #include<bits/stdc++.h> using namespace std; struct node { int x,val; bool operator<(const node&b) con
阅读全文
摘要:原题链接 题解 令 代表所有课的发布时间都小于等于x时的不愉快值之和,x越小,AB消耗越大,x越大,C消耗越大,所以感性的想象 是一个下凹函数 然后就可以快乐三分了 code #define ll unsigned long long #include<bits/
阅读全文
摘要:原题链接 题解 1.首先, 图像一定是 下凹的,怎么证明我也不知道,只是感觉是这样 2.既然是下凹的,那么一定有最小值,区间内找极大值/极小值可以用三分 B站有个视频直观地讲解了,一看便知 还有一些小细节,请看讨论区 code #include <bits/stdc++.h> usi
阅读全文
摘要:原题链接 题解 朝合力方向位移一段距离,并逐渐减小这个位移距离,需要痛苦的调参 code #include<bits/stdc++.h> using namespace std; double x=0,y=0; struct node { double x,y,w; }pos[1005]; int
阅读全文
摘要:原题链接 题解 1.筛一筛就行 code #include<bits/stdc++.h> using namespace std; int heshu[1000006]={0},f[1000007]={0}; int main() { int n,m; cin>>n>>m; for(long lon
阅读全文
摘要:原题链接 题解 正常暴力解法如下: #include<bits/stdc++.h> using namespace std; int a[150007]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; while(
阅读全文
摘要:原题链接 题解 一个细节坑我好久 code #include<bits/stdc++.h> #define ll long long using namespace std; ll f[15][15]={0};//从最高位第i位数字为j时的数字里有多少windy数 ll solve(ll now)
阅读全文
摘要:原题链接 题解 请看代码upperbound是为了找出最大的小于等于 code #include<bits/stdc++.h> using namespace std; int a[20]={0},sum[100005]={0},dp[1<<22]={0};//dp代表当前状态能买多少件商品,sum
阅读全文
摘要:原题链接 题解 模拟,遍历n个物品,一开始一个箱子不给,遍历到某个物品时,先把所有已经给了的箱子放进去试试,再创一个新箱子放进去试试 code #include<bits/stdc++.h> using namespace std; int n,w; int cnt,ans; int chongdi
阅读全文
摘要:原题链接 题解 二进制表示每包糖果包含的味道,因为有一种拼接的感觉,然后背包dp,注意这里每个材料不止只能取一个 code #include<bits/stdc++.h> using namespace std; int dp[1<<22]={0},candy[105]={0}; const int
阅读全文
摘要:原题链接 这真的是橙题吗 题解 读题,每个材料都有用或不用两种选择,然后n的数据范围也很小,所以考虑二进制dp (别管我为什么不叫状态压缩) 遍历 0 到 (十进制下),如果存在互相矛盾的1,代表这个状态不能用 code #include<bits/stdc++.h> usi
阅读全文
摘要:原题链接 题解 1.一眼数位dp, 康托是谁?不认识,在每一位确保小于的时候可以任意取 2.阶乘一开始就要放好 3.在遍历到后面几位的时候,可能前面几位用过了比x小的树,所以我们要知道小于x且没被用过的个数,这就是区间查询加单点修改,树状数组比较方便 4.树状数组的空间复杂度比较小,每个点就对应且只
阅读全文
摘要:原题链接 题解 1.搜索路径不等于欧拉路径,优先搜索字典序小的点,是为了找出终点,一个终点找到后,找下一个终点,所以不能边找边输出,要把遍历完的再放到栈里 code #include<bits/stdc++.h> using namespace std; int vis[100005]={0}; v
阅读全文
摘要:原题链接 题解 我一直苦苦思考为什么要建边,现在我明白了,如果令 代表离源点的最短路径长度的话,建边之后, 一定成立 只有当出现负环的时候说明条件出现了矛盾 太神了 为什么负环会出现矛盾? 简单认识一下,如果出现负环,代表每到一个点就至少有一条边的约束
阅读全文
摘要:原题链接 题解 然后就变成了求解同余方程 code #define ll long long #include<bits/stdc++.h> const ll mod=19260817; using namespace std; ll x,y; ll c; ll a,b; inline void r
阅读全文
摘要:原题链接 题解 1.Q是S的前缀 2.Q!=S 3.S是QQ的前缀,且S可以等于QQ 4.从S中挖掉Q后剩下的部分与Q(s)的前半部分重合,也就是公共前后缀 5.要让Q尽可能长,就要让公共前后缀尽可能短(非零) 细节请看代码 解答一些疑惑:为什么不能直接求最短公共前后缀,而是要先求最大公共前后缀?
阅读全文
摘要:原题链接 题解 1.任意两点间的异或和等于他们到根节点的异或和的异或,令每个点到根节点的异或值为 2.建立01字典树,塞入所有 然后遍历每个点,找出每个点异或最大对应的点 3.如何找?往当前 的每一位相反的方向移动 code #
阅读全文
摘要:原题链接 题解 由于题目能使 的 没有限制,所以我们反过来求能使其成立的x的范围 对于a,k二进制下的第i位,如果都为1,我们可以令此时的x在这一位也为一,然后i后面的位去什么都可以,然后x=0的时候也可能可以,就看后面有没有小于的 如果a为1,k为0,那么此时x
阅读全文
摘要:原题链接 题解 树上区间修改加单点查询,虽然可以树状数组,但是线段树更通用一点 然而线段树通常处理的是点权,可这里是边权,怎么办呢?我们可以把边权转换成点权,由于每个点的子边有若干个,但父边有且只有一个,这样我们就把边权变成边下方点的点权 然后区间修改和单点求和的时候把lca的点权删掉即可 code
阅读全文
摘要:原题链接 题解 dalao‘s blog 我自己的认识请看代码区 code #include<bits/stdc++.h> using namespace std; int n,Q,root,mod; int bigson[100005];//和自己在同一条链上的儿子节点 vector<int> G
阅读全文
摘要:原题链接 题解 树上只有两种颜色,我们把每种颜色的连通块记录下来,只有当路径两端的点属于同一连通块且颜色与朋友喜欢的不同时输出0 code #include<bits/stdc++.h> using namespace std; char s[100005]; int fa[100005]; int
阅读全文
摘要:原题链接 题解 1.这k个城市一定是连成一团在中间的 2.把树展开,变成散发图,剩下的n-k个城市一定在最边缘的位置 3.拓扑排序 dalao's blog code #include<bits/stdc++.h> using namespace std; vector<int> G[100005]
阅读全文
摘要:原题链接 题解 1.小模拟+树上差分+lca code #include<bits/stdc++.h> using namespace std; int a[300006]={0}; vector<int> G[300005]; int depth[500005]={0}; int fa[50000
阅读全文
摘要:原题链接 题解 1.修改树上某一段路径 ,最后问你单个点的最大值,很想区间修改,单点查询,且只查询一遍,所以我们往前缀和方向靠 2.一个节点只有一个父亲,所以从底到根的路径是一条链,我们可以在这里应用前缀和,标记策略为令 代表 节点到根节点这条链上所有
阅读全文
摘要:原题链接 题解 1.看到拼接,有种背包dp的感觉 所以方法1,暴力背包dp #include<bits/stdc++.h> using namespace std; int vis[200005]={0}; vector<string> a; int main() { strin
阅读全文
摘要:原题链接 题解 1.字符串集合map?但是无法做到字典序排序,所以是字典树 2.n<=3000,所以 而且本题的特殊性,即每个子串都要放进去,所以要在 一边遍历一边放 code #include<bits/stdc++.h> using namespace st
阅读全文