
思维
文章平均质量分 72
cillyb
这个作者很懒,什么都没留下…
展开
-
51NOD 1110 距离之和最小 V3(中位数)
X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i]。点P到点P[i]的带权距离 = 实际距离 * P[i]的权值。求X轴上一点使它到这N个点的带权距离之和最小,输出这个最小的带权距离之和。Input第1行:点的数量N。(2 <= N <= 10000)第2 - N + 1行:每行2个数,中间用空格分隔,分别是点的位置及权值。(-10^5 <= X[i] ...原创 2018-05-18 11:24:53 · 439 阅读 · 0 评论 -
2017 四川省赛 D.Dynamic Graph (思维 拓扑排序 bitset优化)
题意:有n个点m条边的有向无环图,初始时所有点都是白色,现在q次询问,每次询问将一个点x变为相反的颜色(白->黑,黑->白)后,求有多少对白色点之间存在路径,且路径上的点都是白色的。思路:方法1:为了统计有多少点能到当前点,可以由之前的点递推过来,这样就想到了拓扑排序。递推转移的过程可以用bitset优化。bit[i][j]表示i能到j,u传递到v只需要bit[v[原创 2017-07-16 21:30:59 · 563 阅读 · 0 评论 -
Codeforces Round #424 (Div. 2) E. Cards Sorting(思维 树状数组)
题意:有n张牌,每张牌上有一个数,每次从牌顶取一张牌,如果这张牌是剩余牌中的最小值那么就把它扔掉,不然放到牌堆底,问多少次操作才能把牌扔光。思路:树状数组维护每个位置的牌是否存在,这样就能logn计算两个位置之间牌数,一共只有1e5个数,这样我们就可以从1开始枚举模拟(一开始开一个1e5的vector把每个数的下标存进去),如果存在这个数,就从当前位置把所有的这个数拿完,记录维原创 2017-07-15 15:15:43 · 414 阅读 · 0 评论 -
Educational Codeforces Round 23 C. Really Big Numbers(二分 数学)
题意:一种数的定义是:数本身与该数每一位和的差大于等于给定的S。现在给你n让你求不大于n的数中有多少个满足要求。(n,s 思路:一开始想着是数位dp,但不知道怎么记录,,其实有一个单调性,如果x满足,那么x+1一定满足。证明:数学归纳法: 假设x是reall big,那么设x的各项和为sumd(x),由条件有x - sumd(x) ≥ s。那么对于 x + 1 有s原创 2017-07-05 23:03:31 · 341 阅读 · 0 评论 -
hrbust 1401 九连环(矩阵快速幂)
九连环Time Limit: 1000 MSMemory Limit: 65536 KTotal Submit: 65(37 users)Total Accepted: 34(31 users)Rating: Special Judge: NoDescription相信大家都玩过原创 2017-07-14 21:22:35 · 627 阅读 · 0 评论 -
hrbust 1396 射镖游戏(思维 背包)
题意:有1-20分这些分值,每次可以得到i分或i*2分或i*3分,另外有个25分,可以得到25分或者25*2分,现在要求得到n分,且最后一次必须是x*2分,问有多少种可能方案。思路:因为得分没有顺序要求,只要求有一次是二倍得分,所以我们可以用总方案数减去没用二倍得分的方案数,那么减出来的结果就是至少有一次是二倍得分的方案数。求方案数可以用背包去做。代码:#include原创 2017-07-14 21:53:24 · 352 阅读 · 0 评论 -
Codeforces Round #400 C. Molly's Chemicals(前缀和)
题意:给定n个数字和一个k,问区间的一段数字加起来是k的幂的区间数。思路:对n个数求前缀和,记录下前缀和的种数(即前缀中能得到值s的种数),然后对每个k的幂(power)求sum-power的和。在其前缀中有多少种方式组成sum-power,那么当前就能多少种power。代码:#includeusing namespace std;const int maxn原创 2017-07-13 23:03:05 · 441 阅读 · 0 评论 -
51nod 1396 还是01串 (思维or前缀和)
给定一个0-1串s,长度为n,下标从0开始,求一个位置k,满足0<=k<=n, 并且子串s[0..k - 1]中的0的个数与子串s[k..n - 1]中1的个数相等。 注意:(1) 如果k = 0, s[0..k - 1]视为空串(2) 如果k = n, s[k..n - 1]视为空串(3) 如果存在多个k值,输处任何一个都可以(4) 如果不存在这样的k值,请输出-1原创 2017-07-13 22:22:41 · 401 阅读 · 0 评论 -
Codeforces Round #423 (Div. 2) E. DNA Evolution(树状数组)
题意:给你一个只包含'A', 'T', 'G', 'C'的字符串,q次操作,有两种操作:1 x ch : 将x位置改成ch2 l r e:e为一个长度不超过10的字符串,问eeeee....与字符串的子串[l, r]有多少个匹配的字符(先将e的开头和l对齐)思路:一共就4种字符,可以分别考虑每个字符,e长度最大才10,可以分别考虑不同长度的e。假设e长为len, 那原创 2017-07-13 12:21:04 · 403 阅读 · 0 评论 -
Codeforces Round #320 (Div. 2) D. "Or" Game(贪心 前后缀)
题意:给你n个数,你可以进行k次操作,每次操作可以使一个数变为a[i]*x. 问怎样使得最后a[1] | a[2] ... | a[n] 值最大。思路: 因为是或运算,我们可以发现k次都乘在同一个数上会得到结果更大,但乘在哪个上呢?可能会想到最大的那个数,但这不一定。比如 1 0 0 0 1 0 1 1 1 1 0 1 这3个数字; 假设要乘的数字x是2;只能乘原创 2017-07-12 16:32:35 · 314 阅读 · 0 评论 -
Codeforces Round #423 (Div. 2) C. String Reconstruction(思维 模拟)
题意:给你一些字符串,并告诉你他出现在哪些位置(可多次,可重叠),让你输出字典序最小的可能的字符串。保证有解,总长度不超过1e6.思路:跟前几天做的一个题很像点击打开链接,因为区间长度就1e6,经常会重复去填充,浪费时间,可以用一个数组维护当前位置的下一个未填充的字符位置,这样就可以跳过很多重复操作降到O(n)复杂度了。代码:#includeusing nam原创 2017-07-12 12:30:32 · 313 阅读 · 0 评论 -
CodeForces 566 A Matching Names(Trie 匹配LCP和最大)
题意:有n个A字符串和n个B字符串,问如何匹配能使LCP(最长公共前缀)和最大。思路:将A和B分别插入Trie,节点保存的是具有该前缀的字符串id,然后对Trie进行dfs,优先选择深的匹配,并标记。 然后回溯去匹配,被标记过的不再进行匹配。代码:#includeusing namespace std;const int maxnode = 8e5+5;int原创 2017-07-12 01:34:54 · 595 阅读 · 0 评论 -
2017 四川省赛 L.Nice Trick(递推 DP)
思路:方法一:因为已经告诉你了n个取3个的乘积和,所以可以利用这个公式递推,ans[i] = ans[i-1]+S(i-1,3)*a[i]方法二:设 f(i, j) 表示在前 i 数里面挑 j 个乘起来的总和,那么f(i, j) = f(i − 1, j) + f(i − 1, j − 1) × ai方法一代码:#include#include#incl原创 2017-07-16 22:17:17 · 819 阅读 · 0 评论 -
51nod 1572 宝岛地图(前缀和)
勇敢的水手们到达了一个小岛,在这个小岛上,曾经有海盗在这里埋下了一些宝藏。然而,我们的船快抛锚了,与此同时,船长发现藏宝图的一角被老鼠咬掉了一块。 藏宝图可以用一个n×m大小的矩形表示。矩形中的每一小块表示小岛中的一小块陆地(方块的边长为1米)。有一些方块表示的是海,这些块人是不能通过的。除了海不能走,其它的小方块都是可以行走的。在可行走区域里有一些小方块表示一些已知的地点。原创 2017-07-10 09:34:26 · 546 阅读 · 0 评论 -
51nod 1548 欧姆诺姆和糖果 (思维 枚举)
一天,欧姆诺诺姆来到了朋友家里,他发现了许多糖果。有蓝色和红色两种。他知道每颗红色糖果重Wr克,每颗蓝色糖果重Wb克。吃一颗蓝色糖果会给他带来Hb的欢乐值,吃一颗红色糖果会给他带来Hr的欢乐值。欧姆诺姆最多只能吃C克的糖果,而且每一颗糖果不能只吃一半。现在他想通过吃蓝色和红色的糖果来获得最大的欢乐值。样例解释:每一种糖果吃两颗即可。Input单组测试原创 2017-07-10 10:55:38 · 480 阅读 · 0 评论 -
HDU 4810 Wall Painting(异或 组合数)
题意:求n个数里面,取k个数异或的所有组合(Cn,k种)的和,k取1~n思路:枚举k,因为是异或,所以看二进制,最后的和的每一位二进制的值为n个数这一位的二进制取k个时1的个数为奇数的方案数,那怎么计算n个0或1的数中取k个,取到的1的个数为奇数呢,比如有num1个1,num0个0,那么取k个的方案中取出的是奇数个1的方案数位C(num1,1)*C(num0, k-1)+C(n原创 2017-09-30 22:48:00 · 399 阅读 · 0 评论 -
51nod 1557 两个集合(Set)
题意:给你a和b,小X有n个互不相同的整数: p1,p2,...,pn 。他想把这些整数分到两个集合A和B里边。但是要符合下面两个条件。· 如果x属于A,那么a-x也肯定属于A。· 如果x属于B,那么b-x也肯定属于B。思路:如果a-x,b-x都不存在那么就是A,B都不能放,no。如果a-x,b-x只存在其中一个,那就是能放。如果a-原创 2017-09-20 21:10:41 · 402 阅读 · 0 评论 -
Codeforces Round #433 (Div. 2) D. Jury Meeting(思维 贪心 前后缀)
题意:有n+1个城市,从1~n号城市每个城市有一个评委要到0号城市和其他n-1个评委一起工作k天(这k天n个评委都要在),并且要把所有评委送回他原来所在的城市。现在有m个航班,只有从i号城市到0号城市,或者从0号城市到i号城市(航班到达的那天不能工作),问你最少需要花费多少钱。思路:贪心维护dp1[i] 表示第i天所有评委到达的最小花费,dp2[i]表示第i天所有评委离开的花费. 处理原创 2017-09-07 16:35:57 · 379 阅读 · 0 评论 -
HDU 6166 Senior Pan (最短路 好题)
题意:给你一个n个点m条边的有向带边权的图。现在给你k个点,问k个点中最近的点对距离。 n, m, k 思路:这题的思路好强啊。。。任意两个点在二进制表示上肯定至少有一位是不相同的,所以我们可以枚举二进制的位数,每次把k个点中二进制某一位为1的分一个集合,为0的分一个集合,做一次最短路,找到这两个集合之间的最短路。枚举所有二进制的位数后,这样就包含了所有点对的最短路。(求集合与原创 2017-08-23 21:53:35 · 466 阅读 · 0 评论 -
2017 Multi-University Training Contest 10 1008 Monkeys HDU 6178 (贪心 读入挂fread)
题意:给你一棵n节点的树,现在让你放k个猴子,可以删边,问最少可以剩余几条边,放k个猴子,满足任意一个猴子至少与一只猴子相连。2思路:我们可以知道一条边连两个节点(猴子),这样每对点连一条边是最节约边使猴子放的尽量多。现在问题就转化成就是要找可以有几对点,可以从树根开始dfs,看他有几个儿子和儿子中已经成对的个数,若两者之差>=1,即存在一个儿子能与它成对。虽然算法是O原创 2017-08-24 19:53:59 · 662 阅读 · 0 评论 -
2017 Multi-University Training Contest - Team 2 1009 HDU 6053 TrickGCD(分段 容斥)
题意:给你n个数字,每个位置的数可以小于等于a[i],求所有区间gcd(l,r)都满足大于等于2的方案数思路:我们可以枚举gcd,然后a[i]/gcd就是i位置能够填的数的个数,然后每个位置累乘起来就能得到数列为gcd时的方案数。但是这样是n^2复杂度,显然会T,因为a[i]/cgd有许多是相同的,我们可以将相同的一起考虑,这可以用前缀和和快速幂解决。这样算完之后显然计算了许多原创 2017-07-28 14:29:28 · 813 阅读 · 0 评论 -
HDU 6146 && 2017 百度之星复赛 1003 Pokémon GO(递推)
题意:给你一个2*n的网格,你可以从任意一点出发,每次可以向附近走一步,包括斜对角,走完所有格子且所有格子恰好走一遍的方案数。思路:nyoj980原题,思路见:点击打开链接摘自他的:一共有两个递推数组:首先设Dn表示从左边或者右边的某个角出发,然后走遍所有格子回到同一列有多少种方法。明显D1=2,Dn=2*Dn-1所以Dn=2^n然后原创 2017-08-18 18:44:36 · 537 阅读 · 0 评论 -
HDU 4311 Meeting point-1 (思维)
题意:给你n个点,让你选一个点,让其他所有点到这个点的距离总和最小。(n 思路:我们可以知道其他点到一个点的距离和为∑(abs(xi-x)+abs(yi-y)),x和y可以分别考虑最后再加起来,然后对x排序这样就可以对某点左边和右边分别考虑,然后就可以把绝对值符号去掉了。例如第i个点,左边为xi*(i-1)-sumx[i-1],右边为sumx[n]-sumx[i]-xi*(n-原创 2017-07-25 21:17:17 · 420 阅读 · 0 评论 -
2017 Multi-University Training Contest - Team 1 1006 Function(思维 循环节)
题意:给你一个序列a,是0到n-1的一个排列,给你一个序列b,是0到m-1的一个排列,问你有多少种不同的函数关系满足:f[i] = b[f[a[i]]] (0 官方题解:考虑置换 aa 的一个循环节,长度为 ll ,那么有 $f(i) = b_{f(a_i)} = b_{b_{f(a_{a_i})}} = \underbrace{b_{\cdots b_{f(i)}}}_{l\te原创 2017-07-25 19:38:05 · 807 阅读 · 0 评论 -
51nod 1421 最大MOD值 & codeforces 485D Maximum Value(思维 数学)
题意:有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ,使得 最大并且 1 ≤ n ≤ 2*10^5,1 ≤ ai ≤ 10^6思路:5 6 7 8 9这样的序列只对于5来说的话,求对5的mod最大值,会发现其实并不需要求6%5,7%5,8%5,我只需要求5和10之间最大的那一个就可以,如果还有更大的就求10到15之间最大的,以此类推下去。(原创 2017-08-01 23:50:20 · 519 阅读 · 0 评论 -
HDU 5175 Misaki's Kiss again (数学)
题意:求0到N-1中,有多少数m满足gcd(N,m)=N^m思路点击打开链接:令M = N xor K,原式:gcd(N,N xor K) == N xor (N xor K) == K 由此我们可以发现K是N的约数,找到所有N的约数,判断是不是满足那个等式即可,因为是异或运算,结果可能比约数本身大,如1xor2==3,还有异或出来结果等于0的舍掉,gcd(n,n) !=原创 2017-07-31 22:25:34 · 392 阅读 · 0 评论 -
Croc Champ 2012 - Round 1 B. Chamber of Secrets(二分图 最短路)
题意: 一个n*m的地图(n,m 思路:比较巧妙的建图。要走最少步走到右下角,想到的肯定是最短路,但是怎么建图呢?把每个点(x,y)拆成两个点, 横坐标看作x点,纵坐标看作y+n点,每个'#;建x -> y+n和y+n -> x的双向边。这样就成了个二分图,每次可以从横坐标到纵坐标或是纵坐标到横坐标,横坐标1是起点,横坐标n是终点,跑一下最短路就行了。代码:#i原创 2017-07-11 20:02:05 · 423 阅读 · 0 评论 -
Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) C. Constellation(思维 简单几何)
题意:给你n个点(n思路:先按x轴排序,x相同按y排序。因为保证所有点不在同一直线上,这样前两个必定可以和后面某个点构成三角形,且从第三个开始找第一个能形成三角形的内部一定没有其他点,因为如果有其他点,那这个内部点同样可以与前两个点形成三角形,且在这个点前面。代码:#includeusing namespace std;typedef long long ll;c原创 2017-07-11 18:02:15 · 387 阅读 · 0 评论 -
Codeforces Round #218 (Div. 2) B. Fox Dividing Cheese(思维 数学)
题意:给你两个数a b,每次操作可以将某个数整除2 或 整除3 整除5,问最少操作多少次可以使两个数相等,否则输出-1.思路:两个数可以看作a = x * pow(2, m1) * pow(3, m2) * pow(5, m3)b = y * pow(2, n1) * pow(3, n2) * pow(5, n3)要使两个数相等,x和y必须相同,x和y相同的条件下怎样操原创 2017-07-11 11:59:01 · 400 阅读 · 0 评论 -
CodeForces 707C Pythagorean Triples(数学 构造)
题意:给出直角三角形一边,求另两边,如果存在输出任意一组即可。点击打开链接【分析】对于直角三角形△ABC,如图:我们知道的是因为题目说如果题目存在多种解,输出任何一个就可以了,所以我们不妨假设输入的n是一条直角边的长度,那么根据平方差公式可得那么,这个时候,我们要求解的就是a,b于是乎,我们分类讨论即可原创 2017-05-10 21:25:22 · 452 阅读 · 0 评论 -
codevs 1029 遍历问题
题目描述 Description 我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树: 所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却原创 2017-04-18 14:55:49 · 460 阅读 · 0 评论 -
ZOJ 3956 Course Selection System(01背包)
Course Selection SystemTime Limit: 1 Second Memory Limit: 65536 KBThere are n courses in the course selection system of Marjar University. The i-th course is described by two values: ha原创 2017-04-10 23:31:36 · 896 阅读 · 0 评论 -
ZOJ 3954 Seven-Segment Display(思维)
Seven-Segment DisplayTime Limit: 1 Second Memory Limit: 65536 KBA seven segment display, or seven segment indicator, is a form of electronic display device for displaying decimal numera原创 2017-04-10 23:26:13 · 1675 阅读 · 0 评论 -
Codeforces Round #394 (Div. 2) E. Dasha and Puzzle(构造)
题目地址:点击打开链接题意:给你一棵树,问你能不能放在二维坐标系中,边必须平行坐标轴,且边没有交集。思路:什么情况不能放呢,很容易可以想到一个点他有大于四条边时肯定是放不了了。那如果所有点的边数小于等于4,怎么进行放呢,为了不让边相交,我们可以将边按点的遍历降序放,比如第一个点的边放的边长len,第二个点的为len/2,那么即使在同一水平线或原创 2017-03-23 16:57:49 · 486 阅读 · 0 评论 -
CodeForces - 55D Beautiful numbers(数位dp 离散化)
题目地址:点击打开链接题意:统计某段区间内满足它所有非零数位能整除这个数本身的数的个数。思路:要求这个数能被每一位整除,也就是这个数能被所有位数的最小公倍数整除。2-9的最小公倍数是2520,可知dp[pos][preMod][lcm]需要的开的大小dp[20][2520][2520], 显然是开不下的而且会超时。所以需要想办法优化。 我们可以发现第三维,2-9的最原创 2017-03-20 20:20:40 · 653 阅读 · 5 评论 -
qduoj 79 翻转游戏(开关问题)
题目地址:点击打开链接思路:普通的方法从左到右枚举翻转n^2复杂度会超时。用白书上的维护记录区间的翻转次数,可以达到nlogn复杂度。代码:#include#include#includeusing namespace std;const int maxn = 1e5+5;char str[maxn];int k, m, a[maxn], f[max原创 2017-03-07 15:36:32 · 465 阅读 · 0 评论 -
ZOJ 3780 Paint the Grid Again(逆推)
题目地址:点击打开链接题意:给一块n*n的格子,每次可以将任意行变成X,或任意列变成O,后操作的将覆盖原先的操作,每行每列只能操作一次。给出最终图形,要求按先后顺序输出操作方法。思路:某一个状态,他要么只有行同为X,要么只有列同为O,一个状态不可能同时某行都为X,某列都回O,因为一定有交点。所以我们倒着来,因为要字典序,所以我们要逆字典序找,找到原创 2017-03-20 16:50:40 · 356 阅读 · 0 评论 -
ZOJ 3781 Paint the Grid Reloaded (缩点,bfs)
题目地址:点击打开链接题意:给一个n*m的由X或O构成的图,对一个点操作可以使与它相连通(上下左右)的所有一样颜色的格子翻转颜色(X—>O或O—>X),问给定的矩阵最少操作多少次可以全部变成一样的颜色。思路:因为每次翻转都可以把与该点所在连通块相邻的连通块变成同一颜色,要都变成一种颜色,也就是遍历完最远的那个连通块。现在可以对每个连通块进行缩点,相邻的连通块原创 2017-03-20 18:47:14 · 511 阅读 · 0 评论 -
bestcoder #92 B Count the Sheep(思维)
哎 太菜了自己思路:连着的四个羊,所以有三条边,所以中间边两端点度数>1,以这条边为中间边的方案数为(cnt[u[i]]-1)*(cnt[v[i]]-1), 因为可以反过来 所以再乘2.代码:#include#include#includeusing namespace std;typedef long long ll;const int maxn = 1e5+5原创 2017-02-25 22:27:24 · 565 阅读 · 0 评论 -
第八届蓝桥杯 k倍区间(前缀和)
标题: k倍区间给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。 你能求出数列中总共有多少个K倍区间吗? 输入-----第一行包含两个整数N和K。(1 <= N, K <= 100000) 以下N行每行包含一个整数Ai。(1 <= Ai <=原创 2017-04-17 16:11:19 · 3016 阅读 · 1 评论