
乱搞
zhouyuyang233
此乃ZJ之蒟蒻也
望大牛勿喷
我等蒟蒻感激不尽
展开
-
bzoj1395: [Baltic2005]Trip
传送门 我们可以将问题转化为中间乘坐公交的最长时间。 然后我们对于每条边我们把它当成在a时刻出发,中间乘坐时间为c-b,到达时间为d的一条线路。 然后你就可以想到一个O(NM)的动归, f[i][j]表示在j时刻到达i的左右答案 当然那一定是TLE+MLE 于是我们考虑优化。 我们发现原方程有两种转移: 1:f[i][j]=f[i][j-1] 2:f[i][j]=f[k][l]+d原创 2017-07-27 21:51:33 · 334 阅读 · 0 评论 -
bzoj1306: [CQOI2009]match循环赛
传送门 显然是爆搜+O(玄学)优化。 剪枝1:如果全取3或全取0仍不可行退出。 剪枝2:如果还有n个队没有比过,分数差n*3-1,退出。 然后就过了呀。#include<cstring>#include<cstdio>#include<iostream>using namespace std;const int f[]={3,1,0,0};int a[9],b[9],n,ans;原创 2017-04-22 17:28:10 · 1063 阅读 · 1 评论 -
bzoj1301: [LLH邀请赛]参观路线
传送门 按照题目说的做是不会挂掉的,但是会TLE+MLE掉的。 考虑用链表进行优化。我们删掉一个元素,之后就再也比用访问了。 如果当前边不存在就枚举下一个节点。(二分) 可以证明上面情况最多出现O(N)次。 时间复杂度O(NlogN)#include<cmath>#include<cstdio>#include<vector>#include<cstdlib>#include<cs原创 2017-05-23 21:14:17 · 421 阅读 · 0 评论 -
bzoj1507: [NOI2003]Editor
传送门 这题是bzoj1269的弱化版。 题解见bzoj1269: [AHOI2006]文本编辑器editor#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>#include<ext/rope> using namespace原创 2017-05-03 13:33:28 · 422 阅读 · 0 评论 -
bzoj4885: [Lydsy2017年5月月赛]长方体
传送门 好题(蛋疼题) 《出题人各种被*系列》《论如何快速找*》首先长方体每个顶点等价,不用算8个。 其次一个点最远的距离显然是在3个与其不相邻的面取到的。 然后我们大力枚举3个面,大力来一发三分套三分。 接下来的问题是,如何求出长方体上两个顶点之间最短路的距离。 1.展开图如下: 这种情况十分简单,自己yy一下就可以了。 2.展开图如下 这也也是可以用勾股定理算出来的。 到原创 2017-05-10 21:21:53 · 453 阅读 · 0 评论 -
bzoj4879: [Lydsy2017年5月月赛]失控的数位板
传送门 首先,我们可以求出每一个节点最后被访问的时间。 如果一个被访问国的节点节点有颜色,则必须在他之后故障。 否则必须在他之前故障。 当然,如果又未被访问到的有色节点显然会挂。 为了加速求节点最后访问时间的速度,我们可以用map存下没有访问的节点。 这样时间复杂度就降到了N^2logN#include<set>#include<cmath>#include<cstdio>#inc原创 2017-05-10 20:56:22 · 538 阅读 · 0 评论 -
bzoj1493: [NOI2007]项链工厂
传送门 能不用splay坚决不用splay—–zyy 这道题如果没有旋转翻转操作的话就是一道区间修改,区间查询的线段树水题。 那么对于R,F操作应该怎么处理呢? 其实R,F操作之后珠子的相对位置没变 通俗来说就是一个珠子左右两边的珠子还是原来那两个 所以对于R,F操作我们只需要分别记录两个量即可:mov,rev 1.mov:表示当前整体顺时针移动了mov(即k变成k+mov) 输入R原创 2017-05-02 13:53:31 · 480 阅读 · 0 评论 -
bzoj1484: [HNOI2009]通往城堡之路
传送门 这题太迷的。。。 并不会证这个玩意为什么是对的。。。 固定第一个点的值,其他点的值取a[i]-(i-1)*d(这个点能取的最小值) 然后每次找一个后缀,把这个后缀所有数加一个大于0的值,且保证这是最优的取法下加的尽量大的值。 由于每次把一个数加到最值所以复杂度是O(n2)的。#include<iostream>#include<cstdio>#include<cstrin原创 2017-05-01 15:40:17 · 475 阅读 · 0 评论 -
bzoj1432: [ZJOI2009]Function
传送门 一看就知道是结论题。 让我们手玩一发。 当n==1,答案是1 当n==2,答案是2(显然成立) 对于其他n,显然可以上下翻转,于是对于求f%28n/2%29”>k的,等效于求f[n-k]。 然后开始手玩。 我们从上往下增加直线,当已经放了k-1条直线,在放第k条直线的时候,如果直线k和直线k-1的交点在k-1原有交点的右边,坑定会影响前面的答案,不是最优,所以强行让交点在倒原创 2017-04-29 21:02:46 · 400 阅读 · 0 评论 -
bzoj1414: [ZJOI2009]对称的正方形
传送门 显然是可以用manacher驶过去的。 首先为了避免边长奇偶性带来的问题, 我们要把矩阵扩大二倍: 然后开始闷声做大死系列:哈希+二分答案。 把这个矩阵从四个角各哈希一遍 对于每个点二分答案 验证时将四个哈希值全都取出来对比即可 然后只枚举i+j为偶数的点 得到的边长除以2就是以这个点为中心的正方形回文子矩阵数量 记得二维哈希的时候横竖的BASE值不能相同,用unsigned原创 2017-04-29 14:47:29 · 644 阅读 · 0 评论 -
bzoj1411: [ZJOI2009]硬币游戏
传送门 手玩样例发现发现2^k变换之后,第i个位置的硬币情况只与它左右的第k+1个硬币有关。 如k=0,第3位硬币情况只与2和4位硬币有关。因为t可以拆成若干个2^k的和,于是对每个2^k进行O(n)的变换,总复杂度O(nlogt)。“`includeincludeincludeincludeincludeincludedefine ll long longusing namespace std原创 2017-04-28 19:10:05 · 398 阅读 · 0 评论 -
bzoj1043: [HAOI2008]下落的圆盘
传送门 看到数据范围不大,暴力走起。 枚举每一个圆,如果被完全覆盖直接退出。 否则如果被覆盖掉一部分就求出覆盖区间。 然后就是sb的区间覆盖问题了。#include<cmath> #include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#define pi aco原创 2017-04-18 10:18:27 · 211 阅读 · 0 评论 -
bzoj1561: [JSOI2009]去括号
传送门 好的乱搞题一道。 先用栈处理出每个左或右括号对应的另一个右或左括号的下标。 然后求每个运算符的优先级。 具体是这样的: (1)定义一个临时变量j,表示当前位置的优先级,然后遍历表达式,初始j为1。 (2)进入一个括号j加2。(即遇到左括号) (3)+和-的优先级直接赋j。 (4)*和/的优先级赋j+1。 (5)退出一个括号j减2。(即遇到右括号) 当然我们要特判掉((st原创 2017-05-05 15:36:52 · 494 阅读 · 0 评论 -
bzoj1105: [POI2007]石头花园SKA
传送门 篱笆的长度最小是第一目标,应当优先考虑。 易知,当所有石头的坐标都满足x<=y的时候、 一定能够得到最小的周长。 而满足这一周长的方式不止一种,可以将这个矩形关于y=x直线做对称,总共有四种可能的情况,全部枚举一遍即可。#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostr原创 2017-05-19 18:30:59 · 518 阅读 · 0 评论 -
bzoj1807: [Ioi2007]Pairs 彼此能听得见的动物对数
传送门 首先题目明摆着让你分类讨论骗分 如果是1维直接Two pointer扫一遍 对于2维我们转换坐标系之后扫描线+树状数组维护。 对于3维我们按照2维的做法转换坐标系之后暴力求这个点能听到的动物个数,注意答案要除2.#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>原创 2017-06-15 21:09:42 · 417 阅读 · 0 评论 -
bzoj1943: [Ceoi2007]Nasty Calculations
传送门 我们发现这个式子可以被化简为一个一次多项式。 然后我们大力算出多项式 每一次大力计算即可 当然,我们显然需要取模偷懒233.#include<map>#include<cmath>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<alg原创 2017-07-26 21:15:22 · 316 阅读 · 0 评论 -
bzoj1942: [Ceoi2007]Ministry
传送门 我们在建树的时候求出每个节点的哈希值 哈希函数你就乱搞一下 反正出题人不会来卡你哈希#include<map>#include<cmath>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define N 100原创 2017-07-26 21:07:33 · 378 阅读 · 0 评论 -
bzoj1932: [Shoi2007]Setstack 集合堆栈机
传送门 大力哈希乱搞。 每次操作产生的新的set我们判断之前有没有出现过 每次大力插入就可以了。 至于判断交集并集,我们大力使用stl中的函数 algorithm里封装了两个函数是set_union和set_intersection,用于求集合的并和交。 用法是set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(x原创 2017-07-23 17:07:47 · 430 阅读 · 0 评论 -
bzoj1856: [Scoi2010]字符串
传送门 巧妙的思想。 首先我们可以将0看成(1,-1)的向量,1看成(1,1)的向量 然后题目就变成了从(0,0)走到(n+m,n-m)且不经过直线y==-1的方案数。 我们首先去掉不经过直线y==-1的方案数,发现答案=C(n+m,n) 然后我们考虑计算GG的方案数。 首先,GG的方案数和y=-1一定有交。 于是我们找到最后一次和y=-1的交,然后将之前的部分以y=-1为对称轴翻转。原创 2017-06-26 21:27:23 · 276 阅读 · 0 评论 -
bzoj1854: [Scoi2010]游戏
传送门 神奇的并查集。 我们可以将一个拥有属性A,B的武器看成A,B之间的一条无向边 如果一个联通块中边的条数==点数-1, 则必定有一个数无法被凑出 否则一定存在方案凑出所有数 对于一个联通块中边的条数==点数-1, 我们显然选择放弃最大的点。 然后并查集XJB搞一下就可以了var f,v:array [0..1000005] of longint; n,i,x,y,p,q原创 2017-06-26 21:18:16 · 241 阅读 · 0 评论 -
bzoj1789&&bzoj1830: [Ahoi2008]Necklace Y型项链
传送门 首先考虑两条链条的情况。 显然拆到两条链条相同为止。 那如果是三条呢? 显然根部相同部分可以无视。 然后枚举两条链条。 显然将两根链条吵到相同,将第三根拆到低再补上来最优 原因自己YY 然后就是枚举那两个子串了。#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algo原创 2017-06-09 21:16:48 · 474 阅读 · 0 评论 -
bzoj1768: [Ceoi2009]logs
传送门 显然我们可以一行一行做。 然后求出每列向上连续1的个数。 然后单调队列随便水过。#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;char s[1505];int f[2][15原创 2017-06-08 20:53:43 · 367 阅读 · 0 评论 -
bzoj1534: [POI2005]Sum- Fibonacci sums
传送门 首先暴力相加。然后考虑修改。 首先2*f[i]==f[i]+f[i-1]+f[i-2]=f[i+1]+f[i-2],转化为f[i+1]++,f[i-2]++; 然后如果f[i]==1&&f[i+1]==1,转化为f[i+2]++; 然后xjb乱搞一发就ok了。#include<cmath>#include<cstdio> #include<cstring>#include<cs原创 2017-06-03 21:34:03 · 569 阅读 · 0 评论 -
bzoj4925: 城市规划
传送门 首先我们可以将大楼覆盖区域给求出来。 然后,对于每一个连续区域,我们枚举每个人行道能被覆盖的区间。 然后差分掉,变成单点加减。 然后….就没有了#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define N 100原创 2017-06-19 09:14:01 · 525 阅读 · 0 评论 -
bzoj4921: 互质序列
传送门 首先题目答案可以分为三部分:只取左边,只取右边,两边都取。 发现这些问题可以由前缀gcd和后缀gcd得到。 然后可以证明前缀gcd和后缀gcd一定可以分成段数不超过logAi的相同子序列。 因为每一次gcd改变,至少除以2. 然后就是枚举起点套终点的问题了。 话说标程是O(N)的,但是我是O(NlogAi^2的) 像这种数据范围怎么可能卡log^2算法呢?#include<cm原创 2017-06-18 21:29:31 · 1497 阅读 · 0 评论 -
bzoj4917: Hash Killer IV
传送门 话说标准题解里要用扩欧? 我太弱了,想不出来用扩欧怎么做。 然后我就自己yy了一个做法: 每一次总有某些二进制位上不会改变。 然后根据这些不会改变的位置推出其他改变过后的位置。 这种做法好像是对的? 反正b站上A了就当他是对的 时间复杂度O(QlogAi)#include<cmath>#include<cstdio> #include<cstdlib>#include原创 2017-06-18 21:18:10 · 568 阅读 · 0 评论 -
bzoj1177: [Apio2009]Oil
传送门 水题。 首先暴力求出所有k*k矩形的和,时间N^2 然后对每个点用前缀和维护出左上,左下,右上,右下的最大矩阵,再对每一行(列)维护以这一行(列)为底边的最大矩阵,然后枚举分割线暴力求解, 分割线只可能有6种情况, 暴力水过。uses math;var a,b,c,d,f:array [0..2505,0..2505] of longint; n,m,k,i,j,an原创 2017-04-02 15:39:11 · 379 阅读 · 0 评论 -
bzoj1088: [SCOI2005]扫雷Mine
传送门 只要确定第一行第一个位子是否有雷就可以知道整张图的地雷分布情况。 直接上暴力水过。 当年我too young too simple 打了动归。 f[i][j][k]表示前i个位置,i-1的状态为j(1表示有雷),i的状态为k的方案数。 也是线性时间复杂度。var a:array [0..10005] of longint; f:array [0..10005,-1..3,原创 2017-03-30 21:31:54 · 441 阅读 · 0 评论 -
bzoj1954: Pku3764 The xor-longest Path
传送门 首先假设1为根,求出根到当前节点的xor距离。 然后将xor距离转化为二进制串,建立Trie树。 强制一些点在答案上,然后在Trie树上跑贪心。 显然答案是正确的。 时间复杂度O(n*32)#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#includ原创 2017-03-14 11:06:03 · 448 阅读 · 3 评论 -
bzoj1046: [HAOI2007]上升序列
传送门 首先我们可以倒着做一次最长下降序列,记录以x结尾的最长下降序列的长度。 然后反过来,我们就有了以x开头的最长上升序列的长度。 我们正着推过去,可以知到当长度大于x是这个点可选,此时长度-1,输出答案。 有点说不清楚,没看懂的请转弯var a,f:array [0..10005] of longint; n,i,j,max,m,l,last:longint;begin r原创 2017-03-08 15:46:27 · 304 阅读 · 0 评论 -
bzoj1071: [SCOI2007]组队
传送门 O(n^3)的应该都会吧(枚举身高最小值,速度最小值和合法人员数量) 正解是O(n^2)乱搞。 先按照A*s+B*h排序, 枚举S最小值,在枚举V的同时维护一个合法人的单调序列,因为这一定是相邻的一串。(我并不晓得为啥,假装他是对的) 好像还是讲不清楚,可以看一下他的#include<cstring>#include<cmath> #include<cstdio> #i原创 2017-03-17 21:13:19 · 685 阅读 · 0 评论 -
bzoj1042 [HAOI2008]硬币购物
传送门 吐槽:老师居然两次拿这道题出模拟赛。 普通背包显然药丸 于是窝们考虑容斥 窝们可以先用O(N)的时间处理处一个无限背包 然后枚举哪一些物品超限。 超限的话先强行加入limit+1个物品,之后任取。 容斥一下就行了 时间O(N+16Q) 一些新闻:两个题目输入格式不同。 某头姓同学将第一题的代码直接拷到第二题上 于是乎收获一WA#include<cstdio> #in原创 2017-03-04 15:57:12 · 208 阅读 · 0 评论 -
bzoj1034: [ZJOI2008]泡泡堂BNB
传送门一群不务正业的省队选手打泡泡堂。一眼田忌赛马既视感(实际上就是)我们可以用A队最弱的打B队最弱的,打不过就打最强的,这样可以拿最高分。A最低时B最高,于是我们把B队也模拟一下设答案为ans,则最低分为2*n-ans。var a,b,c,d,aa,bb:array [0..100005] of longint; n,i:longint;procedure kp1(原创 2017-03-02 17:10:19 · 277 阅读 · 0 评论 -
1016: [JSOI2008]最小生成树计数
传送门并查集好题。用暴力求出最小生成树,确定每一种长度的边在图中的数量。又Kruscal算法流程知,每一种长度的边在图中的数量一定(否则存在更优解)对于每一个长度的边,爆搜求出方案个数。运用乘法原理求解即可。P.S:本题并查集无需路径压缩。/**************************************************************原创 2017-02-22 20:24:46 · 343 阅读 · 0 评论 -
bzoj1015: [JSOI2008]星球大战
传送门并查集裸题。按照星球毁灭顺序从后向前插点,并向可行点连边。插入一个点联通块+1;连接一条边联通块-1。PS刷水题有益于健康/************************************************************** Problem: 1015 User: zhouyuyang Language: Pascal原创 2017-02-22 20:22:14 · 364 阅读 · 0 评论 -
bzoj1028: [JSOI2007]麻将
传送门N^3暴力走你┏ (゜ω゜)=☞O(n)枚举加的牌,O(n)枚举对子的位置。然后O(n)模拟判断是否可行判断时先组刻子再组对子不知道N^3是怎么驶过去的。PE一级预警。var n,m,i,x,fl:longint; a,b:array [0..405] of longint;function jud:boolean; var i,j,fl:longi原创 2017-03-02 11:24:16 · 397 阅读 · 0 评论 -
bzoj1026: [SCOI2009]windy数
传送门数位dp入门题f[i][j]表示i位数,以j开头的windy数的个数于是我们只要实现查询1-x中windy书的个数就行了我们可以分块来做设x位数是l先处理1到l-1位数,sigma(f[i][j])(1然后我们先确定他的前j位(j可以为零)判断第j+1位严格小于且前几位相等的数的个数。具体实现见程序。var f:array [0..15,0..9]原创 2017-03-01 21:02:41 · 293 阅读 · 2 评论 -
bzoj1025: [SCOI2009]游戏
传送门首先根据置换的知识,每一个置换都可以表示成若干不想交的循环的乘积所有循环的规模A1+A2+……AK=n(显然)然后设最小公倍数为T则T可以写成a1^m1*a2^m2*a3^m3......的形式所以A1*A2*A3*......=a1^m1*a2^m2*a3^m3......当sigma(a[i])最小时显然有A1=a1^m1,A2原创 2017-03-01 20:48:59 · 398 阅读 · 0 评论 -
bzoj1012: [JSOI2008]最大数maxnumber
传送门单调队列裸题。维护一个单调队列,队列头元素大,尾元素小,存储数值和坐标,修改时用O(1)的时间插入,询问时用O(log)的时间二分查找在区间内的最大点。PS:刷水题有益于健康。/************************************************************** Problem: 1012 User: zhouyuy原创 2017-02-20 19:37:46 · 294 阅读 · 0 评论 -
bzoj1011: [HNOI2008]遥远的行星
传送门O(n^2)暴力应该会作吧。但是要TLE(松爷一下也许可以)但是注意到题目中要求误差以下是精妙(鬼畜)的乱搞:令i=a*j向下取整。Ans=sigma(Ak*Aj/(j-k))(1因为误差于是乎我们就可以对式子进行奇妙(古怪)的化简:Ans≈sigma(Ak*Aj/(j-0.5i))(1我们用一个前缀和求出sigma(Ak)(1然后就OK了。但原创 2017-02-20 19:30:59 · 528 阅读 · 0 评论