NOIP 模拟 $16\; \rm Star Way To Heaven$】的更多相关文章

题解 \(by\;zj\varphi\) 看懂题!!! 从最左穿到最右,一定会经过两个星星之间或星星和边界之间,那么我们穿过时当前最优一定是走中点 而我们要求最小的距离最大,那么我们将所有星星和边界(上下边界分别设为一个点)连成一个完全图,在图上跑出来一棵最小生成树 那么在最小生成树上的每条边的中点到边的端点一定比这个点到其它所有点的距离小,所以我们只需要找到一条在最小生成树上最大的边 注意,这道题是一个完全图,跑 \(\rm kruskal\) 当常数大时就 \(\rm TLE\) 了,所以跑…
T1:Star Way To Heaven 基本思路:   最小生成树.   假如我们将上边界与下边界看作一个点,然后从上边界经过星星向下边界连边,会发现,他会形成一条线将整个矩形分为左右两个部分.   并且很明显从左边界走到右边界一定会经过这条线的某一部分.   为了与星星和上下边界尽可能远,我们直接走两点连边的中点,这应该很好理解.   他要求最小距离,所以我们可以跑最小生成树.   然后在最小生成树的边里拣大的输出他的\(1/2\)即可.   我们将所有星星连边,并与上下边界连边,与上下边…
题解 \(by\;zj\varphi\) 一道凸包的题 设 \(\rm dep_u\) 表示节点 \(u\) 的深度,那么原式就可化为 \(-\frac{c_v-c_u}{dep_v-dep_u}\) 这个式子可以维护一个下凸包 但是递归弹栈的话会被卡成 \(n^2\),所以我们可以写一个可持久化栈,或者是倍增跳栈 对于一个新加入的节点,我们对比它和不同祖先的斜率,如果有一个祖先 \(fa\),\(\rm slope(x,fa)\le slope(x,fa[fa])\),那么就说明,我们要把 \…
题解 \(by\;zj\varphi\) 对于这道题,不难想到可以用 \(dp\),就是求一个最小权极长上升子序列 设 \(dp_i\) 表示最后一个选 \(i\) 时,覆盖前 \(i\) 条边的最小花费,设 \(\rm l_i\) 表示第 \(\rm i\) 条边前第一个 \(p\) 比 \(i\) 小的位置 那么能对 \(dp_i\) 转移的就是从 \(\rm l_i\) 往前的 \(p\) 上升的序列,这个东西要暴力转移的话,会达到 \(n^2\) 考虑线段树优化单调栈,用一棵线段树 \(…
败者死于绝望,胜者死于渴望. 前言 一看这个题就来者不善,对于第一题第一眼以为是一个大模拟,没想到是最小生成树. 对于第二题,先是看到了状压可以搞到的 20pts 然后对着暴力一顿猛调后来发现是题面理解错了. 最后 40min 的时候还是把目光投向了这个题的另一个部分分,然后搞了一个区间 DP 但是应该是 线性 DP. 然后我就又凉了,第三题第一眼是输,第二眼是 DFS 序,第三眼是 DFS 序上的线段树,再然后就老老实实去整暴力了. 后来题目名字在网上一搜,竟然都是歌名.. T1 Star W…
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   Censoring 记忆的轮廓 雨天的尾巴 总分 1 板B 87 03:20:06 0 03:23:09 100 03:20:42 187 03:23:09 2   100 03:20:20 0 03:20:49 50 03:26:26 150 03:26:26 2   100 03:19:16…
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照下来.他想让这一段中每个人的身高成等比数列,展示出最萌身高差,但他发现这个太难办到了,于是他决定放低要求,让等比数列的每两项之间可以是不连续的(例如 2,4,16--).可他依然找不到满意的,便再次妥协,使这个等比数列可以是乱序的. 现在请在其中你找出最长的符合要求的一段,使得将这一段排序后为某个公…
题解 \(by\;zj\varphi\) 对于一个数,如果它二进制下第 \(i\) 位为 \(1\),那么 \(\rm x\) 在这一位选 \(1\) 的贡献就是和它不同的最高为为 \(i\) 的数的个数 这个东西很好搞,整一个 \(\rm 01trie\) 就行,每会插入的时候直接统计即可 但是如何求第 \(p\) 位,二分,但每回二分时 \(2^k\) 搜索一遍就超时了,\(\rm meet\;in\;the\;middle\) 发现每一位是相互独立的,也就是说它们之间是不会互相影响的,所以…
题目真是越来越变态了 T1 Star Way To Heaven 首先,你要看出这是一个最小生成树的题(妙吧?) 为什么可以呢? 我们发现从两点连线的中点过是最优的,但是上下边界怎么办呢? 我们把上下边界看作两个点,每个点和它都连边,这样就可以跑最小生成树了 然而不能用kruskar,多一个$log$就会炸列 只能选用$prim$算法$n^2$已经是最优秀的了 找到生成树里面最大的边/2即可 1 #include<bits/stdc++.h> 2 using namespace std; 3…
ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑到下边界,一定会出现一条将矩阵纵向一分为二的折线,其中线段都是最小距离,答案就是其中最长的线段的一半. 我直呼NB 由于这是个完全图,kruscal比prim多个log,会炸. code: 1 #include<bits/stdc++.h> 2 #define debug exit(0) 3 us…
1.要选一个{1,2,...n}的子集使得假如a和b在所选集合里且(a+b)/2∈{1,2,...n}那么(a+b)/2也在所选集合里 f[i]=2*f[i-1]-f[i-2]+g[i] g[n]:选1,n的方案数 观察性质,模拟+元素的过程推知集合中元素是等差数列,且公差=1(mod 2) 故g[n] = n-1的奇约数 f长这样: 1 : 22 : 43 : 74 : 125 : 186 : 267 : 368 : 489 : 6110 : 7711 : 9512 : 11513 : 137…
期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 既眼瘸又脑残,NOIP这样后悔去吧! T1 n*m网格,有S种颜色. 按从上到下,从左到右的顺序涂色. 相邻的相同色块可得一份,问最大得分 n,S<=100000,m<=4 只有最多4列 1列:顺着涂 2列:先涂可以涂偶数个 3列:先涂%3=0的,然后一个%3=1和一个%3=2的组合,剩余的顺着涂…
又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1,不解释. 对于最大的数据,我们可以用exgcd求出一组特解,之后的通解为x+(b/gcd)*k, y+(a/gcd)*k. 求出正整数解的个数即可. 注意有很多特判,慢慢调试就好(改这题的时间比我改T3的时间都长) #include<bits/stdc++.h> #define m 65535…
今天起来就是虚的一批,然后7.15开始考试,整个前半个小时异常的困,然后一看题,T1一眼就看出了是KMP,但是完了,自己KMP的打法忘的一干二净,然后开始打T2,T2肝了一个tarjan点双就扔上去了,回来接着肝T1,然后就想起之前的一道AC自动机的考试题,正解虽然是AC自动机但是却有人打hash,然后就有人AC了,所以这道题我也鼓起勇气打起来hash,然后,我就开始对拍.重点是我的对拍的暴力程序是从1枚举到n,也是hash,所以高高兴兴的开始对拍,按说这道题我的暴力程序就可以AC(事后证明确实…
一直没时间写QwQ 于是补一下. Day 1 晚饭吃的有点恶心…… $1s\,2s\,5s$ 还开 -O2 ?? 有点恐怖. T1 猛的一想: 把外面设成一个点, 向入口连一条权为排队时间的边 从出口连一条权为排队时间的边. ××我又审错题了,就只能进出一次=.= 最短路?? 建反图, 然后从终点跑一个 dij 由于点数少,我觉得$N^2$仿佛都能过=.= 起点直接搜,类似$A^*$? 去搜时间允许下的点的$maxsize$ 可以搞个搜索树,这样就可以严格限制为$\Theta(N)$ 于是时间还…
5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[尴尬\(.jpg\)] \(T1\)P3322 [SDOI2015]排序 背景 说实话,看见这题正解是dfs的那一刻,我人都傻了[流泪.jpg] 在讲这题的时候赵队@yspm 类比了线段树的思想%%%%%,在食用本篇题解时可以想一下 解题思路 最基本的一个思想:结果与操作的顺序无关,因为在更换的时候…
5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Prime() { for(int i=2;i<=M;i++) { if(!b[i]) pri[++tot]=i; for(int j=1;j<=tot&&i*pri[j]<=M;j++) { b[i*pri[j]]=true; if(!(i%pri[j])) break; }…
题解 \(by\;zj\varphi\) 发现就是一棵树,但每条边都有多种不同的颜色,其实只需要保留随便三种颜色即可. 直接点分治,将询问离线,分成一端为重心,和两端都不为重心的情况. 每次只关心经过重心的询问,其他询问不管,具体实现就是点分治的套路,每次搜一棵子树,更新标记. 动归有些小细节,尽量边权化点权,不容易出错,式子直接看官方题解. 复杂度 \(\mathcal O\rm(3^3nlogn+3^4q)\) Code #include<bits/stdc++.h> #define Re…
题解 \(by\;zj\varphi\) 发现右端点固定时,左端点的 \(min-max\) 单调递减,且对于 \(or\) 和 \(and\) 相减,最多有 \(\rm2logn\)个不同的值,且相同的值构成一段连续的区间. 那么就可以在最远的,符合答案的第一个区间二分答案. 具体实现可以用一个链表,每次扫一遍合并,并倒着查合法区间,这样就能做到 \(\rm nlogn\). Code #include<bits/stdc++.h> #define ri register signed #d…
题解 \(by\;zj\varphi\) 引理 对于一个和为 \(n\) 的数列,不同的数的个数最多为 \(\sqrt n\) 证明: 一个有 \(n\) 个不同的数的数列,和最小就是 \(n\) 的排列时 \(\frac{n(n+1)}{2}\),是 \(\sqrt n\) 级别的. 那么,直接用 \(set\) 维护一下有多少不同的堆数,再记一个桶维护每种数的堆有多少个,询问时直接二分查找即可. 复杂度 \(\mathcal O\rm(q\sqrt nlogn)\) Code #includ…
题解 \(by\;zj\varphi\) 发现每个点的权值都可以表示成 \(\rm k\pm x\). 那么对于新增的方程,\(\rm x_u+x_v=k\pm x/0\) 且 \(\rm x_u+x_v=s\). 如果 \(x\) 项系数为 \(0\),那么就只需判断 \(\rm x_u+x_v=s\) 有无解. 若不为 \(0\),那么直接解出 \(x_1\) 并判断是否是小数即可. 修改操作就是对一段区间的值加或减,直接树状数组,复杂度 \(\mathcal O\rm((n+q)logn)…
题解 状压 \(\rm DP\). 从 \(1\) 到 \(n\) 一共只要一条路径,那么就是一条链,只要维护一个点集和当前链的末尾就行. 设 \(\rm dp_{i,j}\) 为 \(i\) 的点集末尾为 \(j\) 的最大权. 转移有两种: 在链的末尾加上一个点. 在链的末尾加上一个点集,这个点集就代表无关的联通块只能和答案链最多连接一个点. Code #include<bits/stdc++.h> #define ri register signed #define p(i) ++i n…
题解 \(by\;zj\varphi\) 题意就是维护 \(\rm max\{01mx,01l+01r\}\) 就是最长连续的一段 \(0\),左右 \(0\) 区间的加和. 可以启发式合并,也可以直接线段树合并,复杂度 \(\mathcal O\rm(nlogn)\) Code: #include<bits/stdc++.h> #define ri register signed #define p(i) ++i namespace IO{ char buf[1<<21],*p1…
题解 \(by\;zj\varphi\) 发现当把 \(\rm scale×cos\theta,scale×sin\theta,dx,dy\) 当作变量时只有四个,两个方程就行. 当 \(\rm n\le 500\) 时,可以选取两组进行高斯消元,解出答案后回带. 但当 \(n\) 极大时,采用随机化的做法,每次随机选取两个,这样每次选取不正确的概率为 \(\frac{3}{4}\),选取 50 次后基本就会出答案了. 记得判断 \(\rm sin\) 的正负 Code #include<bit…
题解 \(by\;zj\varphi\) 因为对于所有区间,都只有包含和被包含关系,这就是一个树形结构. 设 \(\rm f_{i,j}\) 表示在第 \(\rm i\) 个节点,最多被覆盖 \(\rm j\) 次的答案,方程显然. \[\rm f_{i,j}=\max\{f_{son_i,j-1+a_i}\} \] 可以发现,对于一个 \(f_i\) 它的差分数组是单调不增的. 证明: 对于一个 \(f_i\) 如果 \(f_{i,j}-f_{i,j-1}<f_{i,j+1}-f_{i,j}\…
题解 \(by\;zj\varphi\) 考虑如何才能最优. 每次一定把当前最小值移动到边界上,那么看它向左还是向右移更优. 用树状数组维护一下即可,复杂度 \(\mathcal O\rm (nlogn)\) Code #include<bits/stdc++.h> #define ri register signed #define p(i) ++i namespace IO{ char buf[1<<21],*p1=buf,*p2=buf; #define gc() p1==p…
题解 很容易求出在没有字典序最大的限制条件下的最多胜利场数. 这样就可以对于每一位放最优的解,怎么做,二分答案. 分两种情况,一种是当前一位是输的,一种是赢的,复杂度 \(\mathcal O(\rm nlog^2n)\) 卡卡常即可. Code #include<bits/stdc++.h> #define ri register signed #define p(i) ++i namespace IO{ char buf[1<<21],*p1=buf,*p2=buf; #def…
题解 \(by\;zj\varphi\) 原题问的就是对于一个序列,其中有的数之间有大小关系限制,问有多少种方案. 设 \(dp_{i,j}\) 表示在前 \(i\) 个数中,第 \(i\) 个的排名为 \(j\)的方案数 方程: \[f_{i,j}=\begin{cases} \sum\limits_{k=j}^{i-1} f_{i-1,k},(p_{i-1}<p_i)\\ \sum\limits_{k=1}^{j-1} f_{i-1,k},(p_{i-1}>p_i)\\ \end{case…
题解 \(by\;zj\varphi\) 如何判断一个集合可以被拆成两个相等的部分? 枚举两个集合,如果它们的和相等,那么他们的并集就是合法的,复杂度 \(\mathcal O\rm(3^n)\) \(\rm\;meet\;in\;the\;middle\) 优化,将序列分成两段,枚举第一段的每个数加到哪个集合,用 \(\rm hash\) 表存一下. 在后半部分扫完后,再扫前面的每个集合,得到答案. 复杂度 \(\mathcal O\rm (3^\frac{n}{2}+6^\frac{n}{2…
题解 \(by\;zj\varphi\) 首先考虑,如果将一个点修改成了黑点,那么它能够造成多少贡献. 它先会对自己的子树中的答案造成 \(w_x\) 的贡献. 考虑祖先时,它会对不包括自己的子树造成 \(w_fa\) 的贡献. 那么思路很显然,直接暴力向上更新,若更新到一个祖先,它已经被更新过了,那么更新完它之后直接退出就行,因为再向上,一定已经被更新过了. 实现的过程用在 \(\rm dfs\) 序上建线段树即可. 这样,每个点最多被更新一次,在询问时,最多重复更新一个点,所以总复杂度为 \…