
ACM
算法学习记录
善良的大铁牛
方向AIDD 请指教
展开
-
D1. Xor-Subsequence (easy version) DP优化
D1. Xor-Subsequence (easy version)原创 2022-10-24 20:27:21 · 403 阅读 · 1 评论 -
POJ 2828 Buy Tickets 两种写法(线段树、树状数组上二分)
POJ 2828 Buy Tickets 两种写法(线段树、树状数组上二分)插队的问题,每个案例给出 n ,代表有 n 个插队的,每个给出 p, v,意思是代号为 v 的人插在了第 p 个人的后面,问最后的队伍的排列。 一开始的队列是空的,如果输入i,j:代表代号为 j 的人插在代号为 i 的人的后面,也就是说他前面一定有了 i 个人,而他是第 i + 1 个人。......原创 2022-08-05 00:23:49 · 234 阅读 · 0 评论 -
c++ string.size()函数小坑坑
s.size()函数返回值的实际类型是string::size_type,该类型是一个无符号整型数。在表达式中混用unsigned int与int可能产生意想不到的结果。 例如s.size()-3,由于s.size()返回无符号数,故当s.size()原创 2022-08-03 00:20:52 · 2374 阅读 · 1 评论 -
Codeforces Round #810 (Div. 2) 三题下班
Codeforces Round #810 (Div. 2)给定一个n,找每个i/pi为整数的个数最小的那个排列。例如2143,个数为1,只有2/1得到的是整数。然而特殊情况也恰好是最小为1。原创 2022-07-25 18:02:05 · 233 阅读 · 0 评论 -
A - Digit Sum of 2x
A - Digit Sum of 2x / Time Limit: 2 sec / Memory Limit: 1024 MBScore : 300 pointsProblem StatementFor a positive integer x, let f(x) be the sum of its digit. For example, f(144)=1+4+4=9 and f(1)=1.You are given a positive integer N. Find the follo原创 2022-07-22 22:26:38 · 242 阅读 · 0 评论 -
【The 2021 CCPC Guilin】G - Occupy the Cities
【The 2021 CCPC Guilin】G - Occupy the Cities给定一个长度为n的01数列。对于每轮操作,如果一个位置上为1,那么其可以将相邻的最多一个位置上的0变成1。问,将所有0都变成1至少需要多少轮操作?原创 2022-07-21 22:33:43 · 411 阅读 · 0 评论 -
F - Find 4-cycle 【AtCoder Beginner Contest 260】
F - Find 4-cycle 【AtCoder Beginner Contest 260】给定一个二分图,其包含了S、T两个独立点集(即S、T各自内部间的任意两点之间不存在边),再给出S到T图中的M条无向边(S中的点与T中的点之间的边)。求图中包含的一个四元环,若存在则输出环中包含的顶点,否则输出-1。...原创 2022-07-21 20:21:21 · 211 阅读 · 0 评论 -
矩阵快速幂求斐波那契数列
矩阵快速幂求斐波那契数列原创 2022-07-20 22:23:38 · 161 阅读 · 0 评论 -
F - Main Street【 AtCoder Beginner Contest 258】
AtCoder Beginner Contest 258 F - Main Street原创 2022-07-19 22:17:44 · 227 阅读 · 0 评论 -
CodeCraft-22 and Codeforces Round #795 (Div. 2)
CodeCraft-22 and Codeforces Round #795 (Div. 2)A. Beat The OddsB. Shoe ShufflingC. Sum of SubstringsD. Max GEQ Sum原创 2022-06-01 23:22:38 · 358 阅读 · 0 评论 -
【扫描线+树状数组或者线段树】Codeforces Round #665 (Div. 2) E - Divide Square
【扫描线+树状数组或者线段树】Codeforces Round #665 (Div. 2) E - Divide Square原创 2022-05-16 00:36:11 · 368 阅读 · 0 评论 -
JWT实践总结篇222222222222222222222
JWT实践总结篇(一)我的实践JWT总结JWT的特点从特点中看优点从特点中找缺点同session形式对比session机制缺点结语近期使用token的机制来实现用户鉴权是越来越流行了,最近公司这类的项目也是超多。因此就把以前学过的JWT捡起来,特此贴出博客分享我的总结,也是为了方便温习。我的实践在项目中使用JWT的话,通常我会引用auth0,基于auth0编写一个工具类;工具类普遍编写两个方法,那就是创建JWT token和解码(认证)JWT token。auth0用来生成和校验token,底层一定原创 2022-05-04 00:05:41 · 475 阅读 · 0 评论 -
codeforces B. pSort
B. pSort做法:判断连通性,并查集、图论并查集#include <iostream>using namespace std;static const int N = 110;int p[N];int seq[N], d[N];int n;void init(){ for (int i = 1; i <= n; i++) p[i] = i;}int find(int x){ if (p[x] != x) p[x]原创 2022-05-04 00:01:36 · 187 阅读 · 0 评论 -
线段树上二分
线段树上二分原创 2022-04-26 09:21:35 · 1165 阅读 · 2 评论 -
codeforces 1263E - Editor 线段树
Editor 线段树把 ( 记为1,把 ) 记为-1所以:1、找最大括号的匹配深度计算最大前缀和就行了2、判断修改当前位置之后是否能够完美匹配括号 需要判断两个条件:(1) 总体前缀和是否为0(2) 判断最小前缀和是不是负的,如果最小前缀和出现负的那么说明左右括号位置反了#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int a[N];int n, q;struct info{原创 2022-04-24 20:41:32 · 221 阅读 · 0 评论 -
C语言隐式转换的陷阱
C语言隐式转换的陷阱当使用unsigned类型和signed类型进行运算时,有符号的类型会自动转换为unsigned,这在进行条件判断的时候结果会让人匪夷所思。比如下面的例子:int main(void){ unsigned int size = 10; if(size > -1) printf("AAA"); else printf("BB");}看的快了会认为输出AAA,但是这个结果是输出BB,因为-1会自动转换为unsigned,转换后比size=10要大。原创 2022-04-13 21:41:47 · 661 阅读 · 0 评论 -
AtCoder Beginner Contest 174
F - Range Set Query树状数组+离线处理AtCoder Beginner Contest 174原创 2022-04-10 23:56:10 · 646 阅读 · 0 评论 -
树状数组+离散化求逆序对
树状数组+离散化求逆序对求逆序对是一个静态的问题,我们需要将静态转化为动态。即一边插入一边统计逆序对的个数。每一次把一个新的a[i]放入的时候,通过树状数组查询出已经存在的数中比它大的数的个数,并且可以肯定这些比它大的数一定是在a[i]前面的,一定构成逆序对。所以树状数组是用来统计每个数出现的次数。两个公式i - query(a[i]) 可以得到比a[i]大的数的个数。query(a[i]) - mp[a[i]] 可以得到比a[i]小的个数。 这里mp[a[i]]表示离散化之后a[i]有几个。代码原创 2022-04-10 10:01:22 · 315 阅读 · 0 评论 -
树状数组上二分
#include <bits/stdc++.h>using namespace std;const int N = 5e5 + 10;#define int long longint n,q;int c[N], a[N];int query(int x){ int pos = 0, t = 0; // 就是二分的过程 // 先从高位开始取,如果当前这一位可以取,那么就考虑下一位是取1还是0 // 到最后找到的就是最大的那个pos并且对应的<原创 2022-04-06 10:49:23 · 951 阅读 · 1 评论 -
C. Jury Meeting (Educational Codeforces Round 113)
C. Jury Meeting题意n个人,个人都有ai个事件要说,当轮到某个人的时候,如果他现在有需要说的事,那就给他的ai减1,如果没有需要说的了,就往下轮,直到所有人都说完了,这过程中不能同一个人说两次思路三种情况1、当最大值的数存在两个的时候,结果为n!,任意排列2、当最大值-1这个数不存在的时候 结果为03、当最大值与最大值-1都存在,符合答案的情况是最大值在至少一个次大值前面怎么计算第三种情况?让全部情况数即n! 减 最大值在最后的情况。最大值和次大值以外的数的顺序无所谓,不需原创 2022-04-03 14:17:50 · 425 阅读 · 0 评论 -
B. And It‘s Non-Zero
B. And It’s Non-Zero题意给出l~r区间,区间内所有数都存在。问最少删除几个数,保证剩下的所有数按位与后不为0。思路我们寻找每一位上1的个数,找到1个数最多的那一位,把这一位上为0的数都去掉,剩下的所有数在这一位都是1,按位与之后一定不是0。起初使用log和lowbit求每一位上的1的个数,但是发现每次询问都需要重新lowbit,时间复杂度太高,WA3.下边TLE代码:#include <bits/stdc++.h> using namespace std;原创 2022-03-30 21:02:13 · 448 阅读 · 0 评论 -
D Polynomial division AtCoder Beginner Contest 245
AtCoder Beginner Contest 245 c++模拟长除法原创 2022-03-29 08:28:18 · 225 阅读 · 0 评论 -
356A - Knight Tournament 【并查集】
356A - Knight Tournament 【并查集】题意题目的意思是说有n个人参加比赛,共有m场比赛,每场比赛给出l,r,x,表示[l,r]区间内的人都被x打败,问最后每个人是被谁打败的,输出那个人的编号,冠军输出0.思路可以看出如果这个人已经输掉了,那么之后他就不会被更新了。最暴力的是不使用并查集,直接暴力枚举每一次的lr肯定是会TLE的。但是使用并查集可以直接跳过一段拥有相同父节点的区间,但是需要额外开一个ans数组记录答案,因为pre[]祖宗数组需要用来合并。要点1、自己不能跟自原创 2022-03-26 20:26:15 · 283 阅读 · 0 评论 -
A. Good Pairs
A. Good Pairs在数组中找两个数 ai, aj,使得对所有的k(1<=k<=n),|ai-ak|+|ak-aj|=|ai-aj|成立思路有不等式|a-c|+|c-b|≥|a-b|,当且仅当a>c>b时,等号成立。证明:将绝对值去掉,a-c+c-b == a-b,证毕。也可以将a、b、c看做坐标轴上的点。代码#include<bits/stdc++.h> using namespace std; int main() { int t; cin >原创 2022-03-25 08:29:24 · 432 阅读 · 0 评论 -
B - Integral Array
codeforces B - Integral Array原创 2022-03-18 21:28:31 · 596 阅读 · 0 评论 -
1620E - Replace the Numbers 思维题
当输入操作2时,将i改变为j的操作只对当前操作之前的数起作用所以我们可以选择反向遍历一遍原来的数组新开一个数组p表示当前某个值的更改后的值如原先p[5] = 5, 但是在操作2 5 3之后, p[5] = 3#include <iostream>#include <cstring>#include <set>#include <algorithm>#include <cmath>#include <map>#inc原创 2022-03-16 20:45:21 · 469 阅读 · 0 评论 -
A. Great Sequence
题意:长度为n的数组,需要数组里所有数成两两一对,满足a * x = p 的关系,求最少需要添加多少个数,才能满足这个条件。思路:整体看来就是将数组内能成对的个数先减掉,剩下的个数就是要添加的数的个数。#include <iostream>#include <cstring>#include <set>#include <algorithm>#include <cmath>#include <map>#include原创 2022-03-16 19:57:42 · 507 阅读 · 0 评论 -
D. Make Them Equal
D. Make Them Equal【题目大意】你有一个长度为 nn,初始全为 1 的数组 a,和两个长度为 n 的数组 b,c。你可以最多进行 k次如下的操作:选择两个正整数 i,x,使ai变成(ai+ai/x),下取整。最后如果ai = bi,就可以获得ci的收益。要求最大化收益。这题是一个预处理的01背包。难在预处理上。起初我的代码是每次让a*=2,算出每个a的最小操作次数,再使用01背包获得最大收益,但写完发现比如数字31,如果从6开始以2倍增,那么增加到24时,与31相差7, 但这时24除原创 2022-03-15 14:40:56 · 609 阅读 · 0 评论 -
D - Vupsen, Pupsen and 0
D - Vupsen, Pupsen and 0原创 2021-12-30 22:40:26 · 570 阅读 · 0 评论 -
C - Zero XOR
AtCoder Regular Contest 131C - Zero XOR什么时候可以赢?当一个数等于当前所有数异或时。取出这个数,剩下所有数异或就为0.因为:1110101100 异或 = 10001 相同0不同1. 一个数异或0还是本身那么结束游戏有两种情况:1、当N为奇数时,先手总能胜。选手可以在本局直接赢,或者在第k-2局 例如 7 5 3 1局赢2、当N为偶数时,先手必须一把赢,否则对方将面临奇数个饼干,对方一定胜。先手一把赢的条件就是数列中存在一个数与所有数的异或相同。原创 2021-12-30 21:52:58 · 2328 阅读 · 0 评论 -
字符串哈希(c++)
什么是字符串Hashhash, 其实就是将一个东一映射成另一个东西, 类似Map的键值对.那么字符串Hash, 其实就是: 构造一个数字使之唯一代表一个字符串. 但是为了将映射关系进行一一对应, 也就是, 一个字符串对应一个数字, 反之一个数字也对应一个字符串.用字符串Hash的目的是: 如果我们要比较一个字符串, 我们不直接比较字符串, 而是比较它们对应映射的数字, 这样子就知道两个"子串"是否相等. 从而达到子串的Hash值的时间为O(1), 进而可以利用"空间换时间"来节省时间复杂度.我们希望原创 2021-10-26 21:14:07 · 3498 阅读 · 0 评论 -
Dijkstra 最短路
Dijkstra算法求最短路伪代码 1. dist[1] = 0, dist[i] = 无穷大 // 初始化距离 2. for i : 0~n: 3. t <-- 还没有确定的点中最小的 4. s <-- t 确定t点 5. 用t来更新可到达点的距离 (if dist[j] > dist[t] + g[t][j])朴素版题目给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出 1 号点到 n 号点的最短距离,如果无法从原创 2021-10-20 10:59:38 · 95 阅读 · 0 评论 -
拓扑排序
拓扑排序思路在一个有向图中,对所有的节点进行排序,要求没有一个节点能指向它前面的节点.先统计所有点的入度,对于入度为0的节点分离出来(压入队列),然后把这个节点指向的节点入度减1.同时如果被指向的节点入度变为0,将其压入队列.一直循环该操作,直到所有点都被分离出来. 如果最后不存在入度为0的点,说明有环,不存在拓扑序.代码int e[N],ne[N],h[N],idx;int d[N],cnt,top[N];queue<int> q;// 先把所有入度为0的点压原创 2021-10-20 10:27:03 · 84 阅读 · 0 评论 -
树与图的存储和遍历
树与图的存储和遍历存储树是一种特殊的图,与图的存储方式相同.对于无向图中的边ab,存储两条有向边a->b b->a因此只考虑有向图的存储.邻接矩阵 g[a][b] == 边a --> b邻接表: 就是二维的单链表int h[N],e[N],ne[N],idx; // 添加一条边 void add(int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx++; } // 初始化时 idx = 0原创 2021-10-20 10:08:49 · 158 阅读 · 0 评论 -
N台阶M步爬楼梯问题
N台阶M步爬楼梯问题递归#include <iostream>using namespace std;// 总台阶数、最大步数int solve(int n, int m){ int res = 0; // 总台阶为0时终止循环 if (n == 0) return 1; if (n >= m) { for (int i = 1; i <= m; i++) {原创 2021-10-13 21:41:01 · 441 阅读 · 1 评论 -
质数相关。
质数判断一 暴力直接从2开始循环到n,如果n可以整除某个数,那么说明n不是质数。#include <iostream>using namespace std;int main(){ int n; cin >>n; for(int i = 2;i<=n;i++) { if(n % i == 0) { cout << "不是质数"; return 0; } } cout << "是质数"; return 0原创 2021-10-13 19:46:27 · 104 阅读 · 0 评论 -
2021-09-26
C++遍历setset<int> st;st.insert(1);st.insert(2);st.insert(3);set<int> :: iterator it = st.begin();while(it != st.end()){ cout << *it <<endl; it ++;}原创 2021-09-26 19:31:59 · 83 阅读 · 0 评论 -
希尔排序c/c++
希尔排序算法理解希尔排序是对插入排序的一种优化,又叫做“缩小增量排序”。希尔排序是把序列中元素按照下标的一定增量值进行分组,对每个分组分别进行插入排序,并且不断缩小增量,直到增量为1.思路一共三层循环:增量我们取元素个数的二分之一,并一直以/=2迭代,直到增量为1。(最外层)和插入排序一样,从后往前比较,初始从下标为增量的那个数开始。(中间层)从后往前比较但不一定是相邻两个,比较的数位置相差一个增量,并且这个数必须大于等于增量。(三层循环)代码实现...原创 2021-08-30 17:07:21 · 143 阅读 · 0 评论 -
选择排序算法 c/c++
选择排序算法选择排序就是从待排序的数列中取出最小(或最大),与待排序的序列首元素进行交换位置,依次缩小待排序数列的范围。时间复杂度:。... ...代码实现代码实现时标记的是数的下标。 //选择排序 for (int i = 0; i < len -1; i++) //少执行一次,最后无序数组剩下一个时 已经是全部有序了 { int min = i; for (int j = i+1; j <...原创 2021-08-27 17:18:04 · 252 阅读 · 0 评论 -
插入排序算法
选择排序算法思路首先将数列看成有序(左)和无序(右)的两部分:因为左侧只有一个元素,那我们将其看作有序。之后的操作是从右侧无序的数列中,取出相邻的那一位,倒着和左边有序数列一一比较,如果小于当前比较的值,则交换位置。代码实现关键在于外层循环的i从1开始,因为左侧1个数我们认为他是有序的。内层循环条件是j>0,否则会有边界问题。 int q[6] = {8, 7, 6, 9, 5, 3}; for (int i = 1; i < 6; i++) {原创 2021-08-27 16:13:38 · 186 阅读 · 0 评论