自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 CSAPP bomblab

CSAPP bomblab

2022-09-14 15:05:59 846 1

原创 CSAPP datalab

CSAPP

2022-09-03 13:16:45 256

原创 AtCoder Beginner Contest 235

AtCoder Beginner Contest 235A - Rotate思路分析:因为他给的数是三位数,我们直接取出每一位,然后拼凑就可以了代码如下:#include <bits/stdc++.h>#define int long longusing namespace std;signed main(){ int x; cin >> x; int ans = 0; int a[3];

2022-01-16 12:03:11 599

原创 AtCoder Beginner Contest 234

AtCoder Beginner Contest 234A - Weird Function思路分析:直接写就行代码如下:#include <bits/stdc++.h>using namespace std;#define ll long longll f(ll x){ return x * x + 2 * x + 3;}int main(){ ios::sync_with_stdio(0); cin.tie(0);

2022-01-09 19:39:01 305

原创 AtCoder Beginner Contest 228

AtCoder Beginner Contest 228A - On and Off思路分析:如果s < t说明是顺序的,所以只要x小于t并且大于等于s即可。如果s > t说明是逆序的,所以只要x >= s或者x < t即可。代码如下:#include <bits/stdc++.h>using namespace std;int main(){ int s, t, x; cin >> s >>

2021-11-21 15:32:45 736

原创 Codeforces Round #753 (Div. 3)

Codeforces Round #753 (Div. 3)A. Linear Keyboard思路分析:无语了,题目总是读不顺,看到output那个minimal我还以为是把手放到一个单词上,看需要多少time来完成敲出字符串。写完一看,答案不对劲,然后发现这题其实就是把字母表重新排一下,然后求两个字母间的距离之差的绝对值。代码#include <bits/stdc++.h>using namespace std;map<char, int> mp;int m

2021-11-03 20:24:10 161

原创 Codeforces Round #751 (Div. 2)

Codeforces Round #751 (Div. 2)A. Two Subsequences思路分析:x实际上就是字符串里最小的字符。剩下的便是y。代码#include <bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin &g

2021-11-01 21:48:19 120

原创 Codeforces Round #752 (Div. 2)

Codeforces Round #752 (Div. 2)A. Era思路分析:答案其实就是这个数减去它改变位置后的pos即可。对于第一位如果不是1,那么它就要在前面插入a[1]−1a[1] - 1a[1]−1个数,来使得它能够<=i<= i<=i,然后要注意的是,在你插入数之后,位于你刚刚插入的位置及其以后的下标都会增加,增加多少呢?其实累加起来就是ansansans,自己推一下就好了。一开始直接想假了,每次都是拿后面那个数减去前面那个数累加。代码#include &

2021-11-01 17:03:04 173

原创 Codeforces Round #750 (Div. 2)

Codeforces Round #750 (Div. 2)A. Luntik and Concerts思路分析:首先我们可以肯定的是a,b,c都大于等于1,所以我们先让它们自己抵消自己,最后a,c只有三种情况。a = 1, c = 1 如果只有奇数个b,我们取一个b * 2 + a抵消c,否则就拿两个b放到一个数组,另外一个放1个a,1个c。a = 0, c = 1 不能抵消。a = 0, c = 0 如果是偶数个b,那么我们把b分成两份,否则,我们就先取出一个b和一对a,c抵消,剩下的就和

2021-10-25 22:47:52 279

原创 Codeforces1575D

思路分析此题采用dfs,注意X选中了之后所有的X值相同,所以需要一个flag来存储X的值。注意前导0要单独讨论,然后就是当’X’或者’_'在第一位时不能选0,其它位可以选0 - 9 任意一个数。代码如下//now-当前位数 flag-X的值 num-当前数的大小#include <bits/stdc++.h>using namespace std;string s;int ans;void dfs(int now, int flag, int num){

2021-10-24 14:54:20 73

原创 AtCoder Beginner Contest 224

AtCoder Beginner Contest 224A - Tires思路分析:判断最后一个字符即可。代码如下:#include <bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); string s; cin >> s; st

2021-10-24 13:44:50 315

原创 Codeforces Round #748 (Div. 3)

Codeforces Round #748 (Div. 3)A. Elections思路分析:令当前值比最大值大即可,如果最大值是它自己,就输出000代码#include <bits/stdc++.h>using namespace std;pair<int, int> a[3];int ans[3];int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.ti

2021-10-20 17:22:07 104

原创 AtCoder Beginner Contest 223

AtCoder Beginner Contest 223A是纯纯的水题,就不说了B - String Shifting思路分析我真的sb,一开始想了好久是不是和全排列有关,然后读了好几遍题目也没有想法。最后看了眼数据范围S串的长度为1000,O(N2)O(N^2)O(N2)是可以过的。然后我是这样想的,对于每一个位置都有可能成为答案的第一位,对于原串在它后面的字符在新串中不改变,在它前面的字符接在最后即可,然后对于每一个位置放在第一位构成字符串存起来,最后sort得到答案。看了眼别人的做

2021-10-18 14:33:32 215

原创 Jumping Monkey ccpc网络赛重赛

问题分析:我们先正向看这个问题。当前树里点权最大的节点对于其他节点来说肯定是都能到的,然后我们统计一下有哪些点,再删掉这个点权最大的点即可,递归就能得到答案。但是那样写可能比较复杂。所以采用了反向的做法。首先,我们把点权从小到大排序好,然后每一次都把当前点u变为与u相连的(已经枚举过的点)的根节点,从而构成一棵新树。最后节点的深度就是其答案。我们考虑第二个样例。我们可以用并查集维护父节点,从样例二可以看到我们加节点2的时候是加在之前与他相连的节点1在新树的父节点,节

2021-10-17 18:46:44 96

原创 糖果机小作业

设计思路代码//machine.h#include <bits/stdc++.h>#define ll long longusing namespace std;struct node{ ll purchase_price; ll selling_price; ll inventory;};class machine{public: ll profit; map<string, node> C

2021-10-14 11:27:21 308

原创 Codeforces Round #747 (Div. 2)

Codeforces Round #747 (Div. 2) EditorialA. Consecutive Sum Riddle思路分析:一开始想起了那个公式l+(l+1)+…+(r−1)+r=(l+r)(r−l+1)/2l + (l + 1) + … + (r − 1) + r = (l + r)(r - l + 1) / 2l+(l+1)+…+(r−1)+r=(l+r)(r−l+1)/2。然后一看令l+r=1l + r = 1l+r=1最合适,那么就有l=r−1l = r - 1l=r−1,

2021-10-09 11:21:33 243

原创 Codeforces1573B

问题描述给你两个数组,a数组里面是1−2×n1 - 2\times n1−2×n中的奇数任意顺序排列组成,b数组里面是1−2×n1 - 2\times n1−2×n中的奇数任意顺序排列组成。问你最少需要多少次操作能让a的字典序小于b。思路分析首先我们要明确两个数组中的元素肯定不同,那么能造成两个数组的字典序大小的就只有两个数组第一个数的大小关系。所以我们只考虑第一个位置即可。那么如何来求最少?我们可以想到的是如果把a,b数组全部都排序,最后得到的b数组中的每一个元素都会大于a数组中该位置及以

2021-10-08 16:37:21 140

原创 Codeforces1514B

问题描述给你两个数n,kn,kn,k,问可以构造多少nnn个最大位数为kkk数按位与为000并且这nnn个数加起来最大的合法序列,答案对1e9+71e9 + 71e9+7取模。思路分析首先我们考虑这nnn个数按位与以后为000这个条件:我们可以知道,如果按位与为000的话,就代表着这nnn个数在每一位至少有一个数在这一位为000。其次考虑和最大,那么我们就可以这样想,既然每一位都会至少有一个数在这一位上为000,那么肯定是刚好一一对应最好,不然这些数加起来不会是最大。因此,我们对于每一位,都

2021-09-27 17:04:18 104

原创 AtCoder Beginner Contest 220 D - FG operation

问题描述现在给你一个长度为nnn的数组,对于每一步,都规定有两种操作。F−F -F− 删掉最左边两个数,并把那两个数相加再对10取模,然后插入到数组左侧。G−G -G− 删掉最左边两个数,并把那两个数相乘再对10取模,然后插入到数组左侧。由于数组长度为nnn,那么我们可以知道在删除两个数到最后只有一个时,只需要n−1n - 1n−1步,并且每一步都有两种选择。问你在这2n−12^{n-1}2n−1种情况中,最终剩下的值为k(k<=9)k(k <= 9)k(k<=9)的情况每种有

2021-09-26 22:40:41 189

原创 Codeforces1527B1

题目描述游戏题,给一个只有000和111的回文串,对每一个人有两种操作:1、将这个串中任意的000变成111。2、如果当前串是非回文状态,可以将000和111排序。问最后谁会赢这场比赛。思路分析由于一开始就是回文串,那么对于Alice来说,只要她选了任意的一个000变成111,那么Bob来说,总能找到和她选的000对称的000,所以Bob必胜,因为Bob可以在最后一回合选择第二种操作。然后就是特殊情况,比如只有一个000,那么肯定是Bob赢。奇数个000,那么就证明这个000是在中心位置,A

2021-09-24 21:09:27 96

原创 Codefoces1529B

问题描述给你一组数,要你求满足条件的最长子串长度。条件是对于这个子串任意的(i,j)(i,j)(i,j)对,都有∣ai−aj∣>=MAX{|a_i - a_j|} >= MAX∣ai​−aj​∣>=MAX,MAXMAXMAX是指留下的子串中的最大值。思路分析实际上,很容易想到,在一组数中,每一个负数和000,我们都可以选上。那么剩下的就是非负数了,那么我们在这个地方就要小心,因为得出来的子串的∣ai−aj∣|a_i - a_j|∣ai​−aj​∣值不同,也没有大小顺序可言,

2021-09-24 18:19:12 73

原创 Codeforces1530C

问题描述参赛者在不同阶段获得成绩,我们只取k−⌊k/4⌋k - ⌊k / 4⌋k−⌊k/4⌋个最高成绩作为参赛者的总成绩。然后目前已经进行了nnn个阶段,但是不知道还会举行多少阶段会使第一个人的成绩大于等于第二个人的成绩。思路分析首先我们想想如何能使这个阶段数最少,那当然是让第一个人在接下来的阶段都是100100100分,第二个人都是000分,这样能保证阶段数最少。那么我们怎么来实现呢?在这里我们用的是前缀数组。那么对于每次加阶段的时候,我们对于第一个人就是加上100100100,然后可

2021-09-24 17:06:25 97

原创 Codeforces1534C

问题描述给你两列数,你可以每次将同一列的数上下交换,要你求出有多少种方案能使每一列每一行不出现重复的数字。思路分析如果把某一列两个数交换了的话,那么这两行必定有数出现两次,所以就要想办法把重复出现的数交换回去,这样的话,最后肯定会有一个正确方案。我们如何来算这个东西呢?经过上面的解释我们可以想到,如果有iii对数能够通过交换使得有一个正确方案的话,我们只需要找到共有多少这样的对即可。这样的对满足什么条件呢?其实我们把第一行该数连上与他同列的数,再将与他同列的数连上第一行这个数所在位置,然后再

2021-09-24 16:21:16 64

原创 Codeforces1534B

问题描述题目要求每个数与前面一个数之差的绝对值之和最小(默认最左端和最右端是000)。你能用一个代价将某个数减少111。使得每个数与前面一个数之差的绝对值之和以及代价之和最小并输出。思路分析我们考虑一个数和他左右相邻的数。如果两个数都比他大的话,他去减一,那么贡献将会是+3+3+3。一个数比他大,一个数比他小的话,他去减一,贡献将会是+1+1+1。两个数都比他小,他去减一,那么贡献将会是−1-1−1。所以我们只需要找到每一个比他左右都大的数,并且把他减到左右最大的那个数即可。代码

2021-09-24 11:36:58 75

原创 Codeforces1574C

问题描述给你nnn个英雄,每个英雄的能力值为aia_iai​,然后有两条龙,你必须派一个英雄去杀其中一条龙,然后派其他的英雄去防御另外一条龙。注意,你选择的英雄的能力值必须要比龙的能力值大,并且,你可以用1coin1coin1coin去提升一位英雄的能力值(当然只提升111点)。要你求能杀死一条龙并且防御另外一条龙的最小代价。思路分析我们直接找到刚好比第一条龙能力值大于等于或者小于等于的英雄去杀那条龙,比较一下两种情况的代价大小即可。代码如下#include <bits/stdc+

2021-09-24 11:09:30 125

原创 Codeforces1574B

问题描述给你三个数a,b,ca,b,ca,b,c,问你是否可以形成一个有mmm对相邻相等的字母对。思路分析我们可以知道,给你的a,b,ca,b,ca,b,c分别代表着A,B,CA,B,CA,B,C的个数。那么我们最多可以得到多少对相邻相等的字母对呢?答案自然是a+b+c−3a + b + c - 3a+b+c−3,为什么呢?因为我们可以知道如果所有相同的字母全部放在一起的话,能形成的对数就是个数减一。我们从最多对数那里看,我们是否能通过某种操作只使这个对数减一呢?答案无疑使肯定的,我们可以把

2021-09-24 10:50:47 119

原创 Codeforces1536B

问题描述给你一个字符串,找到最小的没有在字符串中出现的子串。这里的最小是指,长度最小并且字典序小。思路分析观察到n<=1000n <= 1000n<=1000,所以不用想的是,不可能每一个长度为333的子串都出现(计算一下很好得出这个结论),所以我们可以用向量把长度为333以内的子串储存,然后对每一个在向量中的串在原主串中查找,如果找不到,那么就代表这个子串没有在原主串中出现,输出即可。代码如下#include <bits/stdc++.h>using n

2021-09-24 10:29:01 120

原创 Codeforces1566D1

问题描述这个题目要求有多少对i<ji < ji<j满足ai<aja_i < a_jai​<aj​思路分析我们直接在读入的时候就用multiset对之前读入的数排序好,再用迭代器找到比当前读入数小的数的个数即可代码如下#include <bits/stdc++.h>using namespace std;const int maxn = 310;int a[maxn];multiset<int> s;int main()

2021-09-24 10:18:02 76

原创 Codeforces1537C

问题描述又是给你一组数,要求你求出一个序列,使得第一个数和最后一个数的差值的绝对值最小,并且尽可能使前一项小于后一项思路分析首先俺们先排序然后找到差值绝对值最小的两个数,把其中小的数安排在最左侧,大的安排在最右侧。其次,我们刚刚选择的两个数刚好是两个相邻的数(想一想为什么? 当然是两个相邻的数差值最小啊),然后我们就安排比这个较大数的右侧的数(比这个数大)安排在左侧的后面,再从第一个到较小的这个数安排在之前安排的后面。(即中间会有个骤降的两个数,这样能保证除了中间这个骤降的数外其他的数都是递增

2021-09-23 20:28:59 121

原创 Codeforces1538C

问题描述给一组数,找到有多少对(i,j)(i,j)(i,j)(i<j)(i < j)(i<j)满足l<=ai+aj<=rl <= {a_i + a_j} <= rl<=ai​+aj​<=r。思路分析由于我们要求的是ai+aja_i + a_jai​+aj​,所以无需考虑i<ji < ji<j这个条件。那么我们可以这样想,首先把这组数排序,然后对于每一个aia_iai​用lowerboundlowerboundlowerbo

2021-09-23 20:05:55 81

原创 Codeforces1539C

问题描述给你一组数,给你kkk次机会加一位任意成绩的学生,要你求出能把这组数划分成多少个(最多)稳定的小组。稳定的小组是指这个小组按成绩的大小排序后,每个学生和与他相邻并且比他成绩小的同学的成绩差小于给你的一个数xxx。即ai+1−ai<=xa_{i + 1} - a_{i} <= xai+1​−ai​<=x。思路分析因为题目要我们求能得到最多多少组的稳定的小组,那么我们应该把不满足要求即两位同学成绩之差大于xxx的成绩差放到一个数组或者向量中。因为我们只是把成绩按大小排序了

2021-09-23 19:36:36 82

原创 Codeforces1539A

问题描述给出每个人的开始时间和持续时间,要求不满意度。不满意度的产生就是这个人的结束时间比后面多少个人的开始时间晚。思路分析我们直接找规律,第i个人结束时间为t+x×(i−1)t + x \times (i - 1)t+x×(i−1)见下图代码如下#include <bits/stdc++.h>using namespace std;#define ll long longint main(){ int k; ios::sync_wi

2021-09-23 19:05:06 122

原创 Codeforces1541B

问题描述给一个组数,找出一共有多少对(i,j)(i,j)(i,j)符合i<ji < ji<j并且ai×aj=i+ja_i\times a_j = i + jai​×aj​=i+j思路分析代码如下#include <bits/stdc++.h>using namespace std;#define ll long longconst int maxn = 2e5 + 10;ll a[maxn];int main(){ ios::sync_w

2021-09-23 17:25:34 105

原创 Codeforces1566C

问题描述给一个两行的矩阵,要求最大的MEX值MEX值是指在所选的几列中未出现值的最小值那么假设所选几列中既有1又有0的话他的MEX就是2,依此类推思路分析首先,我们先找出矩阵中既有000又有111的那一列,因为他的贡献为222,并且我们需要把这样的列单独拿出来(使得答案最大)在进行上一步操作后,所剩下的列就是只有000000和111111的了,那么对于单独的000000,他的贡献显然为111,单独的111111,他的贡献显然为000,那么对于两列呢?如果我们能找到相邻两列分别只有000,

2021-09-23 17:12:22 146

原创 AtCoder Beginner Contest 218

AtCoder Beginner Contest 218A和B是纯纯的水题,就不说了C - Shapes思路分析昨天这场C题题意一直没搞懂,最后猜题意做出来的,我猜出来的意思就是可以旋转一圈,然后带KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲的要整体平移、但是好像看官方题解并不是这样的。就很奇怪,但是我猜的这个意思又A了,就很奇怪,然后这场C题题意不太清楚。最后还是说一下我怎么实现的吧。首先我是暴力做的,我把每一个K

2021-09-12 16:04:33 374

原创 HDU - 3074

题目链接https://acm.hdu.edu.cn/showproblem.php?pid=3074问题分析从题目中我们可以看出,我们要进行的操作时区间求值和单点修改。并且在每次更新时需要取模。(好水)代码片段建树void build(ll s,ll t, ll p){ tree[p].l = s,tree[p].r = t; if (s == t) { tree[p].val = a[s];

2021-08-24 10:15:55 64

原创 Codeforces438D(线段树区间取模)

题目链接https://codeforces.com/problemset/problem/438/D思路分析从题意我们可以看出这个题对线段树有三个操作:区间求和,区间取模以及单点修改。首先,对于区间求和和单点修改就不需要说了,这是最经典的线段树操作。对于区间取模,我们可以这样想,我们保存一个区间最大值,如果这个最大值都比模数要小,那么我们也就不需要取模了,这个时间复杂度也是在题目的接受范围的。因此我们在每次操作的时候都应该将区间最大值保存起来。代码片段建树void bulid(ll

2021-08-24 09:50:17 387

原创 HDU - 7048 Link with EQ

题目链接:https://acm.hdu.edu.cn/showproblem.php?pid=7048思路分析:我们可以把状态分为两种。一种是有两端封闭的连续空区间(长度为xxx),那么在这个连续空区间内能坐下的人数为:f[x]=f[⌊(x−1)2⌋]+f[(x−1)−⌊(x−1)2⌋]+1f[x] = f[\lfloor {\frac{(x - 1)}{2}} \rfloor] + f[(x - 1) - \lfloor {\frac{(x - 1)}{2}} \rfloor ]+ 1f[x]

2021-08-11 10:37:40 255 2

原创 Luogu p1414 又是毕业季II

题目链接https://www.luogu.com.cn/problem/P1414问题分析:题目要求我们求出当挑选出k人时所能得到的最大默契程度。那么我们可以将每个数分解得到的各种因子(包括1和它本身)的数量求出来,然后再对最大默契程度从大到小枚举寻找,当这个因子在给出的一组数中能分解出的数量大于我们要选的人即可。代码如下:#include <bits/stdc++.h>using namespace std;const int maxn = 1e6 + 10;int cn

2021-08-05 10:21:17 60

原创 Luogu p2568 GCD

题目链接https://www.luogu.com.cn/problem/P2398问题分析:代码如下:#include <bits/stdc++.h>#define ll long longusing namespace std;const int maxn = 1e7 + 10;int phi[maxn];int primes[maxn];ll sum[maxn];bool isnp[maxn];int cnt = 0;void init(int n){

2021-08-04 20:38:55 61

空空如也

空空如也

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

TA关注的人

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