NOIP前-小题解合集

i207M

2018-10-12 14:17:23

Personal

## 空荡荡的摊位Empty Stalls 扫两遍即可; ## BAJ-Bytecomputer 一个性质是数列最终只会变成-101; 于是$dp[i][-1,0,1]$,转移要注意,仔细讨论,不一定完全依赖上一个数字,要用f转移; ``` if(a[i]==-1) { f[i][0]=f[i-1][0]; f[i][1]=(a[i-1]==1?min(f[i-1][0],f[i-1][1])+1:f[0][0]); f[i][2]=(a[i-1]==1?min(f[i-1][0],min(f[i-1][1],f[i-1][2]))+2:f[i-1][2]+2); } else if(a[i]==0) { f[i][0]=f[i-1][0]+1; f[i][1]=min(f[i-1][0],f[i-1][1]); f[i][2]=(a[i-1]==1?min(f[i-1][0],min(f[i-1][1],f[i-1][2]))+1:f[i-1][2]+1); } else if(a[i]==1) { f[i][0]=f[i-1][0]+2; f[i][1]=(a[i-1]==-1?min(f[i-1][0],f[i-1][1])+1:f[i-1][0]+1); f[i][2]=min(f[i-1][0],min(f[i-1][1],f[i-1][2])); } ``` ## 同谋者 Conspiracy 给定一张无向图,求将此图的点分成两部分,一部分形成团,另一部分形成独立集的方案数; 2-Sat求出任意一组方案;然后,所有其他方案和此方案的区别,只能是 交换了不同集合的两个点;预处理出如果一个点改变集合,那么有几个点和它冲突(冲突数>1就没用了) 分情况讨论:一个点单独过去;两个相互指的点交换;一个有一个矛盾和没有矛盾的交换; 注意去重,注意集合不能为空; ## 染色 query时注意区分左右端点 ## 牛的阵容Cow Lineup 直接尺取法就行,然而我写了树状数组(线段树)求区间不同的数的个数; ## 定价 不要总想着让数字最小,可能为了5,要给这个数多一位 ## 解方程 a×b=(a&b)×(a|b)在[0,31]内的解; 可以发现,只有当一个数被另一个数完全包含才可以;$\sum C^i_5 2^i$;计算完之后记得要×2再-31,因为是有序的; 科学的解释是:设a and b=x,a xor x=y,b xor x=z,则(x+y)(x+z)=x(x+y+z),即yz=0,即a and b=a或a and b=b ## 红球蓝球 一个人摸球,有相同概率得到蓝球和红球,得到红球立即停止,得到蓝球继续摸,问期望得到的红球蓝球数量比? 1:1;红球为1;蓝球为$\sum i 2^{i+1}$,因为要在这里停止; 概率好题; ## 数位平方和 注意到最大的数才3e6左右,将hn是为一个出边,则n个点n条边,形成了基环树森林;于是可以tarjan缩点双,反向建边拓扑排序;但是有更简单的方法,直接dfs,当一个点被第三次遍历时,这个环就被覆盖两遍,递归回去时就能得到正解; ## Forest ATC 001D 特判已经联通的情况;对于其他情况,我们需要选出一共$2n-2$个点,并且每个联通块都要选至少一个; ## 假期绘画Holiday Painting 看到列数很少,对每一列维护一棵线段树即可; ## CF912E Prime Gift 看到求第k大,k还很大,一定就要二分数字大小; 现在就变成了,如何统计小于它的,由那些因数构成的数字的个数; 我们可以像某道考试题一样,将n分成两半,爆搜用这两半的质数构成的数字,然后统计答案时维护双指针扫一下; ## CF888E 折半爆搜 ## 计蒜客 百度地图的实时路况 其实是一个cdq分治,但是很好写; 题意:依次求出不经过1...n的每个点,求一遍每个点对的最短路; 自己最开始想的是维护前缀后缀,然后拼在一起什么的,但是发现不行; 其实这个分治,就类似一种DFS,或者线段树一样的操作; Floyd的本质其实就是一个DP ,其中中介点k是DP的阶段,表示已经取了[1.k][1.k]的点作为中介点 ;当然,也**可以改变枚举k的顺序,以获得想要的阶段**。 考虑分治算法。 对于区间[l,r],分成[l,mid]和[mid+1,r]两段,利用Floyd算法,将[mid+1,r]作为中介点加入,然后往[l,mid]分治下去;另一半同理。 记得像DFS一样回溯时,要恢复原数组; 这样,当l==r时,只有1个点没有作为中介点,累计答案即可 ``` LL sol(int l,int r) { LL res=0; if(l==r) { for(ri i=1;i<=n;++i) if(i!=l) for(ri j=1;j<=n;++j) if(j!=l) res+=(f[i][j]>=inf?-1:f[i][j]); return res; } int tmp[N][N],mid=(l+r)>>1; memcpy(tmp,f,sizeof f); for(ri k=mid+1;k<=r;++k) for(ri i=1;i<=n;++i) if(i!=k&&f[i][k]<inf) for(ri j=1;j<=n;++j) f[i][j]=min(f[i][j],f[i][k]+f[k][j]); res+=sol(l,mid); memcpy(f,tmp,sizeof f); for(ri k=l;k<=mid;++k) for(ri i=1;i<=n;++i) if(i!=k&&f[i][k]<inf) for(ri j=1;j<=n;++j) f[i][j]=min(f[i][j],f[i][k]+f[k][j]); res+=sol(mid+1,r); memcpy(f,tmp,sizeof f); return res; } ``` ## LG2651 添加括号III 根据观察,a1肯定是分子,a2肯定是分母,那么尽可能多的是a3以后的变为分子,怎么办呢? 很简单 a1/(a2/a3/a4/...)=a1a3a4.../a2 所以我们只要确认a1a3a4.../a2是否是整数。 ## 牛的照片Cow Photographs 看似是用树状数组动态求逆序对,实际上分析一下,维护一些数组就可以; ## [六省联考2017]期末考试 数据范围较小,可以直接枚举暴力;但是,更优雅的做法是发现一个单谷函数,然后三分法; 每次把一个数放在最后等于把它+n; ## [POI2006]PRO-Professor Szu 先Tarjan判强联通分量,然后拓扑排序; 这道题很坑啊,有很多地方需要注意: 1.最大值的限制;2.自环要把所在块设为有环;3.设为正无穷之前先看有没有方案; ## PUS 线段树优化建图+拓扑排序;注意数字的上下界限制; ## BZOJ2131免费的馅饼 可以拆开绝对值得到两个式子,然后???上高级数据结构?并不是; 首先发现这两个条件一定会同时被满足;如果这两个条件同时被满足,根据**同向可加性**,一定满足$t_j<=t_i$,这也解决了我一直的疑问; ## 基因匹配 看到位置只有5个,枚举; ## 航线规划 找出一棵以时间排序的最大生成树;对于一条非树边,它的作用就是把链赋值为0; SB错误:建边没建双向边;线段树开小了; ## [Jsoi2015]salesman 比较水的树形DP,就是统计解数那里出问题了; 应该是:选择的数字有多解,选择的最后一个数字有多个,或者有0,就是多解; 但其实数据还有待加强:1.根节点要和0特判一下;2.如果有两个小数字可以代替一个大数字,理论上也是多解; ## Censoring 审查 字符串花式题;做法多种多样:KMP+链表/并查集、AC自动机+栈、Hash; ## [POI2017]Sab BZOJ怎么T了,不管了,钉子上A了; 二分mid,树形DP判定,记得清空数组; ## POI2017Kontenery (kon) 给定数组,每次操作每隔d个+k,问最终数列; 对d分块,大的暴力,小的差分一下; ## 成绩调研 这⼀次的考试,学⽣的成绩分为k等,成绩单上按照学⽣的学号排序。此外,学校要抽⼀些同学的考卷去调研,⽯神将这个任务委派给了你。 抽取的样本有如下要求: 学号连续的学⽣ 得到1等的学⽣数量在[l_1,r_1]区间内 得到2等的学⽣数量在[l_2,r_2]区间内 … 现在请问有多少种抽取样本的⽅法。 这道题有单调性,可以双指针做,但是有更好的方法:对每个k考虑,然后把区间取一个交集就好;处理出每个点的等级的左右边界,然后左端点和上一个点的左端点,自己的限制取max;右端点同理取min; ## [HNOI/AHOI2018]道路 可能是普及组的树形DP:暴力状态$f[i][j][k]$表示考虑完i的子树,向上有j条旧公路k条旧铁路的最小代价; ## CF859E 有 m 个人,n 张椅子,第 i 个人只能坐在第 ui 或第 vi 张椅子上。求有多少种方案满足没有人坐在同一张椅子上。 把椅子作为点,人作为边,变成一个图。 每个连通块可以分开考虑。 假设某个连通块中有 v 个点,e 条边,由于连通,有 v − 1 ≤ e,并且若 e > v 则无解,所以 e 只有 v − 1 和 v 两种取值。 假如 e = v − 1,那么该连通块有 v 种方案:考虑枚举每个点不放的情况,其他的点都可以唯一确定。 假如 e = v 且环长 > 1,那么该连通块有 2 种方案:考虑环上的一条边,这条边的放法确定后其他的都可以唯一确定。 ## [SCOI2012]滑雪 特殊的最小生成树,先按高度排序,再按距离排序; 为什么?转移的过程中,只能从高度高的向高度低的转移。所以我们对于所有可以拓展的点,先拓展高度更高的,最终答案不会更劣。 ## POI2012-ROZ 贪心的每次选择最大的斐波那契数; ## [POI2015]PIE ~~真的是睿智了~~ 时间复杂度感觉不对,原来是想的不够机智; 对印章,求出每个黑点的相对最左上的黑点的位置,这样染色的话,一个黑点只会被遍历一次! ## [SCOI2005]栅栏 记录浪费了多少和前缀和,这个剪枝超快;