
杂项算法
尺取 递推 模拟 二分 贪心等
Xiao____Q
退役ACMer
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
codeforces 1161C Thanos Nim
思维型博弈。题意:Alice和Bob互相取石子,每次选择恰好n/2n/2n/2堆,从每一堆里取至少一个,第一个不能完成取的算为输。思路:构造一种能够把对方气死的方案。我们先考虑这些情况:1 1 1 1 1 1时一定是后手必胜。(显然)1 1 1 1 1 2 时也是后手必胜。(也是显然)但1 1 1 2 2 2 就成了先手必胜,因为可以一次取到1 1 1 1 1 1的情况。然后1 1 ...原创 2019-08-18 21:39:39 · 235 阅读 · 0 评论 -
codeforces 618F Double Knapsack
题意:给你两个长度为n的序列,在两个序列中分别找出一个子集,使这两个子集的总和相等。输出方案。思路:大概,这个题很多条件都是用来搞事的。比如,输出-1就很有迷惑性,事实上这题并不可能无解。而且,如果子序列改为子段的话,会更好想一些。总之,这道题的思维性很强。我们可以维护两个前缀和数组sa[n],sb[n]sa[n],sb[n]sa[n],sb[n],分别代表两个序列的前缀和。序列a中子段的和...原创 2019-08-17 13:04:31 · 230 阅读 · 0 评论 -
POJ 2104 -- K-th Number
题目来源:http://poj.org/problem?id=2104平方分割做法。效率不是很高,TLE了好几次才勉强过去。注意在处理区间的时候最好要用左闭右开的区间。代码:#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#i...原创 2018-08-07 12:55:06 · 125 阅读 · 0 评论 -
POJ 2566 - Bound Found
题目来源:http://poj.org/problem?id=2566刚开始做的时候没什么思路,看别人的博客学会的:https://www.cnblogs.com/iiyiyi/p/5962512.html因为所需的是区间的为绝对值,所以sum[r] - sum[l-1] == sum[l-1] - sum[r] 。因此只需要找合适的<l,r>。当前缀和为有序时,尺取法可以...原创 2018-07-27 21:55:25 · 192 阅读 · 0 评论 -
POJ 3276 —— Face The Right Way
题目来源:http://poj.org/problem?id=3276类似尺取法,不过需要优化到O(n^2)。用一个c记录该位置被翻转的次数。代码:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <stri...原创 2018-07-27 08:50:53 · 178 阅读 · 0 评论 -
Gym - 100712I - Bahosain and Digits
题目来源:http://codeforces.com/gym/100712反转(开关问题)的变式。要先从0~9枚举最终状态下的所有数字。然后从大到小验证所选分段是否可行。假设所选的段长为x,因为最左侧的那一位只能属于[0,x]这一段,因此便可从第一位开始确定,依次向右一位一位进行操作,如果可以将全部位置上的数字均转变为所要的数字,则x可行。代码:#include <bi...原创 2018-07-24 16:47:49 · 194 阅读 · 0 评论 -
poj1960 Time Planner
题目来源:http://poj.org/problem?id=1960Time PlannerTime Limit:3000MSMemory Limit:30000KTotal Submissions:457Accepted:104DescriptionBackgroundProblems原创 2017-08-14 11:04:57 · 637 阅读 · 0 评论 -
Gym 101908-K Kepler
题意给你n个圆,这n个圆都包含点(0,0)。求这n个圆交点的个数。保证不存在一个点被三个圆所交。大于2n个交点输出“greater”。思路数据出的比较水。O(n^2)枚举再加一些剪枝是可以过掉的,但很容易被卡掉。比如出一组150000个同心圆,每两个圆的半径差值为0.001。思路来自 black_horse2014,代码code 43676730。所有圆都包含点(0,0),因此可以将圆按...原创 2019-08-12 21:37:06 · 273 阅读 · 0 评论 -
POJ 1319 -- Pipe Fitters
题目来源:http://poj.org/problem?id=1319结果为0的时候输出“grid”。实现详见代码:#include <cstdio>#include <cstring>#include <iomanip>#include <iostream>#include <algorithm>#include...原创 2018-08-14 20:06:41 · 236 阅读 · 0 评论 -
POJ - 2187 -- Beauty Contest
题目来源:http://poj.org/problem?id=2187求凸包的模板题。由于坐标值不超过M的凸多边形的顶点数只有O(M)个,因而枚举就好。代码: #include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#includ...原创 2018-08-04 17:12:35 · 193 阅读 · 0 评论 -
POJ - 1127 -- Jack Straws
题目来源:http://poj.org/problem?id=1127判定线段相交+floyd。判定线段相交的模板来自《算法导论》P597。使用floyd处理出所有传递闭包(类似并查集,floyd更好写一些)。代码:#include <cstdio>#include <cstring>#include <iostream>#inclu...原创 2018-08-04 13:46:40 · 132 阅读 · 0 评论 -
NOIP2015 推销员
题目来源:https://www.luogu.org/problem/show?pid=2672100%的数据n是1e5的,这样n^2的复杂度的算法会超时,需要进行一下优化。贪心策略:选i个点的最优解一定是选i-1个的最优解再加上未选的点中疲劳值最大的点。可用反证法证明正确性。大体过程:假设最优解为上述最优解,证明假如第i-1个不是最大值,那么此时选i个点一定不会优于上述最优解。原创 2017-08-26 11:30:27 · 532 阅读 · 0 评论 -
NOIP2012国王游戏
题目来源:https://www.luogu.org/problem/show?pid=1080用贪心可以解决。将所有人按左右手的乘积排序,这样一定可以保证结果最优。现给出证明:首先,任意相邻两人的顺序对于排在他们前面和后面的人没有影响。(显然)两人左右手上的数字分别为l[1],r[1],l[2],r[2],令l[1]*r[1]原创 2016-11-05 14:49:07 · 346 阅读 · 0 评论 -
HDU-5144 NPY and shot
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=5144三分+物理。首先,对于固定的高度H与初速度v,投掷距离与投掷方向(与水平面的夹角)x有关。由物理知识知,x在[0,π/2]区间取值时,距离dis一定存在一个最大值,因此可以使用三分法求取。对于不同的x,dis的表达式可以推得dis=( sqrt( 2*g*h+v*v*sin(x)*...原创 2018-07-24 11:09:58 · 158 阅读 · 0 评论 -
UVALive - 7342
怎么说呢。这道题其实是道水题,但一开始思路错了,纠正了两次还是没有回到正轨上,最终与AC无缘。后来队友将其转成二维平面上的点,用一种形状比较奇怪的六边形去覆盖所有点,这样处理起来其实更麻烦。对于每一个六边形,一定会有一个中心和一个半径。我们可以先确定最终需要的正六边形的半径,然后判断是否存在中心。半径的长度可以二分,然后如何去check。我们可以假想成一共有三个轴x,y,zx,y,zx,y,z...原创 2019-08-19 11:05:47 · 175 阅读 · 0 评论 -
POJ - 3111 -- K Best
题目来源:http://poj.org/problem?id=3111WA到怀疑人生系列的二分。。。思路来自POJ-Disscuss的:http://poj.org/showmessage?message_id=354940一定要注意跳出循环时保存的是可行解。eps的精度不要太高,可能会TLE。代码:#include <cstdio>#include <c...原创 2018-08-03 21:16:09 · 137 阅读 · 0 评论 -
POJ 2549 -- Sumsets
题目来源:http://poj.org/problem?id=2549给出集合S,找出元素a,b,c,d,满足a+b+c=d。由于n的最大值为1000,不可能将a,b,c,d全部枚举出。由于a + b = d - c 我们可以提前预处理出所有 x+y和x-y,然后进行二分查找。为避免重复,需记录每个x和y,然后进行验证。代码:#include <cstdio>...原创 2018-07-29 19:57:41 · 218 阅读 · 0 评论 -
POJ - 3977 Subset
题目来源:http://poj.org/problem?id=3977首先N<=35,2^N枚举会超时。但我们可以将N个数字分成两部分,每一部分的所有子集最多为2^18<3e5,因此可以将所有子集求出,然后枚举+二分查找即可得到结果。代码:#include <cstdio>#include <iostream>#include <cs...原创 2018-07-28 10:10:54 · 167 阅读 · 0 评论 -
POJ 3579 —— Median
题目来源:http://poj.org/problem?id=3579二分答案+尺取。首先想到要对数列进行排序。先二分差值的中位数x,然后找出小于x的所有差值的个数以及所有大于x的差值的个数,这个过程可以用尺取法。同时统计出差值=x的差值个数t。若t=0,则这个mid不可能是答案。代码:#include <iostream>#include <cstd...原创 2018-07-26 11:07:41 · 287 阅读 · 0 评论 -
codeforces 671B - Robin Hood
题目来源:http://codeforces.com/problemset/problem/671/B题目大意:给定n个数,每次可执行一次操作,将最大的数-1,最小的数+1。最多可执行k次。问最小的极差为多少。思路: 对n个数求取平均数,由于操作一定是从大于平均数的数中抽取,将数转至小于平均数的数中。因此可以对最大值和最小值进行二分,验证在k次操作之内能否将所有数修改为全部大于(小于...原创 2018-07-24 15:59:27 · 351 阅读 · 0 评论 -
poj1905Expanding Rods
题目来源:http://poj.org/problem?id=1905二分答案。一开始做的时候二分的是半径,但考虑到如果长度没有增加那么半径应是无穷大的,这样精度上会有误差,提交几次都是WA。事实上,本题可以枚举角度,即膨胀后的弧的弧度值,可以证明弧度值是小于π/4的(因为题目中说膨胀后的长度不会超过原长的1.5倍)。在(0,π/4)的区间上,弧长随角度的增大而减小,故可使用二原创 2017-08-14 10:19:22 · 265 阅读 · 0 评论 -
NOIP2012 借教室
题目来源:https://www.luogu.org/problem/show?pid=1083对需要修改的订单的编号二分,验证前1~mid个是否满足题意。利用前缀和优化。详见代码:#include #include #include #include #include using namespace std;const int maxn原创 2016-11-07 19:11:58 · 241 阅读 · 0 评论 -
NOIP2011聪明的质检员
题目来源:https://www.luogu.org/problem/show?pid=1314对w进行二分答案。处理过程中用前缀和优化。注意要二分两次,一次是ws时w-s的最小值。代码:#include #include #include #include #include #define ll long longusing原创 2016-11-05 20:47:46 · 414 阅读 · 0 评论 -
洛谷P1816 忠诚
题目来源https://www.luogu.org/problem/show?pid=1816RMQ问题。anc[i][k]记录第i个数往前2^k的数的编号。lcs[i][k]记录从第i-2^k个数到第i个数之间的最小值。更新时anc[x][i]=anc[anc[x][i-1]][i-1],lcs[x][i]=min(lcs[x][i-1],lcs[原创 2016-10-06 17:49:40 · 438 阅读 · 0 评论 -
codeforces 1161D Palindrome XOR
题意:给你一个01串s,问存在多少种数对<a,b><a,b><a,b>,使得a⊕b=sa \oplus b=sa⊕b=s。需满足a和b都是回文串,并且a和b的len<nlen<nlen<n。数据保证s的开头是1,若s[i]=?s[i]=?s[i]=?则该位置既可以是1,又可以使0。题解:思路...原创 2019-08-18 20:56:54 · 248 阅读 · 0 评论 -
Gym 100134L - Labyrinth of the Minotaur
题目来源:http://codeforces.com/gym/100134/attachments题意:给一个迷宫,问是否存在一种方案,可以用一个正方形块,堵住从左上到右下的所有路径,输出坐标及正方形边长。 考虑到从起点到终点的方案可能会有很多,但可以确定所有路径集合的左右边界。而左右边界通常就是左手路径与右手路径。关于左右手路径可以参考POJ 3083。如果一个正方形既能够封...原创 2019-02-18 22:44:53 · 255 阅读 · 0 评论 -
POJ 1753 Flip Game Java实现版(利用队列实现bfs过程)
C++实现:https://blog.csdn.net/moon_sky1999/article/details/75127657Java代码:import java.io.*;import java.math.*;import java.util.*;public class Main { static int dx[] = {1, -1, 0, 0}; ...原创 2018-12-10 15:52:09 · 321 阅读 · 0 评论 -
POJ-2676--Sudoku POJ-2918-- Tudoku
题目来源:http://poj.org/problem?id=2918 http://poj.org/problem?id=2676剪枝+位运算。优化策略:每行每列按照已填好的数量进行排序,优先填已经填过的多的,这样可以减少搜索的宽度。代码:#include <cstdio>#include <cstring>#include <iomanip...原创 2018-08-14 15:28:54 · 193 阅读 · 0 评论 -
POJ1753 Flip Game
题目来源:http://poj.org/problem?id=1753 题目大意:给定一个4*4的黑白方阵,每次可使某一点及其上下左右相邻的四个点的颜色反转,问最小操作几次可使整个方阵变为全为黑色或全为白色。 状态压缩bfs。由于最多有2^16-1=65535种状态,只需使用一个vis数组来判重即可。 代码:#include <cstdio>#inclu...原创 2017-07-14 19:03:45 · 300 阅读 · 0 评论 -
NOIP2011 Mayan游戏
题目来源:https://www.luogu.org/problem/show?pid=1312没什么可说的,就是dfs,细节很多,调试了好久才调出来。重要的剪枝:因为向右移动的优先级高于向左的,故除非所枚举的格子左侧为空,其他的一律为向右的。由于是按优先级来搜的,一旦出结果,直接退出程序,因为此结果一定是最优的。代码:#in原创 2016-11-10 19:08:08 · 376 阅读 · 0 评论 -
NOIP2009靶形数独
题目来源:https://www.luogu.org/problem/show?pid=1074#sub相当繁琐的dfs,TLE了许多次,终于AC了。状态压缩来记录每个格子所在的行、列、区域内1~9的数字是否填过。(也可采用类似八皇后问题的处理方法)通过位运算操作。分别用h、l、b记录每一行、每一列、每一区域当前的状态,二进制下往左数第x位上是1表示数x再该行(原创 2016-11-09 10:21:10 · 447 阅读 · 0 评论 -
洛谷 P2622 关灯问题II
题目来源:https://www.luogu.org/problem/show?pid=2622状态压缩bfs。注意判重。代码:#include #include #include #include #include #include #include #include #include #include #include #include原创 2016-11-07 19:18:22 · 381 阅读 · 0 评论 -
洛谷 P1120 小木棍 [数据加强版]
题目来源:https://www.luogu.org/problem/show?pid=1120在各网站提交了不下20次,终于AC了.......一开始是用贪心做的,并没有考虑已拼接成的木棍在回溯时还会再拆开重组。程序跑得飞快但总WA几个点。在各网站提交都是WA。后来看了题解,做法都和我不一样,但我却找不出错误。生成了几组数据用题解对拍,才找出错误.原创 2016-10-30 15:07:16 · 946 阅读 · 0 评论 -
SDOI2005反素数
题目来源:https://www.luogu.org/problem/show?pid=1463#sub根据题意,搜索先构造素数表,直接引用。如果知道一个数的唯一分解形式,即x=p1^q1*p2^q2*......*pn^qn,其中p1,p2,...,pn均为素数。那么,其约数个数=(q1+1)*(q2+1)*...*原创 2016-10-12 09:44:35 · 380 阅读 · 0 评论 -
Codecraft-17 and Codeforces Round #391 C. Felicity is Coming!
题目来源:http://codeforces.com/contest/757/problem/C统计每种Pokemon出现的组的编号,存在一个vector。注意进行排序以及阶乘的处理。另外,取余运算用减法效率要高于%运算。代码:#include using namespace std;int n,m;const int maxm=1e6+10;const int mod=1原创 2018-02-02 23:11:50 · 198 阅读 · 0 评论