- 博客(113)
- 收藏
- 关注
原创 CF1011(Div.2)A~D
给出一个字符串’S’,你可以对该字符串进行至少kijsisj问,能否使得给出的字符串小于该字符串反转之后的结果.
2025-03-23 20:22:03
784
原创 #790 div4
G#include<bits/stdc++.h>#include <ostream>using namespace std;typedef long long ll;#define endl '\n'typedef pair<int, int> PII;#define debug() cout.flush()#define for0(i, a) for (int i = 0; i < a; ++i)#define REP(i, a, b) fo
2022-05-11 19:20:00
167
原创 复杂密码生成器
import java.util.*;public class Main { private static final String []range = new String[5]; private static int[] sum = new int[10]; private static void init() { range[0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; range[1] = "abcdefghijkl
2022-05-01 16:55:11
1270
原创 传递闭包模板
Tips:用于解决A<B,B<C等不等式传递问题(也可以用拓扑排序解决)#include<bits/stdc++.h>#include <ostream>using namespace std;typedef long long ll;//#define endl '\n'typedef pair<int, int> PII;#define debug() cout.flush()#define for0(i, a) for (int i =
2022-04-29 15:16:22
161
原创 洛谷P2590[ZJOI2008]树的统计(树链剖分)
题目链接:点击跳转代码如下:#include<bits/stdc++.h>#include <ostream>using namespace std;typedef long long ll;#define endl '\n'typedef pair<int, int> PII;#define debug() cout.flush()#define for0(i, a) for (int i = 0; i < a; ++i)#define RE
2022-04-13 17:33:48
222
原创 CF 1661D Progressions Covering(差分+线段树)
题目链接:点击跳转题意: 有两个长度相等的序列a,b,a序列开始全为0,b序列有题目给出,每次可以选择a中一段长度为k的序列,将该范围的数依次加上1,2,3…k,问最少多少次操作,能使对于任意i,使得ai >= bi。思路: 最后一位只能够使用k来消除,而用k消除也恰好是最快的,那么可以从后往前开始处理,但是要怎么更新序列呢,可以使用差分来给修改的每位都加上i(操作次数),用线段树来维护差分序列,求出的前缀和就是该点的值,从后往前处理一遍即可。代码如下:#include<bits/std
2022-04-12 17:27:22
566
原创 CF 1661C Water the Trees(思维)
题目链接:点击跳转题意: 公园里有N棵树,在奇数天浇水可以使树的高度+1,偶数天+2(每天只能浇一次水,可以选择不浇),问最少需要多少天,能使得所有树的高度一致。思路:如果当前树与最高的那棵树的高度差为奇数,那么就意味着该树至少要占用一次奇数天(只能多,不能少),而其他的均可通过偶数天完成。若偶数天如果大于奇数天,那么可以通过将一个偶数天拆成2个奇数天来减少时间。为保持奇数偶数尽量相等(使天数尽可能少),可以将偶数多出的天数的1/3转化为奇数天,如果存在余数,若余数为1,如果转化,则需要两个1天
2022-04-12 13:04:42
717
原创 CF 1665C Tree Infection(模拟 + 贪心)
题目链接: 点击跳转题意: 给你一棵树,每次你可以依次进行以下操作,1.对于一个节点,如果该节点有至少一个子树被涂色(可以理解为图着色,原译不是涂色)了,那么你可以任选他的子树上的另一个节点使其被传染(可以对多个节点操作,但每个节点的子树在一次操作只能传染一次),2.任选一个节点,使其被涂色(可以选1中操作过的子树中的节点),问最少几次操作能使整棵树都被涂色。思路: 开始想,从大的数量开始涂色,然后每棵更小的子树均可以对该子树提供传染的机会,但是这样子求出的值并不是最小的。错误代码:#include
2022-04-09 20:49:28
967
5
原创 CF 1656D K-good(思维)
题目链接:点击跳转题意: 给你一个数n(2 <= n <= 1e18), 问n是不是k-good数(及分成k个数,k个数的和为n,这k个数取模k的结果均不相同),如果存在多个k成立,输出任意一个即可思路:如果一个数能被拆成一个奇数和一个偶数的积(奇数不能为1),该数就是k-good数。取奇数个,如40 = 5 * 8, 取中间数为8,剩余的数可以依次改为 6 7 9 10。 取偶数个, 如102 = 6 * 17, 则中间数为 8 9,两边依次为3 4 5 6 7 10 11 12 1
2022-03-25 20:17:27
842
3
原创 CF 1654E Arithmetic Operations(枚举)
题目链接:点击跳转题意: 给出一个长度为n的序列a,问最少修改几个数字,能使得序列变成等差序列思路:枚举公差(我取了-300~300),用数组记录每个数字减去位置乘公差的值出现的次数,出现最多的次数就是在枚举范围内的最优解。但是这个枚举不能太大(完整枚举2e5 * 1e5会超时),但是只枚举小范围不能保证正确,如样例3最优解的公差为-20000,那么我们可以遍历数据,取数据中的数的差值作为公差(注意公差要为整数),同样记录,并更新最优解(注意:因为记录的差为2个数的差,但后续遍历没有加上
2022-03-21 21:26:11
697
原创 CF 1654C Alice and the Cake(模拟)
题目链接:点击跳转题意: 爱丽丝有一块蛋糕,她要把蛋糕切成n份,每一次操作,她会选择一块蛋糕(另大小为A),将其切成两半,两块大小分别为A / 2, (A + 1) / 2,及分成整数的两半,如果原大小为奇数,则一块会大1,现在给出一个序列,问有没有可能为一块蛋糕经过n - 1次操作后得到的思路: 由每一块拼回去会因为有不同的拼接操作无法判断,可以逆向思维,模拟一块完整的蛋糕切成现在的大小序列,通过维护两个最大堆,如果模拟的堆顶小于该序列,说明无法切出这个序列,输出NO,如果等于,说明序列中的一个元素已
2022-03-21 12:53:43
479
原创 Java IO
//--------------------------INPUT READER---------------------------------// static class fs { public BufferedReader br; StringTokenizer st = new StringTokenizer(""); public fs() { this(System.in); } public fs(InputStre
2022-02-26 21:24:43
258
原创 Codeforces Round #770 (Div. 2) B. Fortune Telling
题目链接:点击跳转题意: 有一个长度为n的数组a,对于数组中的每个数,有两种操作方法,1.x + a, 2. x ^ a(^为异或符),Alice开始拥有的数为x,Bob拥有的数为x+3,每个人必须从数组a的开始到结束每个数选择一种方式进行操作,问谁的数能变成y(题目保证成立)。思路: 每一个数都有两种操作可能max(n) = 1e5,那么可能性有2的1e5次,但是仔细想想发现,不管是异或或是加上,对于最后一位数的二进制的结果是相同的(1 + 1(发生进位位数变回0) = 1 ^ 1, 0 + 1 =
2022-02-07 15:00:45
703
原创 Codeforces Round #770 (Div. 2) C. OKEA
题目链接:点击跳转题意: 商店有n排货架,每排有m个位置能装货物,货物的价格从1到n*m(每个价格一个),店里有一个机器人会从货架每一行的头开始取价格,每取一个价格加上后会计算平均价格,但是这个机器人很特殊,他遇到带小数的数字时会故障,问有没有排列能使机器人不会出现故障思路: 构建等差数列,根据行数的奇偶性来排列数字(如第一行:1 3 5 7 9, 1 3含两个1 和一个2,那么是2的倍数,1 3 5,含3个1和3个2,那么是3的倍数,以此类推),那么怎么判断不成立的情况呢,可以计算我们构建数列的最大值
2022-02-07 14:40:36
637
原创 2022牛客寒假算法基础集训营3 C 智乃买瓜(another version)
题目链接:点击跳转题意::和上题的区别就是现在是已知每个重量的西瓜能有多少种取法,求该组西瓜的重量(答案不唯一)思路::从前往后处理,如果当前这个重量增加了西瓜,因为可以买半个,那么一定会影响到前面的值导致错误,所以每个重量都认为从半个西瓜得到的,每增加一个使用上一题的dp(链接:点击跳转)来记录当前西瓜所能组成的数量,然后和输入数据比较,如果不够,就继续添加。代码如下:#include<bits/stdc++.h>using namespace std;typedef long
2022-01-29 18:48:05
1050
原创 2022牛客寒假算法基础集训营3 B 智乃买瓜
题目链接:点击跳转题意:有n个西瓜,每个可以买整个和买半个,问如果他想要购买西瓜的重量和分别为k=1,2,3…M时,有多少种购买西瓜的方案。思路:将每个西瓜和已经买下的使用dp进行组合,注意半个和整个要独立存入代码如下:#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll MOD = 1e9 + 7;const int N = 1e3 + 5e2;signed main() {
2022-01-29 18:39:26
768
原创 牛客练习赛95 C-Division
题目链接:点击跳转题意:给出一个长度为n的数组,每次可以取长度大于等于k的一段对里面的数除二(向下取整),问能不能将里面所有数变为1代码:def get_ans(self): # 计算该数几次操作后变为1 ans = -1 # 因为是变为1,所以要减去一次 while self: ans += 1 self >>= 1 return ansdef main(): T = int(input()) N = 10
2022-01-21 14:17:58
467
原创 牛客练习赛95 B-Non-interger Area
题目链接:点击跳转题意:题目给出n个x,y坐标都是整数的点(有重复点),问存在几种选法可以使得选取的三角形面积不是整数思路:画完图后发现,如果三角形的三个顶点都在整数坐标上,那么构成的三角形面积就相当于左下右上(左上右下一样)构成的一个矩形,减去多余的两个或者三个三角形的面积后剩下的,因为构成的三角形边长均为整数,那么减去的面积只有两种情况,整数,或者带0.5的小数。然后把所有点归纳一下,可以分为四类:x奇y奇,x奇y偶,x偶y奇,x偶y偶,算了一些数据后发现,每个同类的点至多在构成三角形中只能出现一次
2022-01-21 13:21:14
527
原创 Hdu3038 How Mang Answers Wrong
题目链接: 点击跳转题意:题目会先输入n,m,分别表示有n个节点,m个回答,每个回答会告诉你节点l到节点r之间权值的总和(包含l,r),当然,回答不一定是对的,需要我们根据输入顺序判断是否有错即可。思路:使用sum数组记录子节点到父节点的总和(l需要减一,因为l的权值也是包含在内的),构建带权并查集,合并时注意因为两根节点合并会出现一条反边,即sum[find(l)] = - sum[a] + sum[b] + v;所以这个权值是要被减去的,然后判断是否合理是看两个点在同一颗树上时,两者的差值与输
2021-11-24 20:24:49
196
转载 unordered_map的哈希模板
模板来源:HKer_YM的博客struct custom_hash { static uint64_t splitmix64(uint64_t x) { x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >&g
2021-11-17 19:55:22
132
转载 主席树模板
模板来源:HKer_YM的博客1求区间第k大#include <bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN = 2e5 + 5;const ll MOD = 100000007;ll a[MAXN], b[MAXN], n, m, q, sz;int lc[MAXN << 5], rc[MAXN << 5], rt[MAXN << 5], sum[M
2021-11-17 19:51:05
185
原创 KMP算法模板
const int MAXN = 1e5 + 5e2;int Next[MAXN];char str1[MAXN], str2[MAXN]; //这里以str1为母串,str2为子串void getNext() { Next[0] = -1; int len = strlen(str2); int j = 0; int k = -1; while (j < len) { if (k == -1 || str2[j] == str2[k]
2021-11-17 19:41:19
81
原创 网络流模板(更新中)
1.dinicconst int MAXN = 2e3 + 5;const int INF = 0x3f3f3f3f;struct Edge{ int to,val,nxt;}e[MAXN];int head[MAXN], deep[MAXN];int n, m, s, t, cnt;ll res;inline void init() { for (int i = 1; i <= n; i++) head[i] = -1; cnt = 0;}inli
2021-11-17 19:20:08
143
转载 马拉车算法模板
模板来源:HKer_YM的博客1.求最长回文长度或回文子串个数//求回文串的个数inline int Manacher(string s){ //转换字符串 memset(hw, 0, sizeof(hw)); int len = s.length(); string nowString = "$#"; for(int i = 0; i < len; i++){ nowString += s[i]; nowString +
2021-11-16 22:01:52
274
原创 并查集模板
const int MAXN = 1e5 + 5e2;int bin[MAXN];inline int find (int x) { return bin[x] == x ? x : (bin[x] = find(bin[x]); }inline void merge(int a, int b) { int fa = find(a); int fb = find(b); if (fa != fb) { bin[fa] = fb; }}
2021-11-16 21:57:48
57
转载 各种筛模板
模板来源:HKer_YM的博客1.线性筛// 复杂度: O(n)void init() { phi[1] = 1; for (int i = 2; i < MAXN; ++i) { if (!vis[i]) { phi[i] = i - 1; pri[cnt++] = i; } for (int j = 0; j < cnt; ++j) { if (1ll * i * pri[j] >= MAXN) break;
2021-11-16 19:03:33
320
原创 Hexo博客搭建
1.安装Nodejs我用的是ubuntu,所以直接apt$ sudo apt install nodejs1.2安装npmnpm是nodejs的包管理工具$ sudo apt install npm2.安装hexo这里建站是使用hexo快速生成的$ sudo npm install --unsafe-perm --verbose -g hexo2.1然后初始化$ hexo init blog$ cd blog$ hexo g$ hexo s3.安装pm2我这边是部署在服
2021-11-12 13:04:50
76
原创 2021 ICPC 江西省大学生程序设计竞赛 H Hearthstone So Easy
题目链接:点击跳转题意:每个玩家开始有n点生命值,每回合可以造成k点伤害或者恢复k点生命值(生命值不能超出上限),同时,每个玩家都进入疲劳状态,即回合开始时会受到伤害(第i个自己的回合受到i点伤害),生命值为0就输了,问谁能获胜。思路: 简单推了一下,发现第一回合无法解决掉第二个玩家,先手因为疲劳值会更高,所以都会输,即当n > k + 1时,先手必败,其他时候先手必胜(注意先手只有1点生命值的时候会在开局时失败)。代码如下:#include<bits/stdc++.h>usin
2021-11-09 20:52:47
359
原创 计蒜客 T1595 迷宫(一)
题目链接:点击跳转这题dfs和bfs都可以解决,这里就结合一下,把问题转化为网络流,用dinic算法解决。对于每个非*的点,都向四周所能到达的地方建一条流量为1的边,如果最后T点有流量能到达,则说明S能到达T点。代码如下:#include<bits/stdc++.h>using namespace std;typedef unsigned long long ll;const int MAXN = 5e3 + 5e2;const int INF = 0x3f3f3f3f;#d
2021-10-20 20:14:00
271
原创 Hdu3046 Pleasant sheep and big big wolf(最小割)
题目链接:点击跳转可以用网络流解决,难点在于如何建图。针对每一个点,他们都可以移动到四周的点上,那么对于每个点,向四周的点建一条流量为1的边,对于每一个1的点,建一条源点到这个点的边,流量为inf,对于每一个2的点,建一条这个点到汇点的边,流量为inf。这样子,这个问题就被转化为最大流问题,因为最大流=最小割,那么最后得到的就是题目要求的答案。代码如下:#include<bits/stdc++.h>using namespace std;typedef unsigned long
2021-10-20 20:01:36
78
原创 Hdu3549 Flow Problem(网络流)
链接:点击跳转网络流模板题代码如下:#include<bits/stdc++.h>using namespace std;typedef unsigned long long ll;const int MAXN = 2e3 + 5;const int INF = 0x3f3f3f3f;#define endl '\n'inline void IO_STREAM() { ios::sync_with_stdio(false); cin.tie(nullptr)
2021-10-20 18:54:35
89
原创 洛谷P3376【模板】网络最大流
链接:点击跳转在开始建边的时候同时建一条反向边,然后在减少边权的时候给反边加上边权,每一次寻找从s到t的独立路径,记录前驱和该路径所在的数组下标,更新所能到达该点的流量(为该路径的边权和前驱的流量中的较小值),直到到达t点,返回t点得到的流量,如果到达不了t点,即不存在增广路,则算法结束,如果有增广路,将流量加入结果,将该路径上每一个边都删除该流量值,反边则加上流量值#include<bits/stdc++.h>using namespace std;typedef unsigned
2021-10-19 22:26:30
152
原创 北京信息科技大学第十三届程序设计竞赛暨ACM选拔赛 D 旅行家问题2
示例1输入:31 92 14 1输出:11示例二输入:64 28 43 02 37 10 1输出:13思路:重现的时候没过,之后看了过题的代码才明白。这题首先要求所有山都要经过然后回到出发点,也就意味着所有梯子都是要被用到的,往高的山走如果梯子不够长就要做飞机,这个是额外花费。既然所有梯子都要被用到,那么就在输入的时候就可以先把花费记起来,然后用贪心的思想,如何避免额外的花费呢,那就是每次都尽量往能到的最高的山上去,但是这样不容易维护,换一种思路,把数组按高.
2021-09-11 18:29:44
186
原创 CF1118D2 Coffee and Coursework (Hard Version)(二分)
题目描述InputThe first line of the input contains two integers n and m (1≤n≤2⋅105, 1≤m≤109) — the number of cups of coffee and the number of pages in the coursework.The second line of the input contains n integers a1,a2,…,an (1≤ai≤109), where ai is the caf
2020-09-02 22:54:49
250
原创 CodeForces 1118C Palindromic Matrix
Palindromic Matrixtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputInputThe first line contains one integer n (1≤n≤20).The second line contains n2 integers a1,a2,…,an2 (1≤ai≤1000) — the numbers t
2020-09-02 22:02:57
173
原创 POJ 2777 Count Color(线段树+二进制存值)
DescriptionChosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.There is a very long board with length L centimeter, L is a positive integer, so we can evenly divide
2020-09-01 23:01:45
105
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人