【初中部 NOIP提高组 】模拟赛B
chiyankuan
这个作者很懒,什么都没留下…
展开
-
2018.07.09【2018提高组】模拟B组(拓展gcd)
今天的题较水。T1:带边权的并查集,不过要注意合并时的边权复制,假设要把x与y合并,x的祖先为x1,y的祖先为y1,则x1到他的父亲(y1)的边权为-sx+sy+l,sx为x到x1的边权和,sy为y到y1的边权和,l为x到y的距离。这个画个图就很清楚了。T2:拓展gcd。从小到大枚举m,然后枚举i,j。若这个m是不合法的,那么必有c[i]+p[i]*x=c[j]+p[j]*x(mod m)且0&l...原创 2018-07-09 16:56:27 · 182 阅读 · 0 评论 -
斜率优化
以高中OJ1749(也就是B组8.7T2)为例。这题50分的做法是设f[i]表示第i个点的答案,那么从n推到1,则f[i]=min(f[j]+(j-i)*a[i]+b[j])(j>i),最后的答案就是f[1],但这样会超时。若存在j,k(jf[j]+j*a[i]-i*a[i]+b[j]f[j]+j*a[i]+b[j]令g[x]=f[x]+b[x]g[j]+j*a[i]a原创 2017-08-08 20:04:49 · 407 阅读 · 0 评论 -
2017.09.09【NOIP提高组】模拟赛B组
T3:首先我们考虑一下,当存在一个a[i]=b[j]时,那么A中的第i个位置与B中的第j个位置对齐时,他们就对答案有贡献。举一个例子:*A***A(*为未知)那么我们看到那两个A,首先把他们对齐: *A***A那么这一对的答案就是2*1=2。其中第一个因数的意义就是从A最多可以往前的公共部分的长度为2,第二个因数的意义是从A往后公共部分的长度为1。通过这个我们可以发现原创 2017-09-09 16:37:26 · 180 阅读 · 0 评论 -
2017.08.15【NOIP提高组】模拟赛B组
T1:这题暴力枚举,找一个最近的点就好了。T2:设f[i][j]表示到第i个点上一次跳的距离为j,那么:f[i][j]=min(f[i+j][j],f[i-j][j-1])+a[i],观察转移方程,我们可以得到循环顺序因为先顺着枚举j,然后到着枚举i,最终的答案就是min(f[n][j])。总结:有时候dp时我们不知道应怎样确定循环顺序,这时我们可以通过观察状态转移方程原创 2017-08-15 21:23:15 · 184 阅读 · 0 评论 -
2017.08.06【NOIP提高组】模拟赛B组
T1:暴力dg(反着枚举),再加一个小小的剪枝:先维护一个前缀和,每次dg时判断一下若当前的重量加上剩下的所有重量还小于等于以求出的最大重量,那么就不往下搜了。T2:分层SPFA。总结:在做分层SPFA时,dis,bz,d这三个数组的形式一定要一模一样,否则会出现错误或超时。T3:设n>=m,那么最优解一定是先走长度为n这条边,再走长度为m的这条边。长度原创 2017-08-06 16:34:06 · 286 阅读 · 1 评论 -
2017.08.05【NOIP提高组】模拟赛B组
T1:一道水题,但是比赛时我却爆了0。只需把k转换成二进制数,再当成三进制数的形式输出。总结:要记住,二进制转换出来的数组的头实际上是相当于二进制数的尾,而数组的尾相当于二进制数的头。此题要从二进制数的尾开始枚举,也就是从数组的头开始循环。T2:状压dp。设f[i][j][k]表示已经选了i个人,选择的状态为j,目前的矛盾数量为k的方案数。则f[i][j][k]原创 2017-08-05 21:46:37 · 211 阅读 · 0 评论 -
2017.08.10【NOIP提高组】模拟赛B组
T1:这题是一道数学题。我们先来理解一下phi(m!)=m!*(1-1/p1)*(1-1/p2)*...*(1-1/pk),这条公式的原理就是在1~m!中,不为p1的倍数的数有m!*(1-1/p1)个,而在这些数中,不为 p2的倍数的数有m!*(1-1/p1)*(1-1/p2)个,如此类推,最终就得出了这条公式。而在1~n!中,不为p1的倍数的数有n!*(1-1/p1)个,接下来按原创 2017-08-13 09:42:13 · 241 阅读 · 0 评论 -
2017.08.08【NOIP提高组】模拟赛B组
T1:因为n很小,所以我们可以全排列枚举所有点放置的顺序,然后逐一模拟。模拟时每个园的最大半径就是它的圆心到边界以及已放置的圆的距离,对于已放置的圆的距离,我们可以用圆心之间的距离减去已知圆的半径。T2:dp。设f[i][j]表示前i个数删了j个数的最大答案,那么1、若删掉第i个位置,那么f[i][j]可由f[i-1][j-1]推来。2、若不删第i个位置原创 2017-08-08 19:28:41 · 169 阅读 · 0 评论 -
2017.08.07【NOIP提高组】模拟赛B组
今天又垫底了。。。T1:这题的方法十分巧妙,我当场没有想出来。其实我们的目的就是要把n-1个数变成0,而剩下的那一个数变成2^k。换句话说,就是把n个数的二进制表示形式变成n-1个0,1个10...0,。那也就是要我们尽可能的多消掉1。所以我们可以这样做:先把n个数都化成二进制形式,然后我们先考虑把最后一位的1给消掉。因为这n个数的和为2^k,所以一定有偶数个数的二进制形式原创 2017-08-07 16:53:35 · 188 阅读 · 0 评论 -
2017.07.09【NOIP提高组】模拟赛B组
T1:树形dp。我们把不能同时购买的物品连边,因为题目说明不会成环,所以连出来的就是一片森林。那么我们针对每一棵树做一次dp,最终答案就是把所有树的答案加起来。那么我们怎样来计算每一棵树的答案呢?我们设f[i][0/1],0表示第i个节点不选,1表示选的最大值,那么一棵树肯定是父节点选了子节点就不能选,所以:f[i][0]=f[i][0]+max(f[i][0],f[j][1])原创 2017-07-09 16:26:22 · 201 阅读 · 0 评论 -
2017.07.08【NOIP提高组】模拟赛B组
T1:找规律。一个长有a个点,宽有b个点的矩阵,以这个矩阵的格点为顶点且边平行于长或宽的长方形的个数为a*(a-1)/2*b*(b-1)/2。我们假设题目给出的n,m满足n**************我们可以通过容斥原理来计算总方案数。T2:并查集。由于删边很难,所以我们可以用增边的方式去做,那么这是最容易想到的方法就是并查集。要注意的是程序要打的优美点,因原创 2017-07-08 16:41:11 · 263 阅读 · 0 评论 -
2017.12.16【NOIP提高组】模拟赛B组
好久都没有写过题解了。T1:dp。设首先把矩阵中的每一个点都存到一个队列里,然后根据美观度从小到大排序。设f[i]表示到第i个点的最长时间,显然f[i]是由前面美观度比i点小的点转移过来。进一步优化发现,只有从美观度既小于i点有最大的点转移过来才是最优的,这样就可以了。T2:这题至今都不理解原理。做法是这样的:设f[i][j]表示i时刻到j位置的方案数,其中i原创 2017-12-20 20:09:28 · 149 阅读 · 0 评论 -
2017.12.30【GDKOI2018】模拟B组
这次比赛又翻车了,有两题都是已想到正解而没A的。T1:通过暴力程序发现若n为偶数则会赢,若为奇数则会输。T2:贪心,优先装分值大的球。比赛时已想到正解,但是没有特判有的瓶子一个球都不能装的情况,只有60分。总结:下一次要认真看数据范围,很多特殊数据都能在数据范围中发现。特别要注意是否有数因为正整数,但是却有可能为0的情况(m,n,a[i]),注意特判。T3:直接bf原创 2018-01-03 20:06:18 · 260 阅读 · 0 评论 -
2018.05.26【省赛模拟】B 组
T1:把每个点的权值从小到大排序,然后依次加入图里,每一次把加入的点作为中转点做一遍佛洛伊德就行了。注意:在做佛洛伊德时未加入图的点只是不能作为中转点,但是可以作为起点和终点。T2:假设n>m,mid=(n+m)/2,显然对于每一个S中的串,要在前mid位中找出以后n-mid位相同的,然后看看T集中有几个与剩余的m位相同的串,加入答案即可。对于T集,我们可以做一遍哈希(存入一个map),S中...原创 2018-06-01 20:16:24 · 114 阅读 · 0 评论 -
2018.01.29【GDOI2018】模拟B组
T1:首先a[1]=b[1]。然后,假设我们知道了a[1~i*2-3],现在要求a[i*2-2]和a[i*2-1],那我们可以这样做。令s0表示a[1~i*2-3]中有多少个数小于b[i],s1表示a[1~i*2-3]中有多少个数大于b[i]。然后我们来分类讨论一下。若b[i]在a[1~i*2-3]中出现过,则1、若s0=s1,那么要填入一个大于b[i]和一个小于b[i]的原创 2018-01-29 21:25:26 · 180 阅读 · 0 评论 -
2018.01.20【GDKOI2018】模拟B组
T1:直接模拟,然后排序即可。但是要注意精度问题:C++是五舍六入得,所以最后输出时要加0.001。T2:我们可以采用贪心的思想:如果x加y可以合成a且x的钱加y的钱小于a的钱,那么我们便可以将a的钱改成x加y的钱。而如果一个a被更新了,那么我们又可以用它来更新其他值。于是我们就想到了用dfs。首先循环所有点,以每一个点为起点做一遍dfs。dfs时如果能更新则继续dfs,否则就不d原创 2018-01-20 21:32:02 · 255 阅读 · 0 评论 -
2018.01.19【GDKOI2018】模拟A组&B组
T1:很明显选出来的图形一定是一个三角形,那么我们就n^3枚举,然后用海伦公式计算。比赛时因为精度问题90分。总结:处理精度问题的套路:把a==b写成abs(a-b)T2:很明显用线段树维护区间和。对于1操作:首先二分求出一个y,使得y-a[i]+1-a[i]到y的值对于2操作:求出区间值,然后把区间清空。总结:对于操作1找y时,正确的打法如下:1、求出能达到的最大原创 2018-01-19 21:18:39 · 265 阅读 · 0 评论 -
2018.01.18【GDKOI2018】模拟B组
T1:因为一棵树有n-1条边,所以我们可以从这里下手。首先,特判n=1的情况,然后把所有点的度加起来在除以2,求出来的就是边数,而这个数如果等于n-1的话这就可能是一棵树,若不等于则这一定不是一棵树。T2:首先从小到大排序,然后二分答案。那么怎样判断二分出来的mid是否可行呢?首先,对于每一个数,在序列中一定有一个以它为左端点的区间,使得区间中max-min不大于mid。原创 2018-01-18 19:56:27 · 230 阅读 · 0 评论 -
可撤销贪心
例题见JZOJ4726。以这一道题为例,我们可以贪心,每一次从剩下可选的数中选出一个最大的,但这样显然是错的。那么怎么办呢?我们可以考虑让贪心变得可撤销。假设当前我们选了第i个数,那么它的贡献就是a[i]。但是最优解有可能不选它,如果不选它的话,那么就会选它的两侧相邻的点,如果这样选的话贡献就是a[i-1]+a[i+1]。所以要把之前的贪心撤消了,就相当于把ans加上a[i-1]+a[i+原创 2018-01-25 11:36:55 · 823 阅读 · 0 评论 -
2018.01.23【GDKOI2018】模拟B组
T1:暴力就好。T2:设f[i][j][k]表示前i个数中选了k个数,选出来的这些数的乘积与p的gcd为j的方案数。则我们用i去更新i+1,方程式为:f[i+1[j][k]+=f[i][j][k]f[i+1][j*gcd(p/j,a[i+1])][k+1]+=f[i][j][k]最后的答案就是f[n][p][3]。不过这样会爆空间,所以我们要把gcd为j改成gcd为p的第j原创 2018-01-24 21:47:45 · 194 阅读 · 0 评论 -
2018.01.22【GDKOI2018】模拟A组&B组
T1:设f[i][j]表示表示前i排座位分了j段的最小登机难度。则我们枚举r表示r~i分一段,转移为f[i][j]=min(f[r-1][j-1]+r~i的难度),ans=f[n][k]。注意优化。T2:显然每两行相隔w-1,每两列相隔h-1是最优的。那么答案就是W/(2w)*H/(2h)。最后要特判一下W%(2w)和H%(2h)是否大于等于w或h,若大于等于则要加上最后的矩阵。原创 2018-01-24 21:34:10 · 224 阅读 · 0 评论 -
2018.01.24【GDKOI2018】模拟B组
T1:不难想到把w和z从小到大排序,然后枚举每一次会议,然后用一个指针i维护最后一个小于等于当前z的w在哪个位置。因为已经排了序,所以i是单调递增的。然后问题就变成了在1~i中求在原序列中的位置在x~y的答案。那么这个可以用线段树维护。我们每一次把i往后移时都把当前i所对应的pos加入线段树,然后我们来看看怎样求答案:p=sum(pos[i])/m,对于p,显然我们只需要维护pos的和还有原创 2018-01-24 20:11:04 · 193 阅读 · 0 评论 -
2018.01.21【GDKOI2018】模拟B组
T1:首先因为选出来的路径一定是竖着的,所以考虑把每一个叶子节点到根节点的路径放入一个队列里,然后用O(队列长度)的效率求出答案。但是这样会出现重复情况。这时我们可以考虑不统计重复情况。显然如果我们统计了x到root的答案,那么在统计y到root的答案市会出现重复。那么我们在统计y到root的答案时就多一个限制:路径的两个端点中下面的那个端点一定要在d下面。不难发现,d就是x、y的父亲原创 2018-01-21 16:50:22 · 244 阅读 · 0 评论 -
2017.07.07【NOIP提高组】模拟赛B组
T1:纯暴力模拟。不过要注意原根为1和m=1的特殊情况。总结:以后每一种情况都要在纸上写清楚,不能空想。T2:二分+状压dp。二分一个mid,表示最矮高度。接着设f[i][j]表示1~i位置的土都达到mid,而i-k+1~i种土的选择方案为j的最小价钱。这是我们用f[i][j]去更新f[i+1]。我们需要考虑第i+1种土是选还是不选。若不选,则更新的是f[i+1][原创 2017-07-07 21:25:42 · 251 阅读 · 0 评论 -
2017.07.14【NOIP提高组】模拟赛B组
T1:我们首先要知道一个性质,那就是若gcd(n/k,x)=1,那么gcd(n,k*x)=k。所以我们每次枚举i,计算sum(gcd(i,j))(1但是枚举j会超时,所以我们要优化。我们可以在筛素数时求出phi,因为在筛素数时,素数i一定是i*j的一个质因子,结合phi计算公式,我们就可以更新phi[i*j]。然后我们再用线筛的思想去求出c[i](c[i]=sum(gcd(i,j))(原创 2017-07-14 22:46:05 · 232 阅读 · 0 评论 -
2017.07.13【NOIP提高组】模拟赛B组
T2:设f[i]表示当前第i个人认识的最右边的人的编号。50分做法:每次枚举l,r之间的i,当f[i]初始值:f[i]=i100分做法:我们发现f[i]是递增的,所以我们考虑用线段树维护f[i]。设f1[]表示区间的最大值,f2[]表示区间的最小值,f3[]表示区间的和。我们每次要找出一个s,使得l求sum的一步可以用区间查询来完成,在做完这一步之后我们原创 2017-07-13 20:47:45 · 201 阅读 · 0 评论 -
2017.1.20【初中部 GDKOI】模拟赛B组
T1:由于没有强制在线,我们可以倒着做一遍。设sum表示所有数的异或和,并且记录每一个点的左边的点和右边的点。那么我们倒着搜,每搜到一个点时,用sum减去它与他左边和右边的异或值,再加上它左边与右边的异或值,每次用ans异或sum就行了。T2:题解待更新。T3:公式:m=m/2;f[0]=1,f[1]=0,f[i]=(i*2-1)*f[i-1]+f[i-2]原创 2017-01-21 20:02:37 · 276 阅读 · 0 评论 -
2017.1.19【初中部 GDKOI】模拟赛B组
T1:直接暴力枚举即可。T2:数据好像有漏洞,AC的程序去找lyl测测,他那里有可以让这个程序WA的数据。T3:这题与12日的第四题有相似的地方。枚举右下角,用单调栈维护这个点左上方的障碍(行排成降序)。在计算这个点对答案的贡献时,就是计算它当前以单调栈里的障碍为上边界的矩形的面积。T4:二分答案,然后用SPFA判断答案是否可行。但单单用SPFA判断会超时,原创 2017-01-21 19:35:26 · 287 阅读 · 0 评论 -
2017.1.21【初中部 GDKOI】模拟赛B组
今天的比赛翻车了,40+10+0=50,排得很后。主要原因是第三题没有认真思考,以为自己不会,其实只要再认真想一想就可以了。T1:这题有一个十分巧妙的方法。因为给出的图是连通、无环且没有重边的,所以我们可以认为给出的图是一棵树。首先,我们把所有点的祖先都设为1节点。然后在每删除一条边时,就把这条边连接的深度较深的节点及其子树的祖先都赋为这个节点。在查询两个节点是否连通时,就直接判断它们的祖原创 2017-01-21 19:04:34 · 311 阅读 · 0 评论 -
2017.2.10【初中部 GDKOI】模拟赛B组
今天的比赛又翻车了,第一题竟然忘了用高精度。T1:走回头路的情况只有左右重复,所以我们设往上走为1,往左走为2,往右走为3。那么问题转换为在一个长度为n的序列的每个位置上填1、2、3中任意一个数字,其中2、3不能相邻,有多少种填法。那么我们可以用dp。设f[i][1/2/3]表示第i为填1或2或3,则f[i][1]=f[i-1][1]+f[i-1][2]+f[i-1][3]f[原创 2017-02-10 15:31:28 · 278 阅读 · 0 评论 -
2017.2.09【初中部 GDKOI】模拟赛B组
今天的比赛翻车了,主要是第二题对c++字符串判断大小不熟悉。还有就是一个寒假都没有碰过信息学,对于题目的敏感下降了。T1:比赛时用了SPFA,错了。改成Floyed就对了。T2:这题差一点就对了。就是把c++中的字符串判断大小搞错了。T3:比赛时想到了把最长不下降子序列和最长不上升子序列结合起来,但是多了一个枚举起点,其实枚不枚举起点都是一样的。还有就是调程序的时候花了原创 2017-02-10 14:46:24 · 269 阅读 · 0 评论 -
2017.1.18【初中部 GDKOI】模拟赛B组
T1:我们可以枚举出n的因数,设这个因数为i,f(i)表示1到i-1与i互质的所有数的和。关键是怎样求出f(i)。我们首先要知道一个性质:如果x与i互质,那么i-x一定与i互质。那么f(i)=i*phi(i)/2,phi(i)表示1到i-1直间与i互质的数的个数。这条公式的意义为:有phi(i)个数,而它们中间有phi(i)/2对数的和为i,所以它们的和为i*phi(i)/2。phi(i)是欧原创 2017-01-18 22:22:24 · 284 阅读 · 0 评论 -
2017.1.17【初中部 GDKOI】模拟赛B组
T1:直接用克鲁斯卡尔,不过在克鲁斯卡尔之前要把原来就有边的点连起来。T2:直接广搜。T3:题解待更新T4:用dfs从两边往中间搜,如果两边不等,则选较小的那一边。如果两边相等,则用一个循环从两边往中间搜,谁先遇到较小的就选谁。如果一直到中间都相等的话,则任意选。原创 2017-01-18 22:16:53 · 178 阅读 · 0 评论 -
2017.1.16【初中部 GDKOI】模拟赛B组
今天早上做着做着XC突然叫我去做小学生的题,耗了一个多小时,回来再做B组时,就没有时间了。下面是总结:T1:比赛时用了暴力,因为忘了mod所以0分。正解:树形dp。我们用一个dfs从根节点往下搜,设f[i]表示第i个节点到它任意一个子节点的路径乘积的和,c[i]表示从i节点的任意一个子节点到i节点,再到i的另一个子节点的路径乘积的和。然后我们枚举i的子节点,设枚举到的子节点为x,那原创 2017-01-18 07:41:39 · 252 阅读 · 0 评论 -
2017.1.14【初中部 GDKOI】模拟赛B组
T1:这题就是一个纯的克鲁斯卡尔,但是比赛时出现了以下问题。1、粗心,把一个x搞成y。2、我的标记方法有问题,处理不了0的情况。3、并查集的基本打法不会,搜索父亲时要顺带把自己的标记纸箱祖先。T2:预处理出f[i][j](第j列1至i行的和),然后枚举奶牛位置,用一个循环求出这个位置的值,选出最大。T3:这题一开始看不会,后来想了一下就觉得十分简单。用当前牧原创 2017-01-14 15:40:18 · 276 阅读 · 0 评论 -
2017.1.12【初中部 GDKOI】模拟赛B组
T1:这题有一个十分巧妙的方法。我们把每个f(n,x)称为x对答案的贡献,那么我们可以根据每个x对答案的贡献吧所有的x分成多段,每段里的f(n,x)相同,那么我们只需知道每段的两端的位置,就可以求出这一段的答案,把每一段的答案加起来就是最终答案。现在问题变成了如何求每一段的头、尾和贡献值。设现在要求的一段的头位置为x1,尾位置为y1,贡献值为z1,前一段的这三个值为x0,y0,z0。那原创 2017-01-13 21:13:02 · 313 阅读 · 0 评论 -
2017.1.15【初中部 NOIP提高组】模拟赛B组
今天一开始以为没有B组,就去做C组。在比赛结束前一小时发现有B组,于是立刻来做,但已经来不及了,不然至少可以得100分。 T1:这题十分简单。首先找出所有agnus,设它们的数量为m,用g[i]表示第i个agnus的起始位置(也就是a的位置)。 然后我们有一个k来枚举当前子区间中包含的agnusd的个数,接着用一个i来枚举这k个agnus中的第一个,接着计算只包含这k个agnus的区间原创 2017-01-21 20:11:02 · 277 阅读 · 0 评论 -
2017.2.11【初中部 GDKOI】模拟赛B组
T1:这题原来是如此的水。枚举选取的点,因为我们要让边权和:点权和最小,所以在点权和确定之后要让边权和最小,那么我们可以用克鲁斯卡尔求出最小生成树,再从所有的结果中选出一个最小的就行了。比赛时老想着如何得出一种选法使得选出的答案是最优,想不出来又去想暴力,最后只有70分。下次遇到多个因素时要多想想分开来处理。T2:这题想到了二分+递归,结果超时10分,正解竟然是二分+dp!二分一个原创 2017-02-11 16:12:29 · 420 阅读 · 0 评论 -
2017.07.12【NOIP提高组】模拟赛B组
T1:因为数据随机,所以选择前5000个暴力判断即可。(因为“没有两条共线的线段具有公共点,没有重合的线段”,所以一个十字架只能由两条线段组成)。T3:设f[i][j][1/2]表示第i个位置为分界线,xor和and的值为j,1位第i位选and,2为第i位选xor。那么我们枚举i,j(倒着推)f[i][j][1]=f[i][j][1]+f[i+1][j][1](当前位置不选)原创 2017-07-13 20:31:36 · 165 阅读 · 0 评论 -
2017.06.24【NOIP提高组】模拟赛B组
T1:如果两点在障碍的同一侧,那么直接计算距离。如果两点在不同侧,那么使用二分查找,如果有一个通行处a[i]满足x1总结:1、比赛时因为把x与y搞混,(y决定是否在同一侧,x决定是否在中间)。T2:如果存在一段连续递增或连续递减的,可以把这一段合并。把所有可以合并的合并之后在做n^2的dp就行了。注意:合并之后差的平方不能直接计算,得预处理好。总结:1、做题原创 2017-06-25 12:28:15 · 194 阅读 · 0 评论