自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 1553(div1+div2)

A代码:int main() { IOS; int t; cin>>t; while(t--){ int n; cin>>n; n++; cout<<n/10<<endl; } return 0;}B题意:给定一个筹码,然后向左向右移动使得在字符串s种找到字符串t;同时向右移动玩只能向左移动;思路:因为在s字符串中可能存在多个解,同时

2021-08-01 01:45:21 242

原创 codeforces 1541B &1541C

1541B已知i和a[i]的情况下,要是i+j=a[i]*a[j],只需要使j满足i+j是a[i]的倍数推导(i+j)(i+j)(i+j)%a[i]=0a[i]=0a[i]=0iii%a[i]+ja[i]+ja[i]+j%a[i]=a[i]a[i]=a[i]a[i]=a[i]jjj%a[i]=a[i]−ia[i]=a[i]-ia[i]=a[i]−i%a[i];a[i];a[i];const int N=200010;int a[N];int main() { IOS; int t; c

2021-06-27 00:45:21 219

原创 codeforces 1424 G&J

1424G题意:有n个人,每个人都有出生和死亡时间,求存活人数最多的年份,以及存活人数;题解:假如一个人在b—d-1存活,在b——d-1标记成1,这里可以使用差分数组,给一个区间进行加减;由于年份可能非常大,因此使用map存储;#include <iostream>#include <algorithm>#include <map>using namespace std;#define x first#define y secondint main()

2021-06-01 22:26:19 211 1

原创 Atcode abc203 CD

C- Friends and Travel costs题意:一共有10100+1个村庄,刚开始在0号点,每走一步花费1块钱,起始有k块钱,途中又n个朋友,跟朋友相遇时可以获得bi块钱;题解:贪心模拟,遇到的朋友越多钱也就越多,走的也就越远;#include <iostream>#include <algorithm>using namespace std;const int N=200010;typedef long long ll;typedef pair<l

2021-05-31 22:50:57 217

原创 二分求LIS及证明

最长上升子序列的动态规划朴素做法为O(n2)O(n^{2})O(n2)贪心做法O(nlogn)O(nlog n)O(nlogn):假如在长度同为k的子序列中,要在后面接a[i]a[i]a[i]肯定优先接在长度为k,并且结尾最小的子序列上,这样的扩展性最好,这样维护一个每次都是最小结尾的子序列,一定是单调的。反证法证明:假如长度为3的子序列的结尾比长度为2的结尾小,长度为3前面的子序列的结尾一定比长度为2的子序列的结尾小,这样就会产生冲突; 由于这个序列是单调的,则可以使用二分每次找到比即将插入的数字x小

2021-05-17 21:49:12 239 1

原创 Codeforces 1458A gcd

1458A题意:给定两个数组 a和b,求gcd(a1+bj,a2+bj,…,an+bj);题解:gcd(a,b)=gcd(a,b-a),可以将上式转化为,gcd(a1+bj,a2-a1,…,an-a1)#include <iostream>#include <cmath>#include <algorithm>using namespace std;typedef long long ll;const int N = 200010;ll a[N], b[

2021-04-29 22:10:09 142

原创 Codeforces 1366C 贪心+思维

1366C题意:找到所有从1,1点到n,m点的路径并且使得所有路径都是回文数字的最小操作次数;思路:可以发现,从起点开始走k步,他走到的点是确定的,可以把这个当作是一个集合;一共会走n+m-2步,只需要是每一步的集合中的数组全部相等即可;#include <iostream>#include <algorithm>#include <cstring>#include <map>#include <set>using namespac

2021-04-29 09:00:44 109

原创 Codeforces 1364C

题意:通过数组a构建数组b;其中ai是MEX(b1~bi);思路:假如两个数字不同那么第i号元素一定是i-1号元素;假如相同的话;只需要从小到大一直添加即可;#include <iostream>#include <algorithm>#include <cstring>#include <map>#include <set>#include <vector>using namespace std;const int

2021-04-28 09:24:44 100

原创 Codeforces 1363B

题意:不能出现010或者101的子序列,求最小操作次数;思路:最后改变完要不出现上述子序列,只能是连续一部分0和连续一部分1拼接成的字符串,可以通过求改变成这种字符串的最小次数求解;#include <iostream>#include <algorithm>#include <cstring>#include <map>#include <set>using namespace std;const int N = 200010;

2021-04-28 08:23:27 82

原创 Codeforces 1444A 数学

1444A题意:找到最大的x,x满足整除p但是不能被q整除;题解:分为两种情况,假如ppp modmodmod q!=0q!=0q!=0,结果就是p剩下一种情况,可以将q分解质因数,枚举每一个质因子,这种情况下p一定能够被q整除,说明q的所有质因子p里面也有,并且都大于等于q的质因数的次方,要是p的因子不能被q整除,则p里面有q的某一个质因数的次方-1,通过枚举每个质因数得出最大值;#include <iostream>#include <algorithm>#in

2021-04-26 08:25:13 257

原创 Codeforces 1482C 贪心+模拟

题意:每天都可以选择给定数量的小朋友,但是每个小朋友被选的次数,不能超过m/2次(上取整);思路:硬贪,首先把每个小朋友的出现次数统计出来,假如出现次数小于m/2次这个就随便放,肯定不会超,然后找某一天个数为1的,这个必须放,这样可以避免前面放完之后,到后面不能放这个小朋友的情况,其他的按照次数放#include <iostream>#include <algorithm>#include <vector>#include <cstring>u

2021-04-25 23:35:54 140

原创 Codeforces 1506E 构造

1506E题意:两个数组a,b其中bi是max(a1~ai);,求字典序最大和最小的数组a;思路:数组b一定是逐渐上升的,假如两个相邻的元素相同那么第二个元素一定是小于前一个的;这个题可以使用优先队列来做,建立大根堆和小根堆,最大就插入大根堆堆顶,最小就插入小根堆堆顶;#include <iostream>#include <algorithm>#include <queue>#include <map>using namespace st

2021-04-24 18:17:51 129

原创 Codeforces 1490F 枚举+贪心

1490F题意:给了一串数字,通过从删除任意几个元素是数组中每个元素的个数都相同;题解:先统计出每个数字的个数,然后枚举保留个数,取得最优解#include <iostream>#include <algorithm>#include <map>#include <cmath>#include <set>using namespace std;const int N = 200010;#define x first#defin

2021-04-24 18:09:18 133

原创 Codeforces 1512E 思维+构造

1512E题意:找到给定区间长度并且区间和为s的序列;题解:序列可能有多种情况,可以采用较为连续的序列来表示,这样可以保证序列的每个值不会大于n;步骤:假如一个数字s,和区间长度len,用连续数字表示的话,每个数字之间就会相差1,首先把这个相差的1除去,然后就可以算出他们len个相同的初始的值,其中这个相差的值为int k=len*(len+1)/2-len,或者可以写成len*(len-1)/2,表示长度为len-1的公差为1的数列的和,s-=k;s/=len;,s就是初始值,每次加一

2021-04-24 17:52:25 173

原创 codeforces edu 107 div2

A.A找1和3的个数就可;#include <iostream>#include <algorithm>using namespace std;int a[100];int main() { int t; cin >> t; while (t--) { int n; cin >> n; int cnt1 = 0; for (int i = 1; i <= n; i++) { cin >> a[i];

2021-04-13 17:57:41 73

原创 树状数组基础知识

树状数组用于快速处理区间问题;时间复杂度为logn树状数组可以将长度为n的数组分解成logn个区间;把n用二进制表示出来,n=2p1+2p2+…+2pm;其中m=logn;长度为2p1的区间:[1,2p1];长度为2p2的区间:[2p1+1,2p1 +2p2];…长度为2pm的区间:[2p1+2p2+…+1,2p1 +…2pm];若区间以x结尾,则长度为lowbit(x);用代码表示为:while(x){ printf("[%d,%d]\n",x-lowbit(x)+1,x); x-

2021-04-05 14:32:46 125

原创 并查集专题训练

搭配购买并查集+01背包;先合并分块,然后按照01背包模型求解#include <iostream>#include <algorithm>using namespace std;const int N = 10010;int p[N], c[N], d[N];int v[N], w[N];int find(int x) { if (x != p[x]) p[x] = find(p[x]); return p[x];}int f[N];...

2021-04-04 01:38:53 123

原创 基础dp专题训练

Max Sum Plus Plus#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;const int N = 1e5 + 10;typedef long long ll;ll a[N], f[N], max_j[N];const int INF =0x7fffffff;void solve() {...

2021-04-01 23:27:44 128

原创 基础搜索专题训练

1棋盘挑战#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int N=20;char g[N][N];bool col[N],row[N];int n,k;int ans;void dfs(int u,int s){ if(s==k){ ans++; return; } if(u&g

2021-03-29 00:12:36 161

原创 codeforces#710

A题A思路:根据矩阵大小和给定的数字x找到他的坐标,然后计算新的数字就可以;#include<iostream>#include<algorithm>using namespace std;typedef long long ll;int main(){ int t; cin>>t; while(t--){ ll n,m; cin>>n>>m; ll x;

2021-03-26 01:53:19 131

原创 cf 1492C

题目链接:1492C思路:=贪心,他要找到最宽的距离 ,也就是子序列之间最大的差;先找出第一次出现的子序列和最后一次出现的子序列,所有的子序列的下标肯定都在这个范围内,所以用最大的减去前一个字母最小的下标即可;/*思维/贪心算法:要求宽度最大;只需要把第一次出现的子序列和最后一次出现的子序列的位置找出来然后找到最大得到r[i]-l[i-1]即可*/#include<iostream>#include<algorithm>using namespace st

2021-03-23 09:36:52 50

原创 常用数据结构持续更新

1.链表/*链表测试*//*int类型*/#include<bits/stdc++.h>using namespace std;struct node{ int key; node *next;//指向下一个节点};typedef node *ptrnode;typedef ptrnode List;typedef ptrnode pos;int isempty(List L){//判空函数 return L->next==NULL;}in

2021-03-03 21:22:08 193 1

原创 图论

1.拓扑排序一个有向无环图一定存在拓扑序,从入度为0的点开始遍历,每次遍历到下一个点的时候删去这条边,直到入度为0;int h[N],e[N],ne[N],idx;int d[N],path[N],t=0;//path用于存储拓扑序,d存储入度;int n,m;void add(int a,int b){//邻接表头插法 e[idx]=b; ne[idx]=h[a]; h[a]=idx++;}bool topsort(){ queue<int>a;

2021-01-25 00:20:59 150

原创 数论

1.质数1.质数的判定:bool fun(int n){ for(int i=2;i<=n/i;i++) if(n/i==0) return false; return true;}枚举到n/i既可以优化速度也可以有效防止溢出。2.分解质因数:一个数n最多有一个质因数大于sqrt(n);void fun(int n){ for(int i=2;i<=n/i;i++){//枚举2到sqrt(n); if(n%i==0){//i

2021-01-16 18:55:44 260

原创 动态规划

动态规划实质上时枚举出每种状态然后找出最优解;枚举一般用循环或者递归来实现:1.斐波那契数列要计算第n项的值就必须计算出n-1和n-2的值,计算n-1,必须先计算出n-2和n-3的值,一直到1和2为止;int fun(int n){ if(n==1) return 1; if(n==2) return 2; return fun(n-1)+fun(n-2);}画出图像之后会发现有大量的重叠子问题,这些重叠子问题可以避免重复计算,使用一个数组把已经计算过的值存储起来,需

2021-01-11 15:50:02 235

原创 树与图的遍历

深度优先遍历:树可以说属于无向图,通常使用邻接表来存储,在每一个节点处开一个链表,存储着跟他相连的节点的边。图的遍历(深度优先):每个节点只需要遍历一次,可以开一个数组用来记录状态;有向图的遍历(详解)#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;const int N=1e5+10,M=N*2;in

2021-01-07 23:07:57 111

原创 dfs&bfs

1.dfs深度优先搜索:常用递归实现,先画出递归树,深度优先指的是按照一条路线一直走到头,然后回溯,在回溯过程中还要检查是否有其他路径,如果有则继续走:1.全排列问题:枚举并记录记录每个数字的状态,对已经使用过的数字做标记int p[N],s[N];int m;void dfs(int n){ if(n==m){//终止条件 for(int i0;i<n;i++) printf("%d ",p[i]);//输出 puts(""); return; } for(int i=1;

2021-01-05 21:33:57 114

原创 哈希表——笔记

哈希表哈希表的主要作用是把一个非常大的集合映射到一个比较小的集合中,建立哈希表需要一个hash函数,一般的操作就是取模;许多个非常大的数字对一个比较小的数字取模之后容易发生冲突,也就是容易出现重复;常用的解决冲突的方法有拉链法,1.拉链法,就是在对应的hash值下面接一个链表,链表中存储的是原来的数字。链表建议使用数组实现的链表;例如将一些非常大的数字存储在一个大小为1e5的数组中,(建立hash表时,取模的数字最好是质数,这样可以降低出现冲突的概率)具体操作:哈希表使用数组实现,下标就

2021-01-04 21:37:03 142

原创 堆——笔记

堆堆是一种二叉树的的结构,并且满足一个节点存储的值必须小于他的两个子节点这种关系 堆的大致模型存储方式:可以使用一维数组来存储一颗二叉树;比如节点x,他的两个子节点分别是2x和2x+1。注意这里x的下标是从1开始,从0开始的话2*0仍然是0;根据这个规则,堆可以进行以下的操作:1.寻找最小值 也就是树根;2.插入一个元素,在堆的末尾插入,然后再根据堆的排序规则放置到合适的位置;3.删除最小值,因为使用一维数组存储,所以删除最小值时无法直接删除,可以将末尾的值把最小值覆盖掉,然后再将末尾

2021-01-04 14:47:30 91

原创 并查集笔记

学习笔记1.并查集:** 作用**:用于快速判断元素是否在一个集合中,或者合并两个集合的数据结构;原理:使用树结构来存储元素:每个节点x的父节点为p[x],所以树根节点x的父节点还是x;1.判断树根:`if(p[x]==x) //树根的父节点就是自己2.从某个节点开始寻找树根:while(p[x] != x) x=p[x];3。判断两个元素是否在同一个集合中,只需要比较这两个元素的根节点是否一样即可。4.合并集合,将一个集合的树根的父节点指向另一个集合的树根。。5.优化(路径压缩):当从一个

2021-01-04 11:17:57 182 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除