- 博客(53)
- 收藏
- 关注
原创 【无标题】
(数学/找规律)D - Polynomial division链接最好用的方法是写一个具体的例子#include<iostream>#include<algorithm>#include<cstring>#include<vector>#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);using namespace std;typedef long long LL
2022-03-28 20:35:24
326
原创 (图上DP)E - King Bombee
E - King Bombee链接#include<iostream>#include<vector>using namespace std;#define pb push_backtypedef long long LL;const int N=2100,p=998244353;vector<int>e[N];LL f[N][N][3];int n,m,k,s,t,x;int main(){ cin>>n>>m>
2022-03-21 11:30:03
553
原创 奇/偶排列问题
D - Swap Hats添加链接描述题意:给定R G B三个字母的排序,问通过恰好1e181e181e18次交换操作,能否将其变成给定的顺序?分析:1.令R=1,G=2,B=3,我们可以将其转化为(1,2,3)排列问题2.A组的三种排列可以通过一次操作变成B组中的排列,同理,B组中的三种排列也可以通过一次操作变成A组中的排列。如果A组中的一种排列要变成他相同组中的另一种排列,需要两次操作(先变成B排列,再变回A)。综上我们可以知道:通过偶数1e18次操作,如果两种排列在同一组中,就可以得到。
2022-03-21 10:35:42
2886
原创 简单图论+二分
F 闯关链接注意要特判起点的时间是否符合要求#include<iostream>#include<queue>#include<algorithm>#include<cstring>using namespace std;typedef pair<int,int> PII;const int N=1100;int dx[]={1,0,-1,0},dy[]={0,1,0,-1};int g[N][N];bool st[N][
2022-03-12 14:40:25
169
原创 (思维)C. Differential Sorting
C. Differential Sorting添加链接描述题意:要求通过≤n≤n≤n次操作将序列变成非递减序列。操作内容:选择ax=ay−aza_x=a_y-a_zax=ay−az,必须保证x<y<zx<y<zx<y<z,也就是说x只能选排在他后面的两个数思路:如果序列本身有序,直接输出0发现如果a[n−1]>a[n]a[n-1]>a[n]a[n−1]>a[n],根本无法执行操作,直接输出-1因为要对a[i]a[i]a[i]进行修
2022-02-22 14:58:36
191
原创 (贪心)B. Avoid Local Maximums
B. Avoid Local Maximumslianjie 题意:当发现a[i]>a[i−1]a[i]>a[i-1]a[i]>a[i−1]&&a[i]>a[i+1]a[i]>a[i+1]a[i]>a[i+1]的时候我们要进行修改,使得整个序列不存在a[i]>a[i−1]a[i]>a[i-1]a[i]>a[i−1]&&a[i]>a[i+1]a[i]>a[i+1]a[i]>a[i+1],求最小的操作次
2022-02-22 13:33:53
539
原创 技巧爆搜/操作符树
添加链接描述#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;typedef long long LL;char op[5];LL ans=1e18;void dfs(vector<LL>v,int u) //u表示操作符op序号{ if(v.size()==1) ans=min
2022-02-20 13:25:11
340
原创 图论/思维 C. Not Assigning
C. Not Assigninglianjie 题意:给定无向图,要求给边赋值,使得每个边权为质数,长度为2的路径边权和也为质数。思路:首先推理得到只有质数2+其他质数=质数,每个长度为2的路径必须包含一条边权为2的边,所以如果要满足条件,不可能有一个点的度数>2,整个无向图形成了一条链式结构。#include<iostream>#include<vector>#include<map>#include<cstring>usin
2022-02-17 20:56:13
454
1
原创 MEX-A. Meximum Array
链接A. Meximum Array题意:每次把a序列前k个数的MEX值放进b序列中,然后删掉a序列的前k个数,重复操作,直到a数组为空。求字典序最大的b序列组成。思路:要使得b序列的字典序最大,那么先放入b序列的MEX值应该尽可能的大。所以我们第一次选取的MEX值应该是整个a序列可能的最大MEX值。然后删掉a序列中取得最大MEX值的长度为k的前缀,仍然选取剩余序列中最大的MEX值,重复操作。关键问题:1. 如何找到当前序列最大的MEX值cnt[i]:预处理数字出现的次数。注意cnt[
2022-02-17 17:46:54
414
1
原创 基环树问题
基环树定义:仅包含一个环的连通图/一棵树多了一条边形成了一个环的图(一棵树多一条边不一定形成一个环)充要条件:图是连通图n=mn=mn=m(点数等于边数)分类:无向基环树(NNN边NNN点的无向图)内向基环树(每个点仅有一条出边)外向基环树(每个点仅有一条入边) ????大佬更优学习资源题目1:链接并查集判断连通图题目2:lianjie思维+基环树背景...
2022-02-17 16:44:14
291
原创 异或和加法的共同性质
A. Meximum Arraylianjie注意:对序列a中的每一个数字都要进行一次操作加法操作和异或操作有一个共同的作用:改变数字的奇偶性,并且对奇偶性的改变是同步的奇数+奇数=偶数,奇数^奇数=偶数奇数+偶数=奇数,奇数^偶数=奇数偶数+偶数=偶数,偶数^偶数=偶数本题已经声明:xxx和x+3x+3x+3其中必然有一个最后可以变成yyy,问哪个可以得到,并没有要求过程。所以我们不必仔细推导过程,只需要去找x,x+3,yx,x+3,yx,x+3,y之间的性质。xxx和x+3x+3x+
2022-02-16 23:21:36
758
原创 (DFS爆搜)AcWing 2005. 马蹄铁
添加链接描述DFS爆搜状态转移的关键特点:(可以走到(或)但是)只能走到),所以要记录上一个点的状态,从而判断当前点能否走更新答案要满足(的数量等于)的数量,所以爆搜时要记录#include<iostream>#include<algorithm>using namespace std;const int N=10;char g[N][N];bool st[N][N];int n,ans;int dx[]={0,1,0,-1},dy[]={1,0,-1,0
2022-02-16 20:16:10
267
原创 C. Inversion Graph
C. Inversion Graph链接法1:单调栈#include<iostream>using namespace std;const int N=2e5+100;int stk[N],tt,x,top;int main(){ int t; cin>>t; while(t--) { tt=0; int n; cin>>n; for(int i=1;i<=n;i++) { cin>>x;
2022-02-15 23:32:00
679
原创 2022牛客寒假算法基础集训营4
A-尺取法/双指针字符串按′P′'P'′P′分割成了多个子字符串,我们求出子字符串满足cnt≥kcnt≥kcnt≥k的子串数量则为答案。对于不含ppp的子串,固定右端点,左端点具有单调性,右端点iii每次向右移动,左端点jjj也向右移动。#include<iostream>using namespace std;const int N=2e5+100;int n,k;long long ans=0;void sum(string s) //求字符串s至少包含k个R的
2022-02-13 20:23:27
520
原创 2022牛客寒假算法基础集训营3
B-01背包求方案数链接和第一场的A题同种做法。注意:dp[i][j]dp[i][j]dp[i][j] 表示前iii个西瓜,能够拼凑出西瓜重量为jjj的最大方案数,注意两维数组根据题目数据范围开得大一点!!(一开始样例都过但是答案没过就卡在这了)dp[0][0]=1dp[0][0]=1dp[0][0]=1三种情况得到三种递推式子(1) 第i个西瓜不选,dp[i][j]+=dp[i−1][j]dp[i][j]+=dp[i-1][j]dp[i][j]+=dp[i−1][j](2)选定第iii个
2022-02-13 15:09:46
85
原创 01背包类DP
A.九小时九个人九扇门( 01背包求方案数)链接#include<iostream>using namespace std;const int N=1e5+100,mod=998244353;int a[N],f[N][10];int count(int x){ x%=9; if(x==0) return 9; return x;} int main(){ int n; cin>>n; for(int i
2022-02-11 19:22:57
483
原创 2022牛客寒假算法基础集训营1
2022牛客寒假算法基础集训营1E -贪心#include<iostream>#include<cmath>using namespace std;int main(){ int t; cin>>t; while(t--) { int n,m; cin>>n>>m; bool f=0; long long ans=1;
2022-02-11 19:11:36
501
原创 二分图-F全体集合
F-全体集合链接一个显然的结论:如果每个人两两之间都存在偶数距离的路径,那么必然存在一种方法使得他们集中(可以先让一个人每次都在其初始节点和某个相邻节点之间“反复横跳”,然后其他节点的人都往这个人初始位置走那条偶数路径,到达之后可以选择跟着这个人“反复横跳“,直到全部点都到达,因为是偶数距离,所以"反复横跳"最后还是会跳回初始的位置)。如果路径中存在奇环,即使某两点之间的路径不是偶数路径,也可以通过走这个奇环,改变路径的奇偶性,使得路径为偶数。所以只要路径存在奇环,一定可以使得所有的点到达同一点。
2022-02-09 17:10:39
160
原创 Floyd算法原理
限定了每个点可以用的时间(在TiT_iTi之前这个点是不能使用的),下标越大的点能用的时间越晚即Ti−1<TiT_{i-1}<T_iTi−1<Ti。这就说明在TiT_iTi之前iii点是不能用来更新的。floyd()floyd()floyd()三层forforfor循环最外层的kkk表示从iii走到jjj的路径上,只经过111到kkk的所有路径。所以只有t≥Tkt≥T_kt≥Tk时能够进行更新操作。#include<iostream>#include<.
2022-02-09 15:46:03
750
原创 堆优化Dijkstra/hash表存结点编号
https://ac.nowcoder.com/acm/contest/27150/J结点编号数据范围达到了1e181e181e18,通过哈希表MAP<LL,int>mpMAP<LL,int>mpMAP<LL,int>mp优化。用get()get()get()函数进行转化。注意最短路长度达到longlonglong longlonglong级别,所以d[]d[]d[]数组初始化时用forforfor循环初始化为1e131e131e13#include<io
2022-02-09 14:25:32
201
原创 2022牛客寒假算法基础集训营2
E 小沙的长路链接完全图: 完全图是一个简单的无向图,其中每对不同的顶点之间都恰连有一条边相连。完全图最多有n*(n-1)/2条边求最长路径的最小值和最大值:最小值:首先最长路径不能有环,否则会无限长,所以在无环情况下,每个点经过一次,最长路径的最小值是n−1n-1n−1最大值:走遍每一条边——欧拉回路,又因为无向图的欧拉回路最多有(n−1)n/2(n-1)n/2(n−1)n/2条边,而欧拉回路要求无向图的奇数度的点最多有2个,分奇偶点情况讨论奇数点:nnn为奇数,(n−1)(n-1)(n−1
2022-02-09 11:45:10
100
原创 完全图/欧拉回路
链接完全图: 完全图是一个简单的无向图,其中每对不同的顶点之间都恰连有一条边相连。完全图最多有n*(n-1)/2条边求最长路径的最小值和最大值:最小值:首先最长路径不能有环,否则会无限长,所以在无环情况下,每个点经过一次,最长路径的最小值是n−1n-1n−1最大值:走遍每一条边——欧拉回路,又因为无向图的欧拉回路最多有(n−1)n/2(n-1)n/2(n−1)n/2条边,而欧拉回路要求无向图的奇数度的点最多有2个,分奇偶点情况讨论奇数点:nnn为奇数,(n−1)(n-1)(n−1)为偶数,所以n
2022-02-08 11:45:04
2572
原创 Atcoder 238
B-模拟#include<iostream>using namespace std;typedef long long LL;bool f[400];int main(){ int n; cin>>n; int p=0; f[0]=true; for(int i=0;i<n;i++) { int a; cin>>a; p+=a; p%=360; f[p]=true; //记录分割点 } int res=0,ans=
2022-02-06 17:05:08
151
原创 atcoder位运算&结论+公式推导
D-位运算&结论+公式推导链接结论:x+y=2( x x+y=2(~x~x+y=2( x & y )+ ( x ~y~)+~(~x~ y )+ ( x ^ y ) ~y~)~ y ) ( x (~x~( x & y
2022-02-06 16:28:43
584
原创 异或/和的相关性
牛客寒假训练营H-小沙的数字由异或的性质可知,因为各元素的和是m,先把m转化为二进制,要使各元素异或最大,就要让各元素在二进制下相同位上不能出现重复的1所以当m中出现一个1,只能放在n个数字中某一个数字中的这一位上。只需要统计m在二进制下有多少个1,每一个1都可以放在n个位置上。最终结果为nxn^xnx#include <bits/stdc++.h>using namespace std;constexpr int mod = 1e9 + 7;typedef long long
2022-02-05 14:07:39
527
原创 二分答案,01分数规划(平均数/中位数转化),dp
题目链接大佬题解链接补充:关于平均值的01规划理解:∑ain≥mid\frac{\sum{a_i}}{n}≥midn∑ai≥mid∑ai∑i=1n1≥mid\frac{\sum{a_i}}{\sum_{i=1}^n1}≥mid∑i=1n1∑ai≥mid∑(ai−mid)≥0\sum{(a_i-mid)}≥0∑(ai−mid)≥0另外注意中位数是整数,平均值是浮点数我们知道对于某一个位置iii,既可以选这个数,也可以选他的下一个数,下意识的想用DFS,但是数据太大
2022-01-27 21:08:49
300
原创 二维dfs
链接#include<iostream>#include<algorithm>#include<cstring>using namespace std;typedef long long LL;const int N=20;int g[N][N],n;bool st[N];LL ans;void dfs(int u,LL x) //x记录答案{ if(u==n) { ans=max(ans,x); return; } int l=
2022-01-26 12:12:49
589
原创 K金牌厨师(双条件二分+差分)
链接二分+差分二分最大值,check得到满足两个条件的解。(以前做的都是满足一种条件的二分,注意体会区别)题目目的:让共同区间尽可能的长,并且共同区间数目尽可能的多。我们每次二分得到mid,既指人数,也指长度。然后第一个for循环记录长度满足≥mid的前缀和人数,第二个for循环差分得到符合≥mid的长度的人数,如果人数sum[i]≥mid,return true,(说明满足两个条件)。#include<iostream>#include<cstring>using
2022-01-26 11:39:38
508
原创 2021-10-29 atcoder ABC157——B - Bingo
B - Bingo先标记,然后暴力判断,这样最清晰最好想。#include<iostream>#include<algorithm>#include<cstring>using namespace std;typedef long long LL;int a[110][110],b[110];int main(){ for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) cin>>a[i]
2021-10-29 13:58:09
177
原创 D - Face Produces Unhappiness
D - Face Produces Unhappinessatcoder-ABC140题意:如果字符串中有s[i-1]=s[i],happy的人数+1我们能进行的操作是,选定一个区间将字符整体反转(L变R)最多进行k次操作(注意不是一定进行K次操作)思路:我们先记录原始字符串中happy的人数(只要s[i-1]==s[i],即LL类型或者RR类型,因为我们每次只讨论相邻两个的性质)那么剩余在字符串中,只剩LR类型和RL类型eg:LRLRL或者RLRL(至少是三个字符及以上是这种LRL
2021-10-29 11:55:40
126
原创 2021-10-26
D - Maximal Value代码:#include<iostream>#include<cstring>#include<queue>using namespace std;typedef pair<int,int> PII;typedef long long LL;const int N=2e5+10;int a[N],b[N];int main(){ int n; cin>>n; for(int i=1;i&
2021-10-26 21:42:35
85
原创 Educational Codeforces Round 114 (Rated for Div. 2)
Educational Codeforces Round 114 (Rated for Div. 2)A找规律 交换 构造#include<iostream>#include<algorithm>#include<cstring>using namespace std;int t,n;int main(){ cin>>t; while(t--) { cin>>n; string s;
2021-09-21 11:31:06
158
原创 Codeforces Round #742 (Div. 2)
Codeforces Round #742 (Div. 2)A Domino Disaster (模拟)模拟#include<iostream>#include<algorithm>#include<stack>using namespace std;const int N=1e5+100;char c[N];int main(){ int t; cin>>t; while(t--) { int n
2021-09-18 17:14:43
65
原创 STL队列题目合集
P1996 约瑟夫问题链接#include<iostream>#include<algorithm>#include<queue>using namespace std;queue<int>q;int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++) q.push(i); int cnt=1; while(!q.empty()) { if(cnt
2021-09-16 20:47:09
149
原创 后缀表达式+中缀表达式
后缀表达式表达式树的后序遍历eg: (2+1)∗3=2 1 + 3 ∗(2+1)*3= 2~1~ +~ 3~ *(2+1)∗3=2 1 + 3 ∗顺序存储,用栈,倒序跳出。每次遍历到一个运算符,它的左右儿子恰好为它前面的两个元素,即栈顶的两个元素。跳出这两个元素然后按运算符运算后的结果放入栈中。P1449 后缀表达式链接#include<iostream>#include<algorithm&
2021-09-16 20:27:42
87
原创 区间题目汇总
最小区间覆盖https://www.acwing.com/problem/content/909/选择尽量少的区间,将指定线段区间[st,ed]完全覆盖。所有区间按左端点从小到大排序从前往后枚举每一个区间(双指针)在所有能够覆盖左端点st的区间中,选择右端点最靠右的区间更新st为选中区间的右端点(其实一开始初始化是找到能覆盖左边界st的区间中右边界最大的,然后此后就更新st=r(上一个入选区间的右边界),再寻找能覆盖上一个入选区间右边界的区间中右边界最大的区间,然后继续更新,最后如果
2021-09-15 19:17:00
504
原创 The 2020 ICPC Asia Yinchuan Regional Programming Contest
The 2020 ICPC Asia Yinchuan Regional Programming ContestA开三个vector数组存储x,y,z轴上的点,unique+erase去重#include <iostream>#include <algorithm>#include <map>#include <vector>using namespace std;const int N=110;typedef pair<int,int
2021-09-13 19:08:23
883
1
原创 贪心题集汇总
贪心P3817 小A的糖果题意:数列相邻两个数的和不能大于x,每次进行的操作可以-1,问最少进行多少次操作使数列符合条件思路:从第一个元素开始往后模拟分析。cnt记录操作次数如果a[1]+a[2]>x,我们需要对其中一个数字进行减法操作,对那个数字减呢?——第一个数字只会和第二个数字组成一对,但是第二个数字还会和第三个数字组成一对,所以我们对第二个数字进行操作cnt+=x-a[2]-a[1],这样还可以同时减小后面一组的总数。后面的所有组都类推,我们每次都只对每一组的第二个数字进行操作。
2021-09-12 21:44:46
150
原创 9.6第二次测试赛
A 点数计算——模拟#include<iostream>#include<algorithm>using namespace std;int p,d,f,b,sum,w;long long cnt;int main(){ cin>>p>>b>>f>>d; if(b<5) { if(d==0) w=20; else w=30; cnt=w+f; if(cnt%10!=0) cnt=(cnt/10+
2021-09-07 21:42:35
45
原创 Atcoder 177
Atcoder 177链接B Substring双重循环#include <cmath>#include<iostream>#include <algorithm>using namespace std;const int INF=0x3f3f3f3f;int main(){ string s,t; cin>>s>>t; int ans=INF; for(int i=0;i<s.size(
2021-09-03 19:19:00
112
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人