![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
思维
入门
ddgo
给我高高飞起来啊!(ACM退役,转JAVA后端了)
展开
-
Trick or Treat(三分)
题目地址题目要求在y=0上找一个点,使得所有村庄点到这个点的最远距离最小。y=0,这条线从左往右走,会发现距离是线减少后增加,是一个向下凸的函数。所以用三分。AC代码#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace std;typedef pair<int,int> pii;原创 2020-12-05 23:45:42 · 266 阅读 · 0 评论 -
LC1665. 完成所有任务的最少初始能量(推公式贪心)
假设当前最少能完成所需的能量为P.且:当前任务的序列为(a1,m1) … (a2,m2)…(an,mn)则p >= m1p >= a1 + m2p >= a1 + a2 + m3p >= … + an-1 + mn假设:当前的两个状态是。p >= a1a_1a1 + a2a_2a2 + …+ an−2a_{n-2}an−2 + mn−1m_{n-1}mn−1p >= a1a_1a1 + a2a_2a2 + …+ an−2a_{n-2}an−原创 2020-12-05 23:28:57 · 1296 阅读 · 0 评论 -
纽扣 (简单博弈)
题目地址类似以前的简单博弈,只有一对由K数量的石头,每次最多取L次,求后手获胜的概率当k%(L+1) == 0 ,后手获胜,现在求解L,枚举一下就行了。没了解为什么可以 , 去学一下那个简单博弈 巴什博弈#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace std;typedef pair原创 2020-10-23 00:15:12 · 95 阅读 · 0 评论 -
交税
题目地址由题目分析得到。把税分成尽可能少的质数堆。每次找到 比n小的最大质数,注意两个质数间的距离很小,所以我们直接枚举一下,再用sqrt(n)去检查是否为质数就可以了。是的话就cnt++,且 n-= 当前质数。直到 n <=2.复杂度大致为 200 * 常数 * sqrt(n)代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int原创 2020-10-22 23:57:38 · 272 阅读 · 0 评论 -
185: 前缀字符串 (图,思维)
题目地址对于每一种关系(a是b的前缀字符串),我们可以构建出一条有向边 a->b,把所有边连起来之后,我们可以得到一个类似于下面的图会得到一个有多个连通分支的图。转换题意,使得选择某些节点,让任意的两个节点都没有连接关系,且选择的节点最多。只需把一个连通分量中出度为0的点加入集合就可以了。因为这表示这个点不能成为所有点的前缀。怎么保证是最多?证明选择有出度的比没出度的更差就行。选择有出度的,则与他相连的所有点都不能被选取,会导致至少1个无出度和若干有出度的节点不能被选取,而基于构建出来图原创 2020-10-14 11:16:07 · 176 阅读 · 0 评论 -
荷兰三国旗问题 线性在位算法
给 RWB 排序,所有R在前,W在中,B在后1: 左右设置一个指针 0 - l 代表R r ~ n-1 表示B ,用m表示当前处于哪个位置。从左到右如果此时是R,则 l++ 且与当前这个位置的元素交换,此时m++,这里不用担心交换了一个B过来,因为开始时 l 与m同步,产生差距的地方自由只有是W的时候。故交换过来的一定会是W如果此时是W,m++如果此时是B,则r–且与这个元素交换,此时m不变,因为可能交换的又是一个Bint n;string s;void _sort(){ int l =原创 2020-10-11 11:14:28 · 427 阅读 · 0 评论 -
巧克力块谜(二叉树的性质论证)
有一块n x m 格的巧克力,我们要把它切成n x m 个 1x1的小块,只能沿直线切,而且不能同时几块同时的切。先只考虑一边,我们把它分成全是1.对于任意的长度,都可以像二叉树那样分解(用网上的一种完全二叉树的定义来说下图即为完全二叉树)。如图可以知道,分解的次数就为非叶子节点的个数,设为x . 则总点数为 2x+1 (完全二叉树的性质), 又由一个数可以分解成2n-1个点(归纳法) 故 x = n-1.即 最少的操作次数为 m-1 + m*(n-1) = n*m-1.后面 (n-1) *原创 2020-10-09 15:31:51 · 1438 阅读 · 0 评论 -
快速幂的两种方法(递归和迭代)
递归快速幂:减常因子的思想。对于ana^nan :当n为偶数的时候 原式 = (an/2a^{n/2}an/2)2当n为奇数的时候 原式 = (an/2a^{n/2}an/2)2 x a当n为0的时候 原式 = 1代码:int dfs(int a,int n,int mod){ if(n == 0) return 1; int k = dfs(a,n/2,mod) % mod; if(n % 2) return k*k%mod*a%mod; return k*k%mod;}迭代快原创 2020-09-28 23:33:30 · 384 阅读 · 0 评论 -
Codeforces Round #664 (Div. 2) A~D
A:回文满足条件就是最多只有一个是奇数。题上的操作可以把每一个数的奇偶性翻转。直接特殊判断一下就可。代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<iostream>#include<algorithm>#include<cstring>#include<map>#define int long long#define sc scanf原创 2020-08-26 17:13:55 · 75 阅读 · 0 评论 -
Codeforces Round #662 (Div. 2)
A:第一次操作把最外环处理,结下来每次操作会把一个环处理完,并且向里面的一个环处理。可以的出为n/2+1;#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long long#define sc scanf#define pf printfusing namespace std;typedef pair<int,int>原创 2020-08-25 13:43:21 · 122 阅读 · 0 评论 -
Educational Codeforces Round 93 (Rated for Div. 2)A~D
A:a[1] + a[2] > a[n] 最小的两个加起来都比第三边大,则-1.#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<iostream>#include<algorithm>#include<cstring>#define int long long#define sc scanf#define pf printfusing namespace原创 2020-08-25 00:28:49 · 70 阅读 · 0 评论 -
Codeforces Round #665 (Div. 2) A~D
A:特判情况,当n是<=k 的时候,都可以把让B为0点,A为n点。否则:当k时奇数的时候,AB,OB的距离差会构成全为奇数的长度。反之为偶数。#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<iostream>#include<algorithm>#define int long long#define sc scanf#define pf printfusing原创 2020-08-24 14:21:29 · 154 阅读 · 0 评论 -
poj 1845 Sumdiv (约数的和,快速幂)
只求a的约数和是很好求的,求ab 也是一样的,只不过是多了些项(1+p+p2+p3+…+pb*c)*(…)…显然,每一项里面都是一个等比数列,且为(pb*c+1-1)/(p-1).当分子有逆元,即原式为(pb*c+1-1)*qmi(p-1,mod-2).否则,可以知道一个括号里面的项都会被取mod为1 即-> b*c+1代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<iostream原创 2020-08-21 00:55:47 · 132 阅读 · 0 评论 -
最幸运的数字(欧拉定理)
题目地址对于所有的88888… 可以用y = 8(10x-1)/9 来表示。由题,即求一个x,使得L|y ,设d=gcd(L,8).化简 -> 10x = 1(mod 9L/d)引用一个定理:若正整数a,n,互质,则满足ax = 1(mod n) 的最小正整数x是phi[n]的约数。phi为欧拉函数。题目数据较大,快速幂里面开两个__int128#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#includ原创 2020-08-20 17:17:02 · 321 阅读 · 0 评论 -
2020牛客多校第三场 E
给你一个a序列,让你求出对于某个p序列和q序列,pi!=qi 使得它们花费的费用最少。对于p序列的定义,可以知道,下标和值是交换的,即对于 i,j 这两个位置,有pi = j, pj = i,p(pi) = i,p(pj) = i.对于费用的计算,我们知道,只有两个值差不多相同的减去才可能最小。故把a sort一遍,此时构造p,上面对p序列的定义和对费用计算的理解,知道,只需要将p按1~n构造后,再把相邻的交换一下,就可以的到p数组.q数组为了满足次小,故与p构造差不多,只需要将(1 ~ n)序列原创 2020-08-19 17:32:29 · 116 阅读 · 0 评论 -
acwing Hankson的趣味题
题目地址对于lcm(b,x) = b1. 可以知道x是b1的一个约数。解法1: 故可以取求d的所有约数然后判断是否同时满足两个条件。解法2:假设b1通过唯一分解定理分解出来了所有质数。 对于每一个b1的质数p,假设a0,a1,b0,b1,x对应的个数为ma,ma1,mb,mb1,和 mx.考虑 gcd(a,x) = a1: -> gcd就是求两个数进行唯一分解后所有相同质因子中次数最小的乘积所以我们可以得到:1: 当ma > ma1 时,mx = ma12: 当ma = ma1原创 2020-08-18 18:46:11 · 151 阅读 · 0 评论 -
acwing 余数之和 (整除分块)
题目地址对题目化简 -> k mod i = k - ki\frac{k}{i}ik x i -> 即求 n x k - ∑i=1n∗i\sum_{i=1}^n * i∑i=1n∗i 而后面那个就是整除分块的基本模板,算的时候套一个等差数列求和公式。代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long long#原创 2020-08-17 22:32:08 · 128 阅读 · 0 评论 -
2020牛客多多校第七场 D(整除分块)
思路:1 : 从 第一个操作 知道所有 1,k 都是 传奇元组 ,再对(1,1)运用2操作,知道所有(x,1)都是传奇数组。故有 n+k-1个2: 对1,2 1,3 ,1,4 …进行操作2 一直循环操作下去 发现是 第一位数 是 xk+1,故若第一位 - 1 是第二位的倍数则 是传奇数组。3 同上,进行操作3,会发现, 第一位是 xk ,故若第一位是第二位的倍数,则是传奇数组。故即使求 对于所有的1~k,找到n是k的倍数 的个数和k是n-1倍数的个数。找倍数的,n/k 就可以知道有多少个。i原创 2020-08-10 16:53:39 · 89 阅读 · 0 评论 -
hdu多校1 Distinct Sub-palindromes
题意: 求长度为n的字符串(全为小写)所构成的最少数量的回文子串的数量。当 n = 1 -> 261当n = 2 -> 262 -> ab 和 aa 这种样子当n = 3 -> 263 -> abc 和 aaa 和 aab 和 aba 和baa 即每个位置都可以任意填一个字母,所得到的所有子回文串都为3个。当n>3 是,最短的情况只有 abc-> 这种循环下去,此时要保证每个位置的字母不同,可以取n=4然后再用n=3上面的的几个例子来判断,都会增加,原创 2020-08-17 16:19:25 · 101 阅读 · 0 评论 -
2020牛客多校第十场 E
左边的空位可以由右边的填补,所以只需要求一下前缀和的平均值上取整就可以了。代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long long#define sc scanf#define pf printfusing namespace std;typedef pair<int,int> pii;typedef l原创 2020-08-17 13:04:38 · 91 阅读 · 0 评论 -
2020牛客多校第十场 A
首先大胆猜测,每次先找2 * x%p,如果被找过或为0,则找3 * x%p,且3 * x%p != 0 ,除非找到n-1位,否则输出-1.证明: 对于任意的p,从任意一个数开始, 一直走2 * x%p 或者3 * x%p 一定会形成环(一个或多个)。我们可以从一个环走到另一个环直到构成一个合法序列,或者走不动。例如先从任意一个点出发,比如1。先走2 * x%p ,当走到某个点的时候,从这个点往3 * x%p 这个环跳动,如果都跳不动,则不会有合法序列,循环下去。代码:#define IOS ios原创 2020-08-17 11:27:26 · 108 阅读 · 0 评论 -
2020牛客多校第九场E
求gcd(x,y) 无非就是求x和y的所有质因子表示中,取相同质因子且次数最小的,例如 gcd(2,3) -> 21 31 -> 1(没有相同的) gcd(2,8) 21 23 -> 2 gcd(2,12) -> 21 22 X 31 -> 2先想暴力做法,先把x,y用唯一分解定律分解出来,之后对于每一个相同的质因子,两个循环,判断哪个的次数小就取哪个。这样无非就是超时。cx 为 x的一个质数的次数,cy同理所以,我们可以直接将两个循环拆开,对于i*cx,原创 2020-08-16 16:37:35 · 151 阅读 · 0 评论 -
最佳牛围栏(二分,前缀和)
题目:农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头。约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。围起区域内至少需要包含 F 块地,其中 F 会在输入中给出。在给定条件下,计算围起区域内每块地包含的牛的数量的平均值可能的最大值是多少。输入格式第一行输入整数 N 和 F ,数据间用...原创 2020-03-02 00:52:01 · 202 阅读 · 0 评论 -
K倍区间
题目链接给定一个长度为 N 的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai+1,…Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。你能求出数列中总共有多少个 K 倍区间吗?输入格式第一行包含两个整数 N 和 K。以下 N 行每行包含一个整数 Ai。输出格式输出一个整数,代表 K 倍区间的数目。数据范围1≤N,K≤100000,1≤Ai...原创 2020-03-17 22:53:17 · 113 阅读 · 0 评论 -
Calculate Sum-Of-Absolute-Differences
题目:给你N个正整数,求两两之差的绝对值之和。 比如有4个数分别为 3,2,6,5,则答案为 |3-2| + |3-6| + |3-5| + |2-6| + |2-5| + |6-5| =14输入测试有很多组,对于每一组测试:第一行为一个正整数 N( 2<= N <=20000)。第二行有N正个整数,每个数不大于 1000000。输出每组测试输出一行。测试数据保证结果在i...原创 2020-02-25 21:50:39 · 634 阅读 · 0 评论 -
三角平方数
题目:最近毛哥买来一本数论方面的书《数论概论》,这本书上定义了两个很有趣的数:三角数,平方数。但是书上出了一个难题:当三角数和平方数相等时,叫做三角平方数。问你第n个三角平方数是什么。毛哥想了很久都不会,你能帮他找出第n个三角平方数吗?输入多组数组,输入一个数n(1<=n<=25)输出输出有两个数,第n个三角平方数(分别输出是第几个三角数和第几个平方数,中间用空格隔开)输...原创 2020-02-22 21:09:09 · 735 阅读 · 0 评论 -
求众数o(1)空间做法
题目:给你一个n个数的数列,其中某个数出现了超过n/2次即众数,请你找出那个数。(注意时空限制)输入第1行一个正整数n。(1<=n<=1000)第2行n个整数用空格隔开。整数的大小不超过int,可能为负。输出一行一个正整数表示那个众数。输入:53 2 3 1 3输出:3时空限制 :1000ms/300kb;没错卡空间 虽然数据比较小,但是这题的目的就是卡空...原创 2020-02-28 18:06:13 · 501 阅读 · 0 评论 -
又见GCD(求一组数中任意两个数的最大gcd)
题目:哈特13最近在学习数论问题,然后他智商太低,并学不懂。这不,他又碰到不会的题了。题意非常简单:有n个数字,求出这些数字中两两最大公约数的最大值。你一定要帮助他解决这个问题啊。输入多组输入,约25组,直到文件末尾。每组数据占2行,第一行为数字个数n,2<=n<=100000第二行即为对应的n个数,a1到an,1<=ai<=100000输出输出问题的...原创 2020-04-08 18:01:17 · 1644 阅读 · 0 评论 -
Codeforces Round #655 (Div. 2) D
题意就是 选出(n+1)/2 个点且只有两个点相邻并计算出它们的和 ,求出最大值。对于 2 1 3 7 8 这个序列 假设以第一个点开始选,就会有 238 237 217但是不会有 213 128 因它们是连续的3个 再最后合成的时候,必定会损失1个。对于一个序列,我们去任意一个为开头隔空选取,最后一定会存在,两个点相邻的情况,且相邻的两个点是开头和开头前一个比如上述 , 238 就是以 2开始选,237就是以3开始所以可以得到,最后和成的值为 S(以i为开始点,往后隔空选取最后取到a[原创 2020-07-14 22:21:12 · 127 阅读 · 0 评论