ACM-ICPC算法
这是ACM-ICPC算法笔记。
极地星辰
这个作者很懒,什么都没留下…
展开
-
Codeforces Round 893 (Div. 2) E1. Rollbacks (Easy Version)
总结:终于把这个E题过了,虽然比赛时没过,但也算差点top200呀2333记录一下赛后一小时内自主补E题,说明前面的题还是做得不够快呀2333。思路:单点更新+离线莫队区间查询区间不同数字个数+栈保留last_state。原创 2023-08-16 01:32:54 · 238 阅读 · 0 评论 -
Codeforces Round 892 (Div. 2) C. Another Permutation Problem 纯数学方法 思维题
【代码】Codeforces Round 892 (Div. 2) C. Another Permutation Problem 纯数学方法 思维题。原创 2023-08-13 01:04:46 · 607 阅读 · 0 评论 -
Codeforces Round 890 (Div. 2) supported by Constructor Institute C. To Become Max
【代码】【无标题】原创 2023-08-06 09:20:14 · 186 阅读 · 0 评论 -
Codeforces Round #785 (Div. 2) C. Palindrome Basis
C. Palindrome Basis题干略AC代码:#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <set>#include <map>#include <queue>#include <stack>#include <cstdio>#include <原创 2022-05-01 01:32:46 · 219 阅读 · 0 评论 -
L3-3 自然语言 (30 分)
今晚进行了天梯赛的赛前选拔比赛,其中的第15道题,最开始以为是要构建语法分析树,但简单想了想发现就是一个思维题。题解:略(请参考源代码,代码逻辑很清晰)源代码:#include <iostream>#include <algorithm>#include <string>#include <vector>#include <queue>#include <stack>#include <cstring>原创 2022-03-20 22:53:43 · 526 阅读 · 0 评论 -
Codeforces Round #697 (Div. 3) F题 Unusual Matrix 和 G题 Strange Beauty
F题:此题考查位运算,同样是一道思维题。//Dlove's template#include <iostream>#include <algorithm>#include <string>#include <cstdio>#include <cmath>#include <cstdlib>#include <cstring>#include <ctime>#include <map&g原创 2021-01-26 22:57:10 · 144 阅读 · 0 评论 -
Codeforces Round #697 (Div. 3) D题 Cleaning the Phone 和 E题 Advertising Agency
D题考察的是贪心,注意用快读,用cin超时。//Dlove's template#include <iostream>#include <algorithm>#include <string>#include <cstdio>#include <cmath>#include <cstdlib>#include <cstring>#include <ctime>#include <map&原创 2021-01-26 20:46:17 · 157 阅读 · 0 评论 -
Educational Codeforces Round 102 (Rated for Div. 2) D题 Program
这题就是把加号抽象成1,减号抽象成-1,记做数组a(1~n标号),然后求出数组a的前缀和数组为s。(s[0] = 0)然后对于区间[l,r],答案就是然后分别在前缀和数组s上对区间[0,l-1],[r+1,n]查询最小值,最大值,分别记为minl1,maxl1,minl2,maxl2。那么此时的答案就是 max(maxl1,maxl2)-min(minl1,minl2)+1。AC源码如下://Dlove's template#include <iostream>#include <原创 2021-01-15 01:12:02 · 680 阅读 · 0 评论 -
关于map的去重
我们知道map可以以键为依据去重排序。而去重方式有两种。多余键同值不同的pair。已知 map<int,int> mp;键值对为pair<x,y> ;如果用 mp.insert(make_pair(x,y))插入,则是对于同一个键而言,保留最早输入的值。而对于mp[x] = y插入,则是对同一个键而言,保留最晚输入的值,即键同值覆盖原则。上述两种插入方式去重方式是不一样的。...原创 2020-11-10 14:27:59 · 3606 阅读 · 0 评论 -
ST表解决RMQ问题
#include <iostream>#include <algorithm>#include <cmath>#include <cstdio>using namespace std;const int maxn = 21;int a[1<<maxn];int f[1<<maxn][maxn];int n;inline int read(){ int x = 0,f = 1;char ch = getchar();原创 2020-10-26 16:56:10 · 137 阅读 · 0 评论 -
Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree
考点:图论,数论。#include <iostream>#include <algorithm>#include <cstring>#include <vector>using namespace std;const int maxn = 100010;const long long mod = 1e9+7;long long p[maxn];vector<long long> v[maxn];long long vis[max原创 2020-08-22 00:43:40 · 292 阅读 · 0 评论 -
Codeforces Round #664 (Div. 2) C. Boboniu and Bit Operations(非DP方法)
我当时看得时候就觉得是DP,然而,我DP的水平和数学水平差远了。如果用DP做,肯定AC不了。所以果断决定,思考DP以外的方法。然后我通过数学知识:a&b <= min(a,b); a|b >= max(a,b)把&看成1的交集, | 看成1的并集。也可画文氏图参考。然后我就把这道DP题转化为思维题,构造出每个c[i]的值可见数学力量的强大。 #include <iostream> #include <algorithm> us原创 2020-08-13 09:25:38 · 210 阅读 · 0 评论 -
Codeforces Round #663 (Div. 2) C - Cyclic Permutations
Codeforces Round #663 (Div. 2) C - Cyclic Permutations题目链接:https://codeforces.com/contest/1391/problem/C满足条件的排列数等于总排列数-不满足条件的排列数。而不满足条件的排列数通过找规律:如n = 4时:不满足条件的排列有:1234432124311342342114322341一共八个,但可以分为4组。一位第1,2,第3,4,第5,6,第7,8个排列,分别是reverse的。那么原创 2020-08-10 10:46:42 · 203 阅读 · 0 评论 -
Codeforces Round #658 (Div. 2) C题
C1暴力可过#include <iostream>#include <algorithm>#include <string>using namespace std;const int maxn = 200010;int a[maxn];int main(){ int t; cin >> t; while(t--){ int n; cin >> n; string s1,s2; cin >> s1原创 2020-07-22 09:02:50 · 194 阅读 · 0 评论 -
Codeforces Round #657 (Div. 2) A - Acacius and String
这题就是暴力。暴力一定要有耐心,绝对不能慌。暴力不出来,换个方法暴力,还暴力不出来,说明基础不劳2333源码:#include <iostream>#include <algorithm>#include <string>using namespace std;string ss = "abacaba";int main(){ int t; cin >> t; while(t--){ int m; cin >> m;原创 2020-07-19 20:59:29 · 253 阅读 · 0 评论 -
Codeforces Round #657 (Div. 2) B题 Dubious Cyrpto
m是被除数,a是除数,n的商,b-c是余数。切记,考虑b-c是负数的情况。切记 !切记 !二话不说上代码:#include <iostream>#include <algorithm>using namespace std;int main(){ int t; cin >> t; while(t--){ long long l,r,m; cin >> l >> r >> m; long long a = l原创 2020-07-19 20:32:52 · 396 阅读 · 0 评论 -
欧拉定理与扩展欧拉定理
欧拉定理:若gcd(a,p)=1,则a^φ§≡1(mod p)欧拉定理特例:费马小定理:若p是质数,则对于任意整数a,有a^p≡a(mod p)。扩展欧拉定理:欧拉函数:对于一个正整数n,小于等于n且和n互质的正整数(包括1)的个数,记作φ(n) 。通式:φ(n)=n*(1-1/p1) * (1-1/p2) * (1-1/p3) * (1-1/p4) * …… * (1-1/pn), 其中p1, p2……pn为n的所有质因数,n是不为0的整数。记 φ(1)=1(唯一和1互质的数就是1本身)。欧原创 2020-07-19 12:30:49 · 483 阅读 · 2 评论 -
快速幂加指数分解
例:a ^123456789%mod = a ^(1e8 * 1 )%mod * a ^(1e7 * 2 )%mod * a ^(1e6 * 3 )%mod * a ^(1e5 * 4 )%mod * a ^(1e4 * 5 )%mod * a ^(1e 3 * 6 )%mod * a ^(1e2 * 7 )%mod * a ^(1e1 * 8 )%mod * a ^(1e0 * 9 )%mod若a的指数极大则可用字符串存储:由此核心代码如下:快速幂:int mod;long long原创 2020-07-19 11:41:13 · 236 阅读 · 0 评论 -
裴蜀定理与扩展欧几里德算法
裴蜀定理又称贝祖定理:对于给定的正整数a,b,方程ax+by=c有解的充要条件为c是gcd(a,b)的整数倍。裴蜀定理的推广:方程ax+by+cz+…+nm=f(其中a,b,c…n,f为整数)有解的充要条件是f为gcd(a,b,c,…,n)的整数倍。裴蜀定理的应用:给定一个序列{an},寻找一个整数序列{bn}使得a1b1+a2b2+…+an*bn值最小(要求最小值为正数),求这个最小值。解:根据裴蜀定理的推广,原式最小值即为gcd(a1,a2…an)。扩展欧几里德算法是为求解裴蜀定理服务的。即通原创 2020-07-19 10:26:07 · 467 阅读 · 0 评论 -
字符串前缀子串与后缀子串
若字符串为“abcde”,则删除字符串c即为"ab"+"de"那么"ab"即为字符串"abcde"的前缀子串,"de"即为字符串"abcde"的后缀子串。由此,我们可以得到,一个字符串删除一定连续字符后得到的新串,可以用该字符串的前缀子串和后缀子串拼接得到。仅以此为例,表述一种算法思维。...原创 2020-07-16 22:55:19 · 3351 阅读 · 1 评论 -
洛谷P2485 [SDOI2011]计算器
case 1 :快速幂取模 ;case 2:exgcd求乘法逆元,注意y%p的逆元存在条件为gcd(y,p) = 1 ,即y 与 p 互质;case 3:扩展BSGS 。源码:#include <iostream>#include <algorithm>#include <map>#include <cmath>using namespace std;long long t,k;long long y,z,p;long long po原创 2020-07-14 11:37:41 · 206 阅读 · 0 评论 -
BSGS
给定一个质数 p,以及一个整数 b,一个整数 n,现在要求你计算一个最小的 x,满足 y ^x ≡n(modp)。思路 :设 x = am-b, 那么原式可化为 : y ^am ≡ny ^b(modp) 。那么 0 <= b <= m-1 , 1 <= a <= m+1 。复杂度为 max(m,p/m), 所以当 m = sqrt§ 时复杂度最低。所以我们令 m = sqrt§ 。#include <iostream>#include <algorithm原创 2020-07-14 10:30:39 · 237 阅读 · 0 评论 -
洛谷 P5329 [SNOI2019]字符串
暴力是过不了的,哈希也不行。只能找规律。我们可以发现计删除原串第i的字符后的新串为pi,则任意pi与pi+1(i<m,m为原串长度)相比较,至多只有一个字符不同,而这一个不同的字符则恰恰是比较pi与pi+1的字典序的依据。源码如下:#include <iostream>#include <algorithm>#include <list>#include <string>using namespace std;const int maxn原创 2020-07-13 13:19:48 · 220 阅读 · 0 评论 -
蒜头君的数轴:正反gcd
题目:蒜头君的数轴今天蒜头君拿到了一个数轴,上边有 nnn 个点,但是蒜头君嫌这根数轴不够优美,想要通过加一些点让它变优美,所谓优美是指考虑相邻两个点的距离,最多只有一对点的距离与其它的不同。蒜头君想知道,他最少需要加多少个点使这个数轴变优美。输入格式输入第一行为一个整数 n(1≤n≤105)n(1 \leq n \leq 10^5)n(1≤n≤105),表示数轴上的点数。第二行为 nnn 个不重复的整数 x1,x2,…,xn(−109≤xi≤109)x_1,x_2,…,x_n(-10^9 \le原创 2020-07-09 13:54:47 · 242 阅读 · 0 评论 -
求数组所有元素的最大公因数
利用优先级队列。int get_gcd(){ priority_queue<int, vector<int>, greater<int>> q; for(int i = 0;i<n;i++){ q.push(b[i]); } int maxl = 1; while(1){ int flag = 0; priority_queue<int, vector<int>, greater<int> > p; w原创 2020-07-09 13:27:59 · 1668 阅读 · 0 评论 -
线性求乘法逆元
用于求一连串数字对于一个 mod p的逆元。如果只是求一个数的逆元建议使用费马小定理或扩展欧几里德定理。线性算法求逆元的原理:已知, (1/1)≡1 (mod p) , 设 p=k∗i+r,(1<r<i<p) , 即k 是 p/i的商 , r 是 p/i 的余数。即 k∗i+r≡0 (mod p)。 ≡左右两边同时乘上(1/i)*(1/r) , 即 k * (1/r) + (1/i) ≡0 (modp) 。移项可得 , (1/i) ≡ - k * (1/r) (mod p)原创 2020-07-07 09:47:31 · 1467 阅读 · 2 评论 -
Codeforces Global Round 9 - E - Inversion SwapSort
求逆序数,并利用STL的multimap快速进行数据处理。本题就是一个观察样例找规律题。我们只需要用合适的方式把这种规律描述出来即可。规律为:m的个数即为原序列逆序数对个数。然后将这些逆序数按照cmp顺序输出。cmp:若逆序对下标的pair为(i, j),则在原序列a中,a[i]小的优先输出,若a[i]相同,则比较 j ,j 大者先输出。即 :const int maxn = 1010;int a[maxn];typedef pair<int,int> P;bool cmp(P原创 2020-07-05 10:34:54 · 610 阅读 · 0 评论 -
Codeforces Global Round 9 D Replace by MEX
一定注意数组范围,不然会被Hack。a,s数组可以只开1010。而数组b一定是要开2010,开1010是不够的,会被Hack。我这方便起见,全部开为2010。这就一个找规律的题。先找规律,再随机分配。#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int maxn = 2010;int a[maxn];int b[maxn];int s原创 2020-07-05 08:16:29 · 126 阅读 · 0 评论 -
快速判断1e4以内正整数是否为素数
理论基础:一个合数一定有一个素因子 <= sqrt(n) 。证明:一个合数n肯定有素因子,并且在[2,n-1]上。若有一个素因子x大于等于sqrt(n),就必然有一个因子n/x小于等于sqrt(n),而n/x必有一个素因子小于等于sqrt(n) ,而n/x的素因子也是n的素因子。已知:n <= 1e4。代码如下:#include <iostream>#include <algorithm>#include <cmath>using namesp原创 2020-07-03 22:12:35 · 264 阅读 · 0 评论 -
旅游规划 (25分)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。dijkstra算法:#include <iostream>#include <algorithm>#include <vector>#include <queue>using namespace std;const int I...原创 2020-08-03 16:52:39 · 822 阅读 · 0 评论 -
Codeforces Round #654 (Div.2)E1 Asterism
#include <iostream>#include <algorithm>#include <vector>using namespace std;const int maxn = 100010;long long a[maxn];vector<long long> v;long long n,p;long long f(long long x){ long long ans = 1; long long r = n; for(lo原创 2020-07-02 14:54:34 · 229 阅读 · 0 评论 -
素数与素数筛
普通素数判断#include <iostream>#include <algorithm>#include <cmath>using namespace std;int main(){ int n; cin >> n; if(n == 2){ cout << "Yes" << endl; return 0; } if(n%2 == 0||n <= 1){ cout << "NO" &原创 2020-06-30 10:57:30 · 113 阅读 · 0 评论 -
Codeforces Round #652 (Div. 2) D题
原题链接:https://codeforces.com/contest/1369/problem/D思路:树形DP源码:#include <iostream>#include <algorithm>using namespace std;const int mod = 1e9+7;const int maxn = 2000010;long long dp[maxn][2] = {0};void init(){ for(long long i = 3;i<m原创 2020-06-24 00:58:59 · 1226 阅读 · 0 评论 -
原来乘法还可以这样算。
欢迎大家关注我的个人公众号,代码实战。原文在公众号里面。https://mp.weixin.qq.com/s?__biz=MzI5MzE2Mjc5MQ==&mid=2247483665&idx=1&sn=f97e438343f78190caeb933d62f35565&chksm=ec771b59db00924f983589aec6b0d90ce48a7460a34eb041fe42ed3fa4103c5aa574195d9387&token=1328605126&原创 2020-06-01 13:41:43 · 527 阅读 · 0 评论