![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
acm算法学习
钟钟终
知耻而后勇,脚踏实地
展开
-
省赛复习(1)
manacher算法I. Barbecue思路想的差不多了,肯定没错。但是代码总超时,无语了。#include<bits/stdc++.h>#define ll long longusing namespace std;const int N=4e6+5;int n,q,p[N];char s1[N],s2[N];void manacher(){ int len=1; s2[0]='@';s2[1]='#'; for(int i=0;i<n;i+原创 2022-05-15 20:39:55 · 211 阅读 · 0 评论 -
2022/5/13
H2. Maximum Crossings (Hard Version)树状数组,刚开始没有想到。简易版暴力就能过,求在i前面小于等于a[i]的和,熟悉树状数组,一下就能想到是求逆序对。树状数组:带有部分前缀和的数组。重点复习!!!#include<bits/stdc++.h>#define ll long longusing namespace std;const int N=2e5+5;int n,a[N],ans;int main(){ std::ios::sy原创 2022-05-13 23:44:40 · 140 阅读 · 0 评论 -
2022/5/12
农田划分2的n次方比2的1到n-1的累加和都要大2,因此只需要把2的n次方给大儿子就行;其他的都给小儿子,凡是祖先是n-1的土地都分给A代码还是有个小问题,如果并查集的祖先没合并到n-1,合并到其他点去了,就错了。#include<bitsdc++.h>#define ll long longusing namespace std;const int N=1e6+5;int n,m,f[N];bool vis[N];int r_find(int r){ if(f[r]原创 2022-05-12 23:10:33 · 135 阅读 · 0 评论 -
#789 (Div. 2) B~C
明天补DEB1. Tokitsukaze and Good 01-String (easy version)一看到字符串还要求最小变换次数,总会想到dp,然后就觉得做不出来。本题要求所有连续的段为偶数,则很容易想到若是一段长为奇数,那么肯定会有一个字符要变动。eg:0110最直接的想将连续段周围的奇数段个跳出一个字符变化。思路:从头遍历到尾,步长为2,若两个字符不等,则累计加1。#include<bits/stdc++.h>#define ll long longusing na原创 2022-05-11 22:17:52 · 151 阅读 · 1 评论 -
思维题 (C~E)
https://codeforces.com/contest/1675C. Detective Task找第一个0和最后一个1 然后讨论下稍微卡住我的是没有0全是1得情况,答案为cout<<s.size()-k2<<endl;,最后一个1后面的问好也要算进去,所以不是1.#include<bits/stdc++.h>#define ll long longusing namespace std;int main(){ int t;cin>&原创 2022-05-09 23:14:35 · 324 阅读 · 0 评论 -
最短路+并查集
Collision刚开始就想到是个树,但最短距离都出来了,自然想到最短路,但每次建图确实会超时;这时就要用到树的性质,根节点可到达任意节点,因此根到两个结点的距离分别为a和b,结果就为a+b-2*a#include <bits/stdc++.h>#define int long longusing namespace std;const int N=1e6+5;const int inf=0x3f3f3f3f;const int mod=1e9+7;int n,m,head[N]原创 2022-05-07 00:46:01 · 509 阅读 · 0 评论 -
差分约束+概率(趋向无穷大)
P1291 [SHOI2002]百事世界杯之旅输出格式太麻烦了,要注意的细节比较多。一道极限的概率题,要使用一点dp的思想。假设现在推到了f(n,k),我们再买一瓶饮料,有两种可能性,一种是:我们买到了我们没有拥有的球员,那么剩下的子问题就是f(n,k-1);如果买到了我们拥有的球员,那么剩下的子问题就是f(n,k)。题解详细推导过程,虽然有点难理解添加链接描述的可能性买到我们已经有的。所以这道题目的递推是就是:#include<bits/stdc++.h>#define原创 2022-05-05 23:30:35 · 133 阅读 · 0 评论 -
并查集+组合数学
A. Bear and Friendship Condition并查集:每个集合的个数,如果集合若是有向强连通分量,则集合内边数必须满足n*(n-1)/2#include <bits/stdc++.h>#define int long longusing namespace std;const int N=2e5+5;const int mod=1e9+7;int f[N],n,m,ans,sz[N];int r_find(int r){ if(r==f[r])原创 2022-05-04 23:13:18 · 309 阅读 · 0 评论 -
完全背包+数学思维
C. Palindrome Basis先将所有回文整数预处理出来,然后可看作完全背包。f[j]表示组成n的方案数状态转移方程: f[j]=(f[j]+f[j-a[i]])%mod;#include <bits/stdc++.h>#define ll long longusing namespace std;const ll mod=1e9+7;const int N=4005;int a[N],f[N],cnt;int check(int x){ int b[10]原创 2022-05-02 20:55:43 · 422 阅读 · 0 评论 -
数学取余+期望+思维
Hotpot这题思路还是挺清晰的,反正我能想到。但是代码敲起来很费劲,需要慢慢调出来,编码能力还是太弱。#include <bits/stdc++.h>#define ll long longusing namespace std;const int N=1e5+5;int n,k,m;struct node{ int a,x;}e[N];int vis[N];int main(){ int t;cin>>t; while(t--)原创 2022-05-01 21:44:40 · 214 阅读 · 1 评论 -
多源bfs Spicy Restaurant
Spicy Restaurant多源bfs+一个递推做了好多题,这道题算做的比较少的题。#include <bits/stdc++.h>using namespace std;int n,m,q,cnt,head[200005],w[100005],inf,dis[100005][105];struct node{ int to,nxt;}e[200005];void add(int u,int v){ e[++cnt].to=v; e[cnt].原创 2022-05-01 14:22:13 · 275 阅读 · 0 评论 -
4/26 广搜+思维题+拓扑
P3243 [HNOI2015]菜肴制作应该很能看出是个拓扑排序,每道菜肴都有约束条件。#include <bits/stdc++.h>using namespace std;const int maxn=1e5+5;int n,m,p,c[maxn],u,cnt,in[maxn],head[maxn],ans[maxn],g;bool vis[maxn],flag;priority_queue<int>q;struct node{ int to,nxt;原创 2022-04-27 00:20:32 · 1839 阅读 · 0 评论 -
省赛倒计时13天
众所周知:Tarjan算法是解决强连通分量和缩点的常见方法。P2835 刻录光盘分析各个数组的作用:dfn:该点第几次被遍历到low:该点及其子树最早被遍历到的次序号。inq:改点是否在栈中bl:改点属于第几个强连通分量sz:该强连通分量中包含几个点in:强连通分量中的入读关系,若为0则说明该分量并没有被其他分量指向。#include <bits/stdc++.h>using namespace std;const int N=6e5+5;int head[N],nxt[原创 2022-04-25 23:27:50 · 346 阅读 · 0 评论 -
4/24 tarjin+差分约束
P1993 小 K 的农场注意建图的方式,共有三种情况:1.a-b>=c,2.a-b<=c3.a==c需要统一格式,如果都是">=",就要跑最长路;相反,若是小于等于,就是最短路。建图时由减数指向被减数,即为b指向a。#include <bits/stdc++.h>using namespace std;const int maxn=2e5+5;const int inf=0x3f3f3f3f;int n,m,head[maxn],cnt,dist[ma原创 2022-04-24 21:39:58 · 143 阅读 · 0 评论 -
4/23 18届浙江省赛
--------------------省赛入口------------------------String Freshman对于子串T,去匹配S的时候,若出现字母被重复利用,那么匹配S得到的答案肯定是错的;只有当子串T的字母都不和首字母相同时,匹配主串时才能相同。另一种思路:用kmp算法求子串的最长公共前后缀。#include <bits/stdc++.h>using namespace std;int m,p[100005];char s[100005];void pr原创 2022-04-23 20:34:48 · 565 阅读 · 0 评论 -
4/21 昆明赛补题+数学
D Divisions其实当时已经向的差不多了,已经想出要构造一个不递减序列,也看出了n个连续相同数只能构造出2的n次方-1个方案,没ac有两个地方没做好:1.思路不够清晰,应该将1拿出来特判,将空集那种情况算进去,就只需要构造k-2中情况。2.剩下的k-2中情况用二进制表示,单独拿出一个数+一组连续的数来满足二进制中的1。#include <bits/stdc++.h>using namespace std;int k;int main(){ cin>>原创 2022-04-21 22:25:16 · 375 阅读 · 0 评论 -
4/18 数学+思维
P1495 【模板】中国剩余定理(CRT)/曹冲养猪一定别忘记加引用!!服了#include <bits/stdc++.h>#define ll long longusing namespace std;const int N=1e5+5;ll n,a[15],b[15];ll ex_gcd(ll a,ll b,ll &x,ll &y){ if(b==0) { x=1,y=0;return a; } ll d=ex.原创 2022-04-18 23:44:31 · 174 阅读 · 0 评论 -
4/16 省赛补题
B. cocktail with hearthstonedefine int long long还是慎用,回应影响评测思路:#include <bits/stdc++.h>#define ll long longusing namespace std;const int N =4e5+10;const int mod=1e9+7;int n,m,q;ll jc[N];ll pw(ll x,ll y){ ll res=1; while(y) {原创 2022-04-16 21:00:50 · 267 阅读 · 0 评论 -
4/14 二分答案+数学
P3853 [TJOI2007]路标设置二分答案。放路标时两个路标间为了满足给定的空旷系数要放多个路标,当能整除时得减去一个,因为系数正好为x。#include<bits/stdc++.h>#define int long longusing namespace std;const int N=2e5+5;const int inf=0x3f3f3f3f;int len,n,k,l,r,a[N],ans;bool check(int x){ int num=0;原创 2022-04-14 21:58:44 · 327 阅读 · 0 评论 -
4/13 cf构造题
C. Factorials and Powers of Two难度:1500暴力枚举二进制的方法。任何一个数都可以由二进制表示出来,暴力枚举出需要最少的阶乘和二进制数。#include<bits/stdc++.h>#define int long longusing namespace std;const int N=2e5+5;const int inf=0x3f3f3f3f;int a[N],n,k,idx;int get(int n){ int ans=0;原创 2022-04-13 22:49:00 · 158 阅读 · 0 评论 -
4/7 2016年蓝桥杯训练
1286: [蓝桥杯2016初赛]剪邮票利用全排列来见图,搜索图中的连通块,由于减5张,不存在全在内部的情况。#include<bits/stdc++.h>#define int long longusing namespace std;const int inf=0x3f3f3f3f;const int N=3e3+5;int a[12]={0,0,0,0,0,0,0,1,1,1,1,1};int dx[4]={0,-1,0,1};int dy[4]={-1,0,1,0};原创 2022-04-07 22:22:54 · 162 阅读 · 0 评论 -
4/6 深搜、广搜专题+二分答案+单调队列
经典迷宫问题:P6207 [USACO06OCT] Cows on Skates G1.广搜可用于查找最少需要的步数,而深搜可求出到达终点的路经数。2.可开一个数组记录路径,最后用深搜回溯路径。注意起点和终点的设置,可能需要自行补上。#include<bits/stdc++.h>#define int long longusing namespace std;int r,c,way[155][155][2];int dx[4]={-1,1,0,0};int dy[4]={0,0原创 2022-04-06 23:09:56 · 442 阅读 · 0 评论 -
4/5 逆元+深搜+bfs
P1082 [NOIP2012 提高组] 同余方程同余求最小正整数逆元。用扩展欧几里得定理,a*x+b*y=1求出a的逆元x.#include <bits/stdc++.h>#define int long longusing namespace std;const int maxn=1005;int a,b,x,y;void exgcd(int a,int b){ if(b==0) { x=1,y=0;return ; } ex原创 2022-04-05 23:02:17 · 361 阅读 · 0 评论 -
4/4 贪心选数+最长上升子序列+简单染色二分图+二进制搜索
# P1091 [NOIP2004 提高组] 合唱队形求出两个最长上升子序列,拼接长度减去重复记的自身(减去1即可)#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e6+5;int a[105],f[105],d[105];signed main(){ int n;cin>>n; for(int i=1;i<=n;i++)原创 2022-04-04 21:46:34 · 544 阅读 · 0 评论 -
4/3 江苏省赛补题+思维题+逆元+遍历树
J. Anti-merge题意增加了思维的难度。虽然看着像之前做的二分图,但本质上就是个染色问题,stl容器的使用更易处理这个问题。思维难点在于:我只需要一种类型的标记就可防止相邻相同类型的格子避免合并。ans[0]记录每轮最少需要的染色次数#include <bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;const int N=505;int n,m,a[N][N],types;int dx[5]={原创 2022-04-03 22:24:35 · 351 阅读 · 0 评论 -
4/2 素数筛+思维题
素数筛法:void is_prime(){ for(int i = 2; i * i <= n; i++) if(!vis[i]) for(int j = i * 2; j <= n; j+=i) vis[j] = true; for(int i = 2; i <= n; i++) if(!vis[i]) p[++k] = i;}C. Alice and the Cake没想到用递归去做,因为时间限两秒,我忽略了……还有注意将map清零#inclu原创 2022-04-02 23:33:11 · 314 阅读 · 0 评论 -
4/1 最小生成树+最短路+floyed+图中深搜
P1194 买礼物输入时需要特殊处理,若不加(x!=0),只能过一组样例,wa了三次,很烦~数据中没有优惠是0,因此不同产品间若是0则不需要建边,但实际情况中是存在的,而且题目也没说,不纠结了。#include <bits/stdc++.h>using namespace std;const int N=3e5+5;const int mod=998244353;const int inf=0x3f3f3f3f;int a,b,cnt,f[N],ans,g;struct no原创 2022-04-01 16:14:24 · 340 阅读 · 0 评论 -
3/31思维+差分+完全背包
C. Fault-tolerant Network七种情况分类讨论,写一个函数每次返回指定区间相减的最小值#include <bits/stdc++.h>#define int long longusing namespace std;const int N=2e5+5;const int mod=998244353;const int inf=0x3f3f3f3f;int a[N],b[N],n,mi=inf;int get(int a[],int l,int r,int v原创 2022-03-31 19:19:45 · 338 阅读 · 0 评论 -
3/20 思维+双指针
思维http://oj.ecustacm.cn/problem.php?id=1373尺取法+贪心一种我很少去想的思维方式,很巧秒。采用双指针,每有一个帖子进来就统计(i负责遍历);当时间超过限定时,当前帖子失效就得减一。若超过k,把他放到set集合里(set默认排序,去重,方便)#include <bits/stdc++.h>using namespace std;const int N=5e5+5;const int inf=0x3f3f3f3f;int n,k,d,num[原创 2022-03-30 21:36:44 · 383 阅读 · 0 评论 -
3/29 思维+并查集+最短路
P3535 [POI2012]TOU-Tour de Byteotia本题将大于编号k的边相连组成环,若有小于等于k的边进来,并查集判断在环内,则需要累加1删去。#include <bits/stdc++.h>using namespace std;const int N=1e6+5;int n,m,k,ans,f[N],head[N];struct node{ int u,v;}e[N];bool cmp(node e1,node e2){ if(e1.u=原创 2022-03-29 19:49:00 · 240 阅读 · 0 评论 -
3/28 并查集+最短路+爆搜dfs(记忆化,方向控制)
P2658 汽车拉力比赛这题的数据好像有问题,思路明明一样,代码的实现稍微有点区别,就会有样例报re。真的浪费了好长时间#include <bits/stdc++.h>using namespace std;int h[501][501],f[250001],a[250001],cnt;int ans,l,r,n,m,mid;int dx[4]={-1,0,1,0};int dy[4]={0,1,0,-1};int id(int x,int y){ return (x原创 2022-03-28 22:07:56 · 413 阅读 · 0 评论 -
3/25《并查集》
P1892 [BOI2003]团伙数组记录敌人;且在每次合并前,先合并别人的敌人#include <bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;const int maxn=1e4+5;int p[maxn],f[maxn],n,m;int r_find(int r){ if(f[r]==r) return r; f[r]=r_find(f[r]); return原创 2022-03-26 11:09:11 · 99 阅读 · 0 评论 -
3/24 阅读博客三篇+今日《并查集》
求一个数的二进制表示(用补码表示)void complement(int i,int step)//倒序输出后7位{ if (step ==9)return; f(i >> 1, step + 1); if (i & 1)cout << "1"; else cout << "0";}int fastpow(int x,int y){ int res=1; while(y) { if(y&1) re原创 2022-03-24 21:52:08 · 214 阅读 · 0 评论 -
manacher算法解题
P1659 [国家集训队]拉拉队排练1.思维误区:长度为5的最大回文串一定也是长度为3的回文串!!2.快速幂,和取模这样的技巧处理不好,会很容易wa,并且还不知道自己错在哪。3. ans[p[i]-1]++; 回文串的长度统计.由于区间的对称性,和算法对于回文串的特殊处理,p[i]-1就是该字符在原串中的回文长度。#include <bits/stdc++.h>#define int long longusing namespace std;const int maxn=5e6+原创 2022-03-22 14:30:26 · 127 阅读 · 0 评论 -
2019浙江省赛补题 +manacha算法
# J - Welcome Party建图+并查集+优先队列本题的难点在于输出顺序的处理优先队列:将每一层结点从小到大出队列。#include <bits/stdc++.h>using namespace std;const int maxn=1e6+5;int n,m,f[maxn],cnt,k,p[maxn],head[maxn];bool vis[maxn];struct edge{ int to,nxt;}e[maxn<<1];void ad原创 2022-03-21 22:20:55 · 372 阅读 · 0 评论 -
山东省赛补题
Gameshttps://ac.nowcoder.com/acm/contest/30256/G前i堆石子取出j堆异或和为sum,使得sum^sum=0,使得后手必胜。每堆石子的数量最大为1000,极端情况会出现二进制10个1,最大为1023,k最大取1023.#include <bits/stdc++.h>#define long long llusing namespace std;const int inf=0x3f3f3f3f;const int mod=3e9+7;i原创 2022-03-17 20:01:02 · 399 阅读 · 2 评论 -
3/14 训练一
https://ac.nowcoder.com/acm/contest/30256/A#include <bits/stdc++.h>#define int long longusing namespace std;const int inf=0x3f3f3f3f;const int maxn=1e6+5;int a[55],b[55];signed main(){ string s1,s2; while(cin>>s1>>s2)原创 2022-03-15 00:18:05 · 180 阅读 · 0 评论 -
求解次短路长度,最短路条数
求解次短路长度https://www.luogu.com.cn/problem/P2865#include <bits/stdc++.h>#define int long longusing namespace std;const int inf=0x3f3f3f3f;const int maxn=1e6+5;struct Edge{ int to,nxt,dis;}e[maxn];int dist[maxn][2],head[maxn],cnt,n,r;bool原创 2022-03-13 22:12:49 · 286 阅读 · 0 评论 -
P4878 [USACO05DEC]Layout G+P2294 [HNOI2005]狡猾的商人
P4878 [USACO05DEC]Layout G1.相邻牛建边,d[i]-d[i+1]<=0,防止存在负权环。2.建立超级源点,来判断图的连通性,距离为无穷大,或者存在负环就无解了。#include <bits/stdc++.h>using namespace std;const int maxn=2e6+5;const int inf=0x3f3f3f3f;int n,m,h,head[maxn],cnt,dist[maxn],num[maxn];bool vis[原创 2022-03-05 22:58:06 · 79 阅读 · 0 评论 -
依赖01背包+差分约束
有依赖的 01背包思路:选了主件,就必须选附件。因此在对每个主件做01背包时,再分别对附件做,取得最大值。将附件存在主件的后面,另开一个数组存取。#include <bits/stdc++.h>using namespace std;const int maxn=1e5+5;int n,m,v[maxn],w[maxn],p[maxn][3],q[maxn][3],f[maxn];int main(){ scanf("%d%d",&n,&m);原创 2022-03-05 17:11:45 · 183 阅读 · 0 评论