- 博客(34)
- 资源 (2)
- 收藏
- 关注
原创 关于线段树那些事
线段树,坑害萌新,码粮金人线段树不是算法,应该是一种工具。她能把一些对于区间(或者线段)的修改、维护,从O(N)的时间复杂度变成O(logN)。线段树是一种二叉树,也就是对于一个线段,我们会用一个二叉树来表示。比如说一个长度为4的线段,我们可以表示成这样:线段树的查询方法:如果这个区间被完全包括在目标区间里面,直接返回这个区间的值如果这个区间的左儿子和目标区间有交集,那么搜索左儿子如果这个区间的右儿子和目标区间有交集,那么搜索右儿子区间求和就是运用的这个逻辑:ll quer
2022-05-14 13:44:18
269
原创 P8177 「EZEC-11」等差数列
题目直通车题目大意:这道题就是问你这个等差数列能往里面加几个数字,使改动后的数列依然是等差数列。思路:思路很简单,就是看它的公差是否为偶数,是的话就继续,否则输出即可。具体解释看代码。代码如下:#include<bits/stdc++.h>#define int long long//记得long longusing namespace std;int t;int n,a,b;signed main(){ cin.tie(0),cout.tie(0); ios::sy
2022-03-04 21:55:43
237
原创 线性筛素数
#include<bits/stdc++.h>using namespace std;int n,m,q;int p[6000010],a[100000010];void zs(int n){ int gs = 0; for(int i = 2;i <= n;i++){ if(a[i] == 0){ a[i] = i; p[++gs] = i; } for(int j = 1;j <= gs;j++){ if(p[j] > a[i] |
2022-01-29 16:29:16
310
原创 并查集模板
#include<bits/stdc++.h>using namespace std;int n,m;int z,x,y;int a[1000000];int find(int k){ if(a[k] == k){ return k; }else{ return a[k] = find(a[k]); }}int main(){ cin >> n >> m; for(int i = 1;i <= n;i++){ a[i] = i;
2022-01-29 16:28:56
107
原创 笛卡尔树模板
#include<bits/stdc++.h>//k满足二叉搜索树性质,w满足小根堆性质(k,w) using namespace std;int n;int a[100000111],lc[10000022],rc[100000002],stk[10000007];//stk为储存栈的数组,lc左儿子,rc右儿子 long long l,r;int pos,top;int read() { int x = 0, w = 1; char ch = 0; while (ch
2022-01-29 16:28:36
226
原创 CF1130A Be Positive题解
题意:题目看起来要暴力但是还有一种更简单的方法。正数大于一半就输出 111 ,负数大于一半就输出 −1-1−1 ,否则就输出 000 。为什么正数大于一半输出 111 呢?其实任何数除以 111 都等于其本身,所以输出 111 ,除以 −1-1−1 等于它的相反数,所以负数多些时就输出 −1-1−1 ,否则输出 000 。代码:#include<bits/stdc++.h>using namespace std;int n;int a[10001];int zs,fs,l;int
2022-01-29 16:28:19
105
原创 最短路模板
Dijkstra:#include<bits/stdc++.h>using namespace std;const int inf = 2147483647;priority_queue <pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;int n,m,s,u,v,w;long long z[1000001],qz[1000001],
2022-01-29 16:27:59
163
原创 ST表模板
#include<bits/stdc++.h>using namespace std;int n,m;int f[100111][50],logn[10000011];inline int read(){ char c = getchar(); int x = 0, f = 1; while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); } while (c >
2022-01-29 16:27:35
142
原创 线段树模板
#include<bits/stdc++.h>#define ll long longusing namespace std;unsigned ll a[1000001],t[1000001 << 2],ans[1000001 << 2],n,m,o,t2[1000001 << 2];inline ll lc(ll x){//left chrildren 左儿子 return x << 1;}inline ll rc(ll x){/
2022-01-29 16:27:03
122
原创 高精度4则运算模板
#include<bits/stdc++.h>using namespace std;static const int LEN = 1004;int a[LEN], b[LEN], c[LEN], d[LEN];void clear(int a[]) {//读入 for (int i = 0; i < LEN; ++i) a[i] = 0;}void read(int a[]) {//读入 static char s[LEN + 1]; scanf("%s
2022-01-29 16:26:38
288
原创 CF299B Ksusha the Squirrel
这道题很水,暴力就可以出奇迹。如果前面有障碍,那就看能不能跳过去。用 mmm 来存储连续的石子的数量,当 mmm 超过 kkk 时就输出 NO\texttt{NO}NO,然后结束,否则就输出YES\texttt{YES}YES。坑点 : kkk 不能等于连续的石子的数量。(见样例3)代码:#include<bits/stdc++.h>using namespace std;int n,k,m;char a;int main(){ cin >> n >> k
2022-01-27 08:23:13
158
原创 CF239A题解
这题还是比较水的,但是我旁边的巨佬一开始竟然 TLE 了,所以还是不能小看这道题!题意:就是让你把 (x+y)mod k=0(x + y) \mod k = 0(x+y)modk=0 的各种 xxx 值算出来输出。但是如果直接从 1 开始每次加 1 搜的话 TLE 就会跑过来和你玩。那怎么做呢?首先找到 x+y=kx + y = kx+y=k 的情况然后 xxx 每次加上 kkk 这样子就可以过了。代码:#include<bits/stdc++.h>using namespace st
2022-01-27 08:22:47
59
原创 B3602 [图论与代数结构 202] 最短路问题_2题解
正刷着水题,却突然发现了这道题目。刚好是我们昨天学的,于是前来巩固。题意:给我们 nnn 个点,mmm 条边,每个边都有个长度,让我们求从 1 到各个点的最短路径。思路:这道题它的权值(也就是路径)大于等于 111,所以就可以用 Dijkstra 来解这道题。(因为我暂时只学懂了这个算法)由于怕数据点卡我,于是我和题目斗智斗勇,加上了堆优化。这也是很经典的 SSSP 题目(单源最短路问题),值得去刷。对于这种题目有几种做法:1.Dijkstra 算法。2.用了优先队列的 Dijkstra。3.Be
2022-01-27 08:21:51
196
原创 UVA10008 题解
题目链接这道题也很简单,只是有一些小坑点。要一行一行的读入字符串那就得用到 getline 了。然后把那些字母全部转换成大写字母。再拿个数组统计各个字母出现的数量,最后输出。getline用法:getline(cin,s);意思就是把那一行的输入放到 s 那个数组里面。ASCII码表:大写字母和对应的小写字母差是 323232。如果你忘记的话也可以拿小写字母减大写字母。代码:#include<bits/stdc++.h>using namespace std;int n;
2022-01-27 08:21:18
109
原创 P7817 [RC-05] 迷失自我
题目链接首先,我把目光放在了数据点上,一个 222 分,一个 989898 分。一看暴力就只能拿 222 分。但是我们把暴力程序打出来,然后自己手造数据发现,只要 nnn 大于 222 时,输出的都是 000。这是偶然吗?其实不是。接下来我们就来证明 n>2n > 2n>2 时答案都是 000。证明:一个长度大于 222 的串,一定存在一个数字(777 或 999)出现次数大于 111。那么,令 l1=r1=pos1l_1 = r_1 = pos_1l1=r1=pos1,l2
2022-01-27 08:20:49
162
原创 P7840 「PMOI-4」人赢
这道题我在打比赛时竟然没想到有这种做法。对于这道题,首先一看,可以暴力拿 303030 分。代码如下:#include<bits/stdc++.h>using namespace std;int n,m;long long k;int gw;int main(){ cin >> n >> m >> k; if(k == 1){ cout << n; return 0; }else if(k == 2){ cout &
2022-01-27 08:20:16
111
原创 UVA11608 No Problem 题解
题意一年有 12 个月,每个月有一场月赛。本来有 sss 道题。对于第 i 个月,当月的月赛需要 bbb 道题,而每个月会出 aaa 道题,每个月出的题必须要等到下个月才能用。问你每个月能不能举办月赛。思路暴力模拟。坑点1月开始时就是 SSS,其他月份都是上个月剩余的。那个月出的题目这个月竟然用不了,我猜是要审核。这是循环输入的,不要掉坑,样例上很难看出。代码#include<bits/stdc++.h>## using namespace std;int s,a[13],
2022-01-27 08:19:37
69
原创 P1622 释放囚犯题解
前言:这是本蒟蒻第一次提交动态规划的题解,大佬勿喷。这道题是道区间DP的好题啊!首先,我想到的是 fi,jf_{i,j}fi,j 来表示释放第 iii 到第 jjj 个犯人要给的最少的肉。但是,空间和时间显得太大了。因为数据范围里说了 ppp 较小,于是我们就将要释放囚犯的范围从小到大排列。 将 fi,jf_{i,j}fi,j 来表示第 iii 个要释放的犯人到第 jjj 个要释放的犯人最少需要的肉,所以状态转移方程为:f[i][j]=min(f[i][j],f[i][k−1]+f[k+1][j]+
2022-01-27 08:19:17
149
原创 P7901 「PMOI-0」潇湘の雨
原题传送门看完这道题后,便觉得事情肯定不会只有暴搜这么简单。再看看数据范围,太大了吧!于是便知道事情真的没那么简单。进入正题:看到题目首先会想到这三种情况(图有点丑,请见谅!):发现只要没到完整的 2n×2n2n\times2n2n×2n 次,那就不会踩到终点。所以,代码如下:(注意数据范围)#include<bits/stdc++.h>using namespace std;long long n,k,x,y;//注意范围int main(){ cin >>
2022-01-27 08:18:54
138
原创 P5551 Chino的树学
题目意思:给出一颗二叉树的先序遍历,规划一条路径,使得路径上经过的结点的权值之和最大。哇塞,这不简单?直接暴力 DP 即可。思路:你可以发现,一个节点以及它的子树加起来的最大的情况就两种,第一种就是自己加上他的右子树的最大值,第二种就是加上左子树的最大值。所以代码就出来了。(这题竟然没标签!!!建议管理加个贪心和 DP 的标签)代码:最重要的部分:inline int max(int a,int b){ return a > b ? a : b;}int dfs(int dep){
2022-01-27 08:18:22
151
原创 P4109 [HEOI2015]定价
题目直通车题目大意:让你在一个区间内选一个数,使得这个数荒谬度最小。荒谬度:把那个数的末尾的 0 全部消掉之后的长度的两倍。如果删完后的末尾是 5 的话,就再减个 1。思想:先看它的位数,让 ansansans 的初始值位 lll 的最高位,然后在后面加上很多 0(就是 cjcjcj ),直到和 lll 的位数相等。此时,让 ansansans 最高位持续加 1,如果到了 lll 到 rrr 中的话那就看一下除了 0 后最后一位能不能是 5。如果 ansansans 一次都加不了的话那就将 cjc
2022-01-26 15:10:48
535
原创 UVA11455 Behold my quadrangle 题解
这道题重点:如何判断一个图形是不是四边形:任意三条边之和大于第四条边。(其实和三角形判断方法没啥区别)如何判断一个图形是不是正方形:四条边长度相等。(这如果不知道就可以退役了!!!)如何判断一个图形是不是矩形:矩形的对边相等,所以只要给出的四条边里出现了两条长度相等的边,还有剩下的两条边长度也相等,那么它就是矩形。华丽的分割线代码:#include<bits/stdc++.h>using namespace std;long long t;long long a,b,c
2022-01-26 15:09:53
69
原创 P7933 [COCI2007-2008#5] PASCAL
题意:题面的代码转换成 c++ 就是#include <bits/stdc++.h>using namespace std;int n,cnt;int main() { cin >> n; for(int i=n-1;i>=1;--i) { cnt++; if(n%i==0) break; } printf("%d",cnt); return 0;}跳出循环的地方就是除 nnn 以外最大的因数。那我们就从 2 到 n\sqrt{n}n 模拟就
2022-01-26 15:09:03
205
原创 P7960 [NOIP2021] 报数
原题直通车大意:看输入的这个数是否和 7 有关(7的倍数和含有7的倍数),若有关,则输出 -1,否则输出大于这个数且第一个和 7 无关的数。思路:埃氏筛+判断本身埃氏筛:找到一个未被记过的数,把它的倍数都登记一遍。判断本身:把数字的每位都拆出来,判断是否含有 7。做完这两个后就能保证正确性。因为本身含有 7 的都被筛掉了,它的倍数也就没了,根据题目大意所有不满足要求的数就都被筛完了!代码:#include<bits/stdc++.h>using namespace std;i
2022-01-26 15:07:56
546
原创 P3182 [HAOI2016]放棋子
题目直通车大意:问你有多少种方法使 nnn 个棋子同一列,同一行。思路:错排和高精度此题就是将 P1595 加上了高精度。错排模板:f[0] = 1;f[1] = 0;for(int i = 2;i <= n;i++){ f[i] = (i - 1) * (f[i - 1] + f[i - 2]);}高精度模板:void add(int m){//高精乘和高精加,把f[i] = (i - 1) * (f[i - 1] + f[i - 2]) 高精化 int x =
2022-01-26 15:07:22
154
原创 UVA1149 装箱 Bin Packing 题解
题目直通车做法:贪心。怎么贪?(用手贪啊)我们首先把这个数组排一下序,然后看第一个(也就是最小的)能加上后面的吗?如果可以,就看最大能装到哪个。一直到数组内数字全部被包完。这样就能保证是最优的。或者从后面开始往前面,看能加到哪个最大的就可以了。代码:#include<bits/stdc++.h>using namespace std;int t;int main (){ cin >> t; for(int tt = 1;tt <= t;tt++){//t组数
2022-01-26 15:06:04
418
原创 UVA11987 Almost Union-Find 题解
题目大意:背景:在这个问题中,你将实现一个与之相似的数据结构,但不完全相同,您需要编写的数据结构也是并查集,支持以下三种操作:1 ppp qqq: 将包含 ppp 和 qqq 的集合进行合并,如果 ppp 和 qqq 已经在一个集合中,忽视此项操作。2 ppp qqq: 将 ppp 移动至包含 qqq 的集合中,如果 ppp 和 qqq 已经在一个集合中,忽视此项操作。3 ppp: 输出 ppp 所在集合的元素个数和总和。初始时共有 nnn 个集合,分别为 {1},{2}...{n}\{
2022-01-26 15:05:25
846
原创 SP7424 GIRLSNBS - Girls and Boys
题目翻译:一个即将毕业的班级里有 GGG 个女生和 BBB 个男生。你需要在毕业典礼上把它们排成一排。为了给人一种多样化的印象,你应该避免连续坐太多女孩或太多男孩。你决定安排学生是为了减少男女比例。排列的性别规律性是指连续出现的同性别学生(全是女生或全是男生)的最大数量。已知 GGG 和 BBB ,计算所有可能安排中最小的性别规律性。思路:把男生个数平均分成女生的个数份,然后向上取整,就是 ⌈BG+1⌉\left\lceil\dfrac{B}{G + 1}\right\rceil⌈G+1B⌉ 。这就
2022-01-26 15:04:42
251
原创 CSP地狱一日游
Day -?在学校里悠闲地写作业,等到每周六就会接受cy的题目的洗礼(内心:赶紧考完csp解放)Day 0若无闲事地写着学校作业,装作明天啥也不会发生。Day 1 上午解完压缩包后,便用大概20min看完了所有题。思路:第一题:那么大的数据,模拟肯定超,肯定是线性算法。(预计10min)第二题:模拟(预计30min)第三题:对于我来说的大模拟(预计1h30min)第四题:模拟?(预计30min)想的很美好,现实很残酷:第一题,打模拟时,突然想到只要判三种情况即可。(10min做完,预
2022-01-26 14:23:40
45
原创 【寒假魔鬼集训】
Round 2_DS优先队列,栈……这天做了,发射站思路:用一个栈去维护这个数组,可以保证这个栈的单调性。碰到比他高的就退栈。感觉难度:很水。种树思路:用一个优先队列去维护数组,每当弹出一个当前最大的值,就再加入左边的树的值和右边的树的值减去当前弹出的值。如果后面选中了这个新加的值就代表选了那棵树旁边的两棵树。(反悔操作)感觉难度:较难#Round 2_UFS并查集UVA11987 Almost Union-Find写了篇题解,主要就是建虚根比较难想。感觉难度:偏难
2022-01-26 14:17:27
281
原创 P5461 赦免战俘
P5461 赦免战俘题目描述现有 2 ^ n × 2 ^n(n≤10)名作弊者站成一个正方形方阵等候 kkksc03 的发落。kkksc03 决定赦免一些作弊者。他将正方形矩阵均分为 4 个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免,剩下 3 个小矩阵中,每一个矩阵继续分为 4 个更小的矩阵,然后通过同样的方式赦免作弊者……直到矩阵无法再...
2019-09-12 21:28:08
879
原创 P1028 数的计算
P1028 数的计算题目描述我们要求找出具有下列性质数的个数(包含输入的自然数nn):先输入一个自然数nn(n \le 1000n≤1000),然后对此自然数按照如下方法进行处理:1.不作任何处理;2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.输入格式11个自然数nn(n \le 1000n≤1000)*输...
2019-09-12 21:14:30
319
原创 P1706 全排列问题
题解题目描述输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。输入格式n(1≤n≤9)输出格式由1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个场宽。输入输出样例输入 #1 复制3输出 #1 复制1 2 31 3 22 1 32 3 13 1 2...
2019-09-10 21:38:08
570
原创 P1464 Function
P1464 Function题目描述对于一个递归函数w(a,b,c)w(a,b,c)如果a \le 0a≤0 or b \le 0b≤0 or c \le 0c≤0就返回值11.如果a>20a>20 or b>20b>20 or c>20c>20就返回w(20,20,20)w(20,20,20)如果a<ba<b并且b<cb<c...
2019-09-09 21:29:52
278
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人