![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【思维/构造】
张松超
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #532 (Div. 2) (A,B,C,D,E,F)
A. Roman and Browsern个数只有(1/-1),你可以选择一个位置b,然后把所有c位置的数删除,c=b+i*k ( i 可以为任意整数),求的最大值思路直接暴力枚举b然后搞一遍就OK#include <bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5;int n, k, a[M...原创 2019-03-27 17:07:26 · 534 阅读 · 0 评论 -
Codeforces ~ 1007C ~ Reorder the Array(思维)
题意给你一个长度为n的数组a,对他进行重排(假设重拍后为b数组),最多可以使得多少个位置b[i]>a[i]?题解n - 出现最多的那个元素的个数就OK,因为数据较大所以用map桶排。或者模拟也行。#include <bits/stdc++.h>using namespace std;const int MAXN = 1e5+5;const int INF = 0x3f3f3...原创 2018-07-14 16:44:08 · 507 阅读 · 2 评论 -
Codeforces ~ 1004C ~ Sonya and Robots (思维 + 桶排)
题意给你n个数字,让你从这个序列中选一对数(a,b),使得从左边数第一个a出现的位置 < 从右边数第一个b出现的位置,问符合要求的对数有多少个?题解对于每一个数字,他跟他后面的数字都可以组成这样的对,但是这样会有重复。重复情况①对于当前数字后面有两个相同的数字,其实算一次,比如1,2,2,其实只有一对(1,2),所以我们需要维护每个数字后面有多少个不同的数字,桶排就好了,过程中统计不同的数字...原创 2018-07-06 11:06:22 · 343 阅读 · 0 评论 -
Codeforces ~ 1004B ~ Sonya and Exhibition (智商题?)
题意有两种花(玫瑰和百合),现在有n个花盆,m个人,每个人会参观[L,R]区间的花,然后给出一个赞赏值,赞赏值为该区间内两种颜色的花的个数相乘。怎么安排这些花,使得获得的总赞赏值最大?题解直接输出010101...就OK。因为这样保证了任意一个区间两种花的个数都是一半一半的。#include <bits/stdc++.h>using namespace std;const int ...原创 2018-07-06 10:41:01 · 403 阅读 · 0 评论 -
Codeforces ~ 1003E ~ Tree Constructing (贪心)
题意让你构造一个节点数为n,直径为d,且所有点的度数均小于k的树。题解我们先用1~(n+1)把直径做出来,然后用dfs去添加其他结点,我们可以在第i个结点去挂上一棵深度不超过min(i-1,d-i+1)的树,注意在生成这棵树的时候每个结点的度数不能超过k。总结点数==n时,及时结束。那么什么时候无解呢,①节点数小于等于直径(这样直径都搞不出来),②直径>1且每个点的度数不能超过2,③n个结点没有全...原创 2018-07-06 00:34:41 · 364 阅读 · 1 评论 -
Codeforces ~ 1003B ~ Binary String Constructing (构造)
题意让给你构造只有01的串,含有a个"0",b个"1",总长度为n(n=a+b),且有且仅有x个位置s[i]!=s[i+1]。题解原创 2018-07-05 13:36:31 · 352 阅读 · 0 评论 -
Codeforces ~ 1006F ~ Xor-Paths(dfs + 中途相遇法)
题意问你从(1,1)到(n,m)异或和为 k 的路径有多少条?只能向右和向下走。 思路我们从(1,1)到(n,m)直接爆搜会超时,我们可以从前往后搜一半记录走到横坐标为x的点的时候路径有多少条,从后往前搜一半,终点a[x][y]会被两条路都统计进去,在^a[x][y]就好了,统计答案即可。#include<bits/stdc++.h>using namespac...原创 2018-07-17 12:20:21 · 581 阅读 · 0 评论 -
CodeForces ~ 998D ~ Roman Digits (打表找规律)
题意四个罗马数字'I','V','X','L'分别表示1,5,10,50,问用这四个罗马数字组成一个长度为n的串能够表示多少个数字?“XI”和“IX”相等都表示的是11。题解当时没做出来,后来补的。暴力计算前面一小部分数据,可以发现从11往后是等差数列,公差为49。注意开long long即可AC代码:#include <bits/stdc++.h>using namespace s...原创 2018-07-04 13:15:15 · 344 阅读 · 0 评论 -
CodeForces ~ 998C ~ Convert to Ones (思维 + 贪心)
题意一个长度为n的二进制串,有两种操作:A:将某一段反序,花费为x。 B:将某一段取反,花费为y。问将这个串全都变为1的最小花费为多少?题解首先对于001100这种情况我们可以通过一次A操作变为110000,同理对于相邻的两个0的段,我们可以通过一次A操作把他们变为一段0。假设0的段数为cnt,①如果x<=y,那么我们就进行cnt-1次A操作和一次B操作即可。②如果x>y,那么我们就进...原创 2018-07-04 12:14:21 · 426 阅读 · 0 评论 -
Codeforces ~ 1006D ~ Two Strings Swaps(思维)
题意两个长度为n的字符串a,b。先将a改变一些字符,然后通过任意次交换操作使a==b,问a最少需要改变几个字符?字符串下标为从1到n,①swap(a[i],b[i])②swap(a[i],a[n-i+1])③swap(b[i],b[n-i+1]) 思路其实情况并不多,仔细考虑一下就好了。a[l],a[r]表示a[i]和a[n-i+1],b[l]和b[r]同理。每次看四个...原创 2018-07-17 11:14:41 · 463 阅读 · 2 评论 -
Codeforces ~ 1005E(1,2) ~ Median on Segments (思维 or BIT)
题意n个数字,问m是多少个区间的中位数?E1:这n个数字是1~n的一个排列E2:n个数字,数字大小不超过2e5题解E1做法①: 51Nod ~ 1682 ~ 中位数计数 (思维)#include <bits/stdc++.h>using namespace std;const int MAXN = 4e5+5;const int FIX = 2e5;typedef long ...原创 2018-07-10 21:28:05 · 443 阅读 · 0 评论 -
CodeForces ~ 1000B ~ Light It Up(思维)
题意有一盏灯,0时刻开着。n次操作,你可以在其中加入一次操作(或者不加),操作为:a[i]时刻按一下开关,状态变为相反状态(开-&amp;gt;关or关-&amp;gt;开)。问灯亮着的时长最长为多少? 保证a[i-1]&amp;lt;a[i]。 3 10 4 5 7 0~4开(时长为4-0),4~6关(时长为6-4),6~7开(时长为7-5),7~10关(时长为10-7) 我们可以在第3个时刻操作一下开关...原创 2018-06-28 01:45:48 · 779 阅读 · 0 评论 -
CodeForces ~ 996C ~ Tesla (思维 + 模拟)
题意4*n停车场,第二行和第三行是过道,第一行和第四行是车库,0表示空地。在过道的车可以上下左右四个方向随意走动,车一旦进入第一和第四行就不能动了。现在有k辆车(1~k)要停车,编号为 i 的车要停入编号为 i 的车库,保证车和车库的编号都只有一个。一辆车移动一下算一步,现在要把所有的车入库,请你输出一种20000步以内的解法,没有输出-1。思路我们让这些车在第二行和第三行兜圈...原创 2018-06-26 21:40:37 · 708 阅读 · 0 评论 -
CodeForces ~ 996B ~ World Cup (思维)
题意圆形球场有n个门,Allen想要进去看比赛。Allen采取以下方案进入球场:开始Allen站在第一个门,如果当前门前面有人Allen会花费单位时间走到下一个门,如果没人Allen从这个门就进去了。球场的每个门,每单位时间可以进去一个人。问Allen最终是从哪个门进入球场的?思路我们可以发现是有规律的。我们假设第iii个门有a个人,Allen第xxx圈可以从此进入,那么有:x∗n...原创 2018-06-25 20:56:06 · 598 阅读 · 0 评论 -
CodeForces ~ 990C ~ Bracket Sequences Concatenation Problem (思维 + 模拟)
题意:给你nnn个只有’(‘,’)’的字符串,问有对(i,j)(i,j)(i,j)使得Si+SjSi+SjS_i+S_j是一个合法的括号序列,iii可以等于jjj。 思路:统计合法的串的个数x,对答案贡献为x^2。对于不合法的串把已经匹配的左右括号删去,如果串中还有左右括号那就一定存在”)(“这种情况,对答案没贡献,如果只有左或右括号,L[i]数组记录左括号个数为i的个数,R[i]数组记录右括号...原创 2018-06-10 21:50:36 · 219 阅读 · 0 评论 -
CodeForces ~ 1000C ~ Covered Points Count (差分 + 离散化)
题意n个现在数轴上,每个段的每个端点都有整数坐标。有些线段可能退化为点。段可以相互交叉,相互嵌套或甚至重合。你的任务是:计算整数坐标的点,使得覆盖这些点的线段数等于k(1≤k≤n)。输出被k(1≤k≤n)个线段覆盖的点的个数。思路将线段拆成点,左端点权值为1,右端点权值为-1,离散化端点从左往右扫即可。 神奇的差分。#include&amp;amp;amp;amp;lt;bits/stdc++.h&amp;amp;amp;amp;gt;...原创 2018-06-29 11:44:54 · 596 阅读 · 2 评论 -
CodeForces ~ 999E ~ Reachability from the Capital (思维 + 图的DFS)
题意:n个点(1~n),m条单向边,s为起点,然后输入这m条边。问最少在增加多少条单向边,可以使s可以到达各个点?思路:以dfs所有点,并记录他们的根节点。最终有x个根节点,有两种情况: ①s不为根节点,那么就需要增加x条边。 ②s为一个根节点,那就需要增加x-1条边 注意,可能有环的情况,环的情况我们可以以任意点作为根节点,假设s在某个环中,而我们没以s作为根节点,那么求出...原创 2018-06-24 17:51:46 · 487 阅读 · 0 评论 -
Codeforces ~ 1009B ~ Minimum Ternary String (思维)
题意给你一个只含有0,1,2的字符串,你可以将"01"变为"10","10"变为"01","12"变为"21","21"变为"12",问通过变换可以得到的字典序最小的串是什么?题解一开始天真的以为,我把所有的"10"变为"01",和所有的"21"变为"12"即可。直到发现原创 2018-07-15 02:48:52 · 678 阅读 · 1 评论 -
Codeforces ~ 1009D ~ Relatively Prime Graph (构造)
题意构造一个n个点m条边的图,要求:图联通,GCD(u,v)=1,u~v才可以建边。题解由欧拉函数表φ(n)可得,573以内的互素的对数就已经超过1e5了,所以我们暴力枚举即可。#include <bits/stdc++.h>using namespace std;int n, m;vector<pair<int, int> > ans;int main...原创 2018-07-15 03:57:41 · 519 阅读 · 0 评论 -
UVA ~ 712 ~ S-Trees(二叉树,二进制枚举)
题意给出一棵满二叉树,每一层用一个xix_ixi的01变量来表示,xix_ixi取0往左走,取1往右走。每个叶子结点有一个值(0或1),然后有一些询问,求每个询问到达的叶子结点的值。多组测试数据,以n=0表示结束,每组先输入n表示有n层,然后输入从根到叶子每一层对应x几x_几x几那个变量,然后输入叶子结点对应的值。接下来输入Q次询问,每次询问输入一个长度为n的01串表示x1−&...原创 2019-01-06 21:33:31 · 1077 阅读 · 0 评论 -
POJ ~ 1657 ~ Distance on Chessboard(思维 or 搜索)
思路x = 横坐标之差 y = 纵坐标之差王:其实就是max(x, y),这个也是切比雪夫距离后:在横竖斜三条线上为1,否则为2车:在横竖两条线上为1,否则为2象:同在白格子或黑格子即可到达,在同一条斜线上为1,否则为2判断是否在一条斜线上其实也就是x是否等于y白色格子和黑色格子(横坐标+纵坐标)奇偶性一定不同,同颜色的格子x-y一定为偶数。//#include <bit...原创 2018-12-10 21:30:22 · 349 阅读 · 0 评论 -
Codeforces ~ 1088D ~ Ehab and another another xor problem (交互题,位运算)
题意现在有两个数字a,b(a,b&amp;lt;230a,b&amp;lt;2^{30}a,b&lt;230)每次可以给出两个数字c,d,询问a⊕c和b⊕d的关系。询问次数不能超过62次。询问结束后输出a,b的值。思路考虑a和b在二进制下的情况,从高位到低位依次求出a和b的每一位。对于当前位我们询问cura⊕(1&lt;&lt;i),curb和cura,curb⊕(1&lt;&lt;i原创 2018-12-05 13:01:29 · 431 阅读 · 0 评论 -
Codeforces ~ 1088C ~ Ehab and a 2-operation task (思维,构造)
题意一个长度为n的序列,你有两种操作:①将前i个数字加上一个值,②将前i个数字取余一个值。让你通过不超过n+1次操作,将序列变为递增的。思路可以想到构造成0,1,2,3,4…n-1这种形式。这个n+1给的很玄。从后往前,通过n次加操作,把a[i]加到a[i]%n=i,最后所有数对n取余即可。#include&lt;bits/stdc++.h&gt;using namespace st...原创 2018-12-05 11:44:24 · 326 阅读 · 0 评论 -
Codeforces ~ 1082D ~ Maximum Diameter Graph (构造,树)
题意N个点,给定每个点的最大值,要求构造一棵树,使得直径最长。思路首先度数超过2的都是直径上的点,剩下的度为1的点往上面挂即可,注意先在第一个和最后一个挂上一个。什么时候是NO呢,除了根节点和叶子结点,每个点度数至少为2,叶子最少为1个。那么度数和最小为2*n-2。#include<bits/stdc++.h>using namespace std;const int...原创 2018-12-04 21:01:46 · 274 阅读 · 0 评论 -
Codeforces ~ 1062C ~ Math(贪心,前缀和,快速幂)
题意给你一个长度为n的01串,q次询问,每次询问[l,r]区间可以获得的最大值为多少,取模1e9+7。假定答案为ans,ans初始为0。你每次选择01串中的某个元素将其吃掉,ans加上这个元素的值,并将其他元素都加上这个元素的值。比如第一个样例的第一次询问,串的变化过程如下:“1011”,“x122”,“x34x”,“x7xx”,“xxxx”,ans = 1+2+4+7思路容易发...原创 2018-11-19 20:06:45 · 882 阅读 · 0 评论 -
Codeforces ~ 1062B ~ Math(思维,因数分解)
题意给你一个数,现在有两种操作:①将这个数字乘以x②将x开根号问这个数字最小能变成的数字是多少,最少需要多少次操作思路把n分解质因数以后。开方不能减少素因子的种类,但是能够减少每个素因子的幂,每次开方相当于幂/2。所以最小数一定是每种素因子相乘,最小操作次数就是开方次数+乘法次数。如果所有幂值都是222的同一个次方,接下来就是一直幂/2了,否则我们就要先通过一次乘法将所有幂值变为...原创 2018-11-19 19:17:08 · 646 阅读 · 0 评论 -
Codeforces ~ 1032C ~ Playing Piano (构造,DP)
题意给你一个长度为 n 的 a 数组,让你构造一个长度为 n 且数值在[1,5][1,5][1,5]的 b 数组,使得 b 数组满足以下要求:无解输出-1.思路dp[i][j]=kdp[i][j] = kdp[i][j]=k表示第 i 位填 j 的情况是由 i-1 位填 k 的状态转移过来的,k=0表示不可到达。如果dp[n][1−&gt;5]dp[n][1-&gt;...原创 2018-11-19 18:46:33 · 396 阅读 · 0 评论 -
Codeforces ~ 1076B ~ Divisor Subtraction(思维,暴力)
题意现在有一个数N,这个N执行以下程序:1.如果N=0,结束程序2.找到N最小的素因子d3.N−=dN-=dN−=d,执行次数+1问执行次数。思路可以发现如果N是一个偶数,那么接下来的过程全都是 -2。可以发现需要很少次就可以把N变为一个偶数,所以暴力即可。#include<bits/stdc++.h>using namespace std;typedef lon...原创 2018-11-14 21:35:50 · 467 阅读 · 0 评论 -
UVA ~ 11809 ~ Floating-Point Numbers (数学,思维)
题意思路假设该数字表示为X∗2YX*2^YX∗2Y,那我们要求解的就是X∗2Y=A∗10BX*2^Y=A*10^BX∗2Y=A∗10B,M=(X的位数),E=(Y的位数)如果直接去计算这个数字的话会很大,因为Y有30位长,这个数大概也就是210302^{10^{30}}21030肯定是会炸的,所以想办法把这个数字去缩小一下,很容易想到使用logloglog取对数的方式。log10(X...原创 2018-11-15 19:55:50 · 202 阅读 · 0 评论 -
HDU ~ 6438 ~ Buy and Resell (思维 + 优先队列)
题意有n个城市,你会从前往后依次到达每个城市,你每次可以用a[i]元购买或者卖掉一个物品,你可以同时保存无限个个物品。最开始你身上没有物品,但是有无限的金钱,现在问你最大的收益是多少。思路用优先队列维护到当前位置的最优值。#include &amp;lt;bits/stdc++.h&amp;gt;using namespace std;const int MAXN = 1e5 + 5;typedef...原创 2018-10-30 20:52:00 · 166 阅读 · 0 评论 -
Codeforces ~ 1005D ~ Polycarp and Div 3 (思维+模拟)
题意一个字符串,问最多可以将其分割出来几部分可以整除3的数字? 题解首先,%3=0的单个数字成为一部分,其他的数字均对3取余,相邻12,21,111,222一定能成为一个整除3的数字。AC代码1:#include <bits/stdc++.h>using namespace std;const int MAXN = 120005;const int IN...原创 2018-07-10 20:49:29 · 199 阅读 · 0 评论 -
Codeforces ~ 1063A ~ Oh Those Palindromes (贪心)
题意A被称为是B的子串的要求是:A只能由B从头和尾删除字符得到。比如:b="abc",那么"a","b","c","ab","bc","abc"都是B的子串,而"ac"不是。给定一个字符串S,问怎么排列S可以使得S的子串中回文子串数量最多。多解输入任意一个。 思路想到好像相同的排在一起最优,于是尝试就AC了。#inc原创 2018-10-15 17:39:49 · 425 阅读 · 0 评论 -
Codeforces ~ 1064B ~ Equations of Mathematical Magic(异或+规律)
题意T次询问,每次给定a,问满足的 X 有多少个?思路式子化为,有异或性质可知 x 的取值为: a 的二进制中为 1 的位置选取任意个。比如:a=101,那么x可取:000,001,100,101。假设 a 中有 n 个1,那么答案就是.#include<bits/stdc++.h>using namespace std;const int MAXN ...原创 2018-10-15 17:32:22 · 330 阅读 · 0 评论 -
Codeforces ~ 983A ~ Finite or not?(思维,分数在b进制下是否为无限小数)
题意N组测试数据,每组有三个数p,q,b,问pq\frac {p}{q}qp在b进制下是否为无限小数?思路首先,一个最简分数是不是无限小数跟分子无关,只跟分母有关。在b进制下,如果q∣bk,k∈Zq | b^k,k∈Zq∣bk,k∈Z那么pq\frac {p}{q}qp就是一个有限小数,否则就是无限小数。q∣bkq | b^kq∣bk,那么qqq的素因子应该是bkb^kbk的子集。...原创 2018-10-18 16:35:08 · 346 阅读 · 0 评论 -
BZOJ ~ 1385 ~ Division expression (欧几里得算法)
题解原式化为情况下最有可能。然后看能否把x2的约去即可。当然不能把上面那个数字乘出来了,它太大了,所以我们拿上面的每一个数字和x2去约GCD即可。#include<bits/stdc++.h>using namespace std;const int MAXN = 1e4+5;typedef long long LL;int n, a[MAXN];int mai...原创 2018-10-01 19:23:45 · 298 阅读 · 0 评论 -
CodeForces ~ 999D ~ Equalize the Remainders (思维 + set二分)
题意n个数字,对m取余有m种情况,使得每种情况的个数都为n/m个(保证n%m=0),最少需要操作多少次? 操作:把某个数字+1。输出最少操作次数,和操作后的序列(可以输出任意一种)。思路对于余数x来说,如果余数为x的数没凑够n/m个,那么就让他不变,如果已经凑够了,我们就让他变为距离他最近的没凑够的余数(且通过+1得到的)。 所以,C[i]数组维护余数为iii的数的个数,定...原创 2018-06-24 17:21:11 · 1057 阅读 · 0 评论 -
CodeForces ~ 989C ~ A Mist of Florescence (构造 + 思维)
题意: 让你构造出一个’A’,’B’,’C’,’D’联通(上下左右)块数分别为a,b,c,d(均小于100)的图,图的大小不超过50*50。解法: 直接搞一个50*50的图,然后分为四块。每一块里面填充对角线那个颜色,然后注意不要把当前颜色分割为不同的联通块,所以我们可以隔一行隔一列一填充,即全部填充在x,y坐标均为偶数或奇数的地方。 大佬给的图: 感觉到智商深深的被压制了,这么简单的...原创 2018-06-15 20:52:41 · 264 阅读 · 0 评论 -
CodeForces ~ 987E ~ Petr and Permutations (思维,有趣)
题意:有n个数字,原始序列为1~n,给你该序列经过Petr或Um_nik操作后序列,问你是谁操作的?Petr:随机交换两个数的位置,交换3n次。Um_nik: 随机交换两个数的位置,交换7n+1次。思路:可以发现3n和7n+1一定是一奇一偶的,那么我看考虑这个序列跟操作次数奇偶的性质,然后我就想不出来啦,哈哈哈。第二天看了别人的题解才会。考虑两个数字的时候我们交换 2x 次跟没交换一样,交换2x+...原创 2018-05-31 19:47:22 · 362 阅读 · 0 评论 -
51Nod ~ 1266 ~ 蚂蚁 (思维)
思路:当两个蚂蚁碰头转向的时候,我们把他理解为对穿而过。问题就好理解了。那么最长时间一定是距离某一端最远的那个距离,最短时间则是距离中间最近的那个蚂蚁到离它最近的那一端的距离。#include<bits/stdc++.h>using namespace std;const int MAXN = 5e4 + 5;const int INF = 0x3f3f3f3f;int n, ...原创 2018-04-12 12:48:24 · 228 阅读 · 0 评论 -
UVA ~ 11300 ~ Spreading the Wealth (数学推导 + 中位数性质)
题意:圆桌旁坐着n个人,每个人有一定数量的金币,金币总数总能被n整除。每个人可以给他左右相邻的人的一些金币,最终使得每个人的金币数目相等。你的任务是求出被转手的金币数量的最小值。比如,n=4,且四个人的金币数量分别为1,2,5,4,只需要转移4枚金币(第3个人给第2个人两枚金币,第2个人和第4个人分别给第1个人1枚金币)即可实现每人手中的金币相等。思路:首先我们能轻易的计算出最终每个人手中的金币数...原创 2018-03-27 09:49:19 · 353 阅读 · 0 评论