![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
理想三旬(づ ̄3 ̄)づ╭~
这个作者很懒,什么都没留下…
展开
-
滑动窗口 /【模板】单调队列
滑动窗口原创 2022-06-09 11:04:04 · 176 阅读 · 0 评论 -
哈尔滨理工大学第12届程序设计竞赛 B 抓球
题目链接: B 抓球#include<bits/stdc++.h>using namespace std;#define int long long const int maxn=2e5+5;const int mod=1e9+7;int a[maxn];int sp(int a,int b){ int sum=1; while(b) { if(b&1) sum=sum*a%mod; a=a*a%mod; b/=2; } return原创 2022-04-04 20:11:38 · 403 阅读 · 0 评论 -
2018年蓝桥杯省赛 C++ B组
题目链接:[蓝桥杯2018初赛]乘积尾零 答案:31题解:通过思考10的产生是由2和5共同作用的,要知道有几个0,每出现一个10,就应从乘数中可以提出一个2、一个5。所以我们把每个数的都分解成乘积的形式 ,统计出 2和 5的数量,取他们的最小值。#include<bits/stdc++.h>using namespace std;#define int long longsigned main(){ ios::sync_with_stdio(false); cin.tie原创 2022-03-30 20:22:20 · 1230 阅读 · 0 评论 -
[NOIP1998]拼数
题目链接:[NOIP1998]拼数#include<bits/stdc++.h>using namespace std;#define int long longconst int maxn=1e2+5;string a[maxn];bool cmp(string a,string b){ return a+b>b+a;}signed main(){ int n; cin>>n; for(int i=0;i<n;i++) cin>&g原创 2022-03-28 21:08:34 · 684 阅读 · 0 评论 -
2022上海理工大学校内选拔赛(GPLT)
H.Setsuna的K数列题目链接:Setsuna的K数列 题解:k的幂有两种选择,要么使用要么不使用,那么对应着二进制0和1,而且由于位权递增,从小到大第n个的组合数即是n对应的二进制对应的那种情况。所以这题就是将n转换为二进制,把对应为1的位权加起来,过程中取模,需要用到快速幂#include<bits/stdc++.h>using namespace std;#define int long longconst int mod=1e9+7; signed main(){原创 2022-03-27 10:27:47 · 427 阅读 · 0 评论 -
2021年第十二届蓝桥杯省赛大学B组
A题答案为:67108864#include<bits/stdc++.h>using namespace std;int main(){ cout<<256*1024*1024/4<<endl;}B题答案:3181#include<bits/stdc++.h>using namespace std;#define int long longint s[100];signed main(){ ios::sync_wi原创 2022-03-24 19:13:46 · 454 阅读 · 0 评论 -
快速幂算法
传统的求幂算法:时间复杂度非常高(O(指数n)),当指数n非常大的时候,需要执行的循环操作次数也非常大。快速幂算法:能快速计算指数非常大的幂。核心思想是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。(请认真理解这句话,理解不了也没关系,下面会有具体推导)ll power(ll a,ll b,ll mod) { ll ans = 1; while(b) { if(b&1){ ans=a.原创 2022-03-21 17:51:30 · 641 阅读 · 0 评论 -
C++ bitset函数
C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。构造函数bitset常用构造函数有四种,如下 bitset<4> bitset1; //无参构造,长度为4,默认每一位为0 bitset<8> bitset2(12); //长度为8,二进制保存,前面用0补充 string s = "100101"; bitset<10> bitset3(s); //长.原创 2022-02-14 20:47:34 · 432 阅读 · 0 评论 -
#10159. 「一本通 5.2 练习 2」旅游规划
思路:判断该点是否可以构成树的直径 ,如果可以则该点位于城市交通网的最长路径上#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;int d1[maxn],d2[maxn],p[maxn],up[maxn];int n,num,mx;int nx[maxn],head[maxn],v[maxn];void add(int a,int b){ v[num]=b; nx[num]=head[a]; he原创 2022-01-15 09:27:56 · 250 阅读 · 0 评论 -
没有上司的舞会(树形dp)
某大学有N个职员,编号为1~N,校长的编号为1,他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的直接上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。Input第一行一个整数N。(1<=N<=100000) 接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri原创 2022-01-14 15:47:16 · 60 阅读 · 0 评论 -
10154. 「一本通 5.2 例 2」选课
题目描述在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有N门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有学完了课程a,才能学习课程b)。一个学生要从这些课程里选择M门课程学习,问他能获得的最大学分是多少?输入输出格式输入格式:第一行有两个整数N,M用空格隔开。(1<=N<=300,1<=M<=300)接下来的N行,第I+1行包含两个原创 2022-01-14 09:47:20 · 143 阅读 · 0 评论 -
分组背包(背包问题)
分组背包:1.定义(1)分组背包,通俗的讲就是,给你N组物品,然后每一组你至多选择一个物品(也可以不选),每个物品都有自己的体积和价值,现在给你一个容里为M的背包,让你用这个背包装物品,使得物品价值总和最大.(2)其实就类似于01背包,对于一个物品有两种决策选或不选,但是分组背包是在01背包的基础上对物品进行了分组,并且每一组只能最多选择一个物品,所以我们不妨用01背包的思想去思考分组背包.2.思路我们设f[i][j]为当前考虑到了第i组物品,剩余容里为j的背包能装物品的最大价值,那么很容易想到我原创 2022-01-14 09:23:05 · 303 阅读 · 0 评论 -
树形动态规划
1.树的重心树的重心:删除这个点后最大连通块的结点数最小解法:一次DFS,在无根树转有根树的同时计算。对于结点i,子树中最大结点个数为max{f[j]}个结点,i的“上方子树”中有n-f[i]个结点,只需在dfs过程中找到最大的子树节点,并与其上方的节点数做比较,就可以找出树的重心了。补充性质:1.树中所有点到某个点的距离和中,到重心的距离和是最小的;如果有两个重心,那么他们的距离和一样。2.把两个树通过一条边相连得到一个新的树,那么新的树的重心在连接原来两个树的重心的路径上3.把一个树添加或删原创 2022-01-13 17:04:13 · 96 阅读 · 0 评论 -
加分二叉树(区间DP)
思路:从1到n让每个点为根节点,然后计算出左子树分数最大值,右子树分数最大值,最后计算整棵树的最大值。#include<cstring>#include<cstdio>#include<algorithm>using namespace std;int n;int w[30];int f[30][30],g[30][30];void dfs(int l,int r){ if(l>r) return ; int root=g[l][r]; p原创 2022-01-12 09:46:44 · 287 阅读 · 0 评论 -
10001 「一本通 1.1 例 2」种树
种树题意:给定n个闭区间[a,b],在数轴上选择尽量少的点,使得每个区间内至少有m个点。做法:贪心策略,将每个区间的右端点从小到大排序,依次从每个区间的右端点向左端点做统计,统计当前共有多少点,如果数量不够,从右端向左端扫描画点,目的是使该点尽可能被后边的区间运用。#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct s{ int a,b,c;原创 2022-01-08 16:05:30 · 195 阅读 · 0 评论 -
LCA倍增
倍增求LCA1.预处理设f[x,k]表示x的2的次方辈祖先,即从x向根节点走2^k步到达的节点。特别地,若该节点不存在,则令f[x,k]=0。f[x,0]就是x的父节点。可以得出f[x][k]=f[f[x][k-1]][k-1]。我们可以对树进行遍历,由此得到f[x,0],再计算f数组所有值。以上部分是预处理,时间复杂度为O(nlogn)。之后可以多次对不同的x,y计算LCA,每次询问的时间复杂度为O(logn)。void dfs(int u,int father) { Dep[原创 2022-01-07 12:24:44 · 165 阅读 · 0 评论 -
校门外的树
校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两种操作: K=1,读入 lr 表示在 l 到 r 之间种上一种树,每次操作种的树的种类都不同; K=2,读入 l,r 表示询问 l 到 r 之间有多少种树。注意:每个位置都可以重复种树。输入格式第一行 n,m 表示道路总长为 n,共有 m 个操作;接下来 m 行为 m 个操作。输出格式对于每个 k=2 输出一个答案。样例Input Output5 41 1 32原创 2022-01-03 21:01:03 · 108 阅读 · 0 评论 -
Squares and Cubes CodeForces - 1619B
题目链接:Squares and Cubes cbrt()函数是cmath标头的库函数,用于查找给定数字的立方根 ,它接受数字并返回立方根#include<stdio.h>#include<math.h>#include<map>#include<algorithm>using namespace std;map<long long ,int >sum;const int maxn=1e9+5;int main(){ in原创 2021-12-23 20:53:34 · 405 阅读 · 0 评论 -
割点和桥详解博客
博客链接原创 2021-12-06 20:15:40 · 167 阅读 · 0 评论 -
最短路模板
Floyd-Warshall#include<stdio.h>int main(){ int e[10][10],k,i,j,n,m,t1,t2,t3; int inf=99999999; scanf("%d %d",&n,&m); for( i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) e[i][j]=0; else e[i][j]=inf; for(int i=1;i<=m;i++) { s原创 2021-11-13 10:55:48 · 55 阅读 · 0 评论 -
#10050. 「一本通 2.3 例 2」The XOR Largest Pair最大异或对(Trie 字典树)
题目链接:The XOR Largest Pair在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?输入格式:第一行输入一个整数N。第二行输入N个整数A1~AN。输出格式输出一个整数表示答案。数据范围1≤N≤105,0≤Ai<231.输入样例:31 2 3输出样例:3#include<iostream>#include<stdio.h>#include<string.h>#include&l原创 2021-11-05 19:20:19 · 170 阅读 · 0 评论 -
#10047. 「一本通 2.2 练习 3」似乎在梦中见过的样子
题目链接:似乎在梦中见过的样子int main(){ scanf("%s",a+1); int l=strlen(a+1); scanf("%d",&k); for(int i=1;i<l-k;i++) { printf("%s**\n",a+i-1); //kmp(a+i-1); }// printf("%d\n",sum); //kmp(s+i-1);}下面这个图为输出结果,由此可见a+i-1依次将前面字母删去题解:可以枚举字符串长度,依次进行kmp,但是原创 2021-11-03 19:46:42 · 437 阅读 · 0 评论 -
Pie POJ - 3122(二分)
题目链接:Pie题意:我的生日快到了,传统上我要做馅饼。不只是一个馅饼,不,我有N个馅饼,各种口味,各种尺寸。我的几个朋友要来参加我的聚会,他们每人都得到一块馅饼。这应该是一个馅饼的一块,而不是几个小块,因为看起来很乱。不过这一块可以是一整块馅饼。我的朋友们很烦人,如果他们中的一个比其他人得到更大的一块,他们就会开始抱怨。因此,所有的馅饼都应该得到同样大小(但不一定形状相同)的馅饼,即使这会导致一些馅饼变质(这比破坏聚会要好)。当然,我自己也想要一块馅饼,而且那块馅饼的大小也应该一样。我们所有人能得到原创 2021-10-19 20:04:21 · 323 阅读 · 0 评论 -
汉诺塔递归实现
解题思路:如果n==1,直接将A移到C如果n>1满足以下递归(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;(2)将A杆中剩下的第n号盘移至C杆;(3)以A杆为中介;从B杆将1至n-1号盘移至C杆。#include<stdio.h>void s(char a,char b,char c,int n){ if(n==1) printf("%c -> %c\n",a,c); else { s(a,c,b,n-1); printf("%c -> .原创 2021-10-11 17:34:07 · 45 阅读 · 0 评论 -
计算系数 计蒜客 - T2004
题目链接:计算系数二项式定理系数满足杨辉三角( a + b ) 0 = 1( a + b ) 1 = 1a + 1b( a + b ) 2 = 1a2 + 2ab + 1b2( a + b ) 3 = 1a3 + 3a2b + 3ab2 + 1b3( a + b ) 4 = 1a4 + 4a3b + 6a2b2 + 4ab3 + 1b4所以本题可以用杨辉三角写#include<stdio.h>#include<algorithm>using namespac原创 2021-10-07 11:39:04 · 87 阅读 · 0 评论 -
STL 总结
map容器map是用来存放<key, value>键值对的数据结构,map本身默认按照key值升序排序定义map容器map<string,int>m;这个map容器相当于一个字符串对应一个数值,m是该容器的名字还可以有:1.map<string,double>m;2.map<int,int>m;3.map<int,char>m;4.map<char,int>m;5.map<int,bool>m;等等原创 2021-08-14 09:51:36 · 61 阅读 · 0 评论 -
River Hopscotch(二分)
题目链接:River Hopscotch题意:小牛过河起点到终点距离为L,有m块石头,可以移除M块石头,寻找所跳最小距离的最大值题解:枚举所跳最小的距离的最大值,若两个石头之间的实际距离小于等于答案距离,则这块石头需要搬走#include<stdio.h>#include<algorithm>using namespace std;int a[1055000];int main(){ int L,n,m; int i,j; scanf("%d%d%d",&原创 2021-10-04 13:50:14 · 135 阅读 · 0 评论 -
#10021. 「一本通 1.3 例 4」Addition Chain(搜索)
#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>using namespace std;int n,a[50000],mi,b[10000];void dfs(int x){ if(x-1>mi)/*如果我们搜索到的这一层的前一层, 已经比我们定义的最大层数要大的话,就可以返回上一层递归了*/ return ; if(a[x-1]>n)原创 2021-09-30 21:50:06 · 76 阅读 · 0 评论 -
#10016. 「一本通 1.2 练习 3」灯泡(三分)
参考博客链接:「一本通 1.2 练习 3」灯泡(三分)#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;double h,d,h1;double s(double x){ return (d-x)+h-(h-h1)*d/x;}int main(){ int t,i,j; double l,r; scan原创 2021-09-29 21:15:50 · 73 阅读 · 0 评论 -
#10013. 「一本通 1.2 例 3」曲线(三分)
参考博客:三分详细讲解(曲线)#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;double a[10000],b[10000],c[10000];int n;double s(double x){ double mx=a[0]*x*x+b[0]*x+c[0]; for(int i=1;i<n;i++)原创 2021-09-29 20:19:28 · 94 阅读 · 0 评论 -
七夕节(约数之和)
标题链接:七夕节思路:从1到根号n枚举,若为其约数,则相加,另外一个若合法,也相加注意,它本身不加.若为平方数,根号n也只加一次#include<stdio.h>int main(){ int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); int i,sum=0; for(i=1;i*i<=n;i++) { if(n%i==0) { sum+=i;原创 2021-09-05 09:15:08 · 35 阅读 · 0 评论 -
线段树区间求模
题目链接:The Child and Sequence 题目要求的操作:1 区间求和2 区间取模3 单点修改#include<stdio.h>#include<algorithm>using namespace std;const int maxn=1e5+5;long long a[maxn],s[maxn*4],n,m,mx[4*maxn];void build(int l,int r,int o){ s[o]=0;//区间和 mx[o]=0;//区原创 2021-09-01 21:38:20 · 137 阅读 · 0 评论 -
网络流(Dinic算法)
题目链接:Drainage Ditches#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>using namespace std;int s,t;//源点和汇点int n,m;int inf=99999999;const int maxn=1e5+5;int head[maxn];//每一个点最后一条边的编号int next[maxn];//指向对原创 2021-08-31 13:14:50 · 70 阅读 · 0 评论 -
Extend to Palindrome(UVA 11475)马拉车算法
题目链接:Extend to Palindrome题意:本题题意是给你一个字符串,求出最少拼接字符数使其变为回文串题解:我们可以先对原串进行manacher,求出每个位置的回文半径,那么如果当前下标加上回文半径正好等于len,证明此下标为中心的回文串是原串的后缀,更新答案即可#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=4e5原创 2021-08-29 13:43:05 · 141 阅读 · 0 评论 -
KMP算法
**题目链接:KMP算法 HDU 2087 剪花布条**#include<stdio.h>#include<string.h>char a[10000],b[10000];int next[10000];//next[i]表示模式串b在0~i-1位的子串的最长公共前缀后缀的长度int main(){ while(~scanf("%s",a)) { if(a[0]=='#') break; scanf("%s",b); int i=0,j=-1;原创 2021-08-25 09:12:16 · 67 阅读 · 0 评论 -
马拉车算法
马拉车用于解决最长回文子串问题。首先需要进行预处理:经过处理,字符串的长度永远都是奇数了。s[i]数组为进行预处理之后的字符串a[i]数组是原字符串mx=id+len[id],即回文子串的边界id表示最大回文子串中心的位置len[i]表示以字符s[i]为中心的最长回文子串的最右(左)字符到s[i]的距离(包括s[i])len[i]-1是该回文子串在原来字符串中的长度题目链接:最长回文串#include<stdio.h>#include<string.h>原创 2021-08-25 09:07:44 · 85 阅读 · 0 评论 -
strstr(str1,str2)函数查询子字符串 substr函数
strstr(str1,str2) 函数是字符串处理函数之一,位于头文件 “string.h”中。strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。...原创 2021-08-21 22:41:59 · 394 阅读 · 0 评论 -
线段树yyds
线段树建图建树void build(long long l,long long r,long long o){ if(l==r) { s[o]=a[l]; return ; } long long mid=l+(r-l)/2; build(l,mid,o*2); build(mid+1,r,o*2+1); s[o]=s[o*2]+s[o*2+1];}单点修改:void update(long long l,long long r,long long o,long lon原创 2021-08-20 14:49:23 · 49 阅读 · 0 评论 -
树状数组。。。
lowbit函数int lowbit(int a){ return a&-a;}> 1.lowbit:将一个十进制转化为二进制,最低位一所对应的值就是该数的lowbit的值,例如lowbit(5)=1,5的二进制为101,最低位对应是值为1,如果这个二进制末尾是0,且0的个数为k,lowbit(x)=2的k次方。2.在树状数组中,元素c[i]是lowbit(i)个a数组元素的和...原创 2021-08-20 14:19:19 · 50 阅读 · 0 评论 -
最短路
BackgroundHugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man who tells him whether there really is a way from the place his customer has build his giant steel crane to the place where原创 2021-05-06 21:30:45 · 85 阅读 · 0 评论