- 博客(8)
- 收藏
- 关注
原创 CCPC 2020威海站 H. Message Bomb (差分&前缀和)
PTA重现赛入口题意: 有 n个组(初始都为空组), m个学生, s个事件。每次事件输入t, x, y。t == 1: 将学生x加入y组,保证之前不存在。t == 2: 将学生x从y组中删除,保证之前存在。t == 3: 学生x向y组中其他成员宣布一则事件。试求每个学生接收到的事件数。思路:直接利用前缀和与差分的思维处理组员数的变化带来的改变。数组 vg[i]表示第i组总共接收过的事件数,数组vs[i]表示第i个学生总共接收到的事件数,再利用m个set集合存 每个学生加入的队伍情况
2020-10-29 01:32:05 275
原创 Codeforces C. Array Splitting (Round 69 Rated for Div.2) (思维 / 贪心 | 差分)
传送门题意: 试图将一个非递减数列分成k段,使得每段的max-min的和最小,并求得最小值。思路:个人觉得是个贪心,过题后去看博客大多数都是差分思维。将所求的式子整理下就会发现每次的消耗都是每段的段尾减段首,而换个思维就是求 |整个数列的段尾减段首| 再减去期间k-1个缝隙的差的绝对值。那么我们就需要减经量多才会使得最后消耗min。于是我们将所有n-1个可能缝隙的差值排序,取绝对值前k-1大的数进行计算即可啦。代码实现:#include<bits/stdc++.h>#de
2020-10-27 01:41:05 169
原创 Codeforces B. Prime Square (#678 Div.2) (思维构造 / 素数与和数)
传送门题意: 需要你构造一个n*n的矩阵,满足其下三个条件:每个数都在1e5以内每个数都不是素数每一行或列的和都是个素数思路:刚开始一直在想简便的特殊方法,结果一直wa1,最后才想到数据范围这么小应该可以暴力尝试过了(′д` )…彡…彡。我们只需要找n个数满足其和是素数且每个数不是素数即可。那么我们让其中n-1个都是1,只需要再找到一个和数 x 满足 x+n-1 是个素数即可。后期构造的时候让x后移轮换即可。代码实现:#include<bits/stdc++.h>
2020-10-27 01:11:59 365 2
原创 Codeforces A. Reorder (#678 Div.2) (数学思维 / 水题)
传送门题意: 给出数列长度n与正整数m,试问该数列是否满足正好等于m,且除法过程中不是整除(即 5/2 == 2.5)。思路: 仔细观察不难发现其实该题问的就是是否数列和正好等于m。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int>#define low
2020-10-27 01:01:26 194
原创 Codeforces C. Stripe (Round #18 Div.2 Only) (前缀和水题)
传送门题意: 看了半天没看懂那个平方数的意思,理解就是求有几种方法可以一刀将数组切成两半,使得左右两半的和相等。思路: 利用前缀和就很容易求得左右两段分别的和。代码实现:#include<bits/stdc++.h>#define endl '\n'#define ll long long#define int long long#define IOS ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);using namespac
2020-10-27 00:50:55 203
原创 Codeforces B. Barrels (Round 96 Rated for Div.2) (思维)
传送门题意: 现有n个无限大的杯子,第i个杯子中有a[i]升水。你有k次操作,每次能将一个杯子里的水倒入另一个杯子,试问k次操作结束后,含水量最大与最小之间的差值max为多少/思路: 水题嘛,意思搞那么复杂,不就是求前k大数的和咩。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<
2020-10-24 00:26:23 208
原创 Codeforces C. Numbers on Whiteboard (Round 96 Rated for Div.2) (思维 / 贪心)
传送门题意: 现有1到n的n个数字,需要进行N-1次操作,每次选出两个数a与b删除,并把 (a+b)/2新加入集合中。求最后只剩一个数时的最小值。思路: 用一个优先队列,每次取出最大的两个数,并把他们和的1/2上取整新加入集合。真没想到这样能行(#.#),神奇鸭。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#def
2020-10-23 17:25:14 188
原创 Codeforces E. Two Round Dances (#677 Div.3) (思维 / 暴力)
传送门题意: 求将偶数n (2 <= n <= 20) 个人排成两个圈的方法有多少种。思路: 排列组合问题,先组合数选出n/2个人,剩下的人也就确定了,再考虑两个圈的全排列。代码实现:#include<bits/stdc++.h>//#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int>#define l
2020-10-23 16:43:17 216
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人