- 博客(515)
- 收藏
- 关注
原创 【题解】模拟赛11.22T2 树
考虑已经在两棵树都找到了最优点d1,d2d1,d2d1,d2,每棵树内部的贡献再说,若是在d1,d2d1,d2d1,d2之间连边,需要求得树1的点−>d1−>d2−>树2的点树1的点->d1->d2->树2的点树1的点−>d1−>d2−>树2的点的贡献如果我们知道树1的点−>d1树1的点->d1树1的点−>d1的总贡献是sum1sum1sum1,树2的点−>d2树2的点->d2树2的点−>d2的总贡献是sum2s..
2020-11-22 19:31:16 150
原创 【题解】模拟赛11.22T3 七巧板
性质是,如果一条线能穿过一条线,那么能多切一个七巧板其实只是一个形式所以答案就是7+(6+7+8+...+(n+1))7+(6+7+8+...+(n+1))7+(6+7+8+...+(n+1))Code:#include <bits/stdc++.h>#define LL long longusing namespace std;LL n;int main(){ freopen("tangram.in", "r", stdin); freopen("tangram.ou..
2020-11-22 19:16:05 199
原创 【题解】LOJ2349:团子制作
原题传送门按照套路来的话按照中间点GGG来统计对于两个GGG,如果不在同一条对角线的相邻位置,是不会相互影响的所以根据dp的定义,我们以一条条对角线为阶段每个阶段,每个GGG按照不放,横放,竖放讨论转移Code:#include <bits/stdc++.h>#define maxn 3010using namespace std;char a[maxn][maxn];int n, m, ans;int get(){ char c = getchar(); for (
2020-11-20 21:34:44 197
原创 【题解】LOJ2348:美术展览
原题传送门求∑bi−max(ai)+min(ai)\sum b_i-max(a_i)+min(a_i)∑bi−max(ai)+min(ai)可以直接按照aia_iai从小到大排序枚举,每次假设当前一定要选,那么一定是−ai-a_i−ai问题就是维护好max(∑j=kibj+ak)max(\sum_{j=k}^{i}b_j+a_k)max(∑j=kibj+ak)其实只要一个变量就行了Code:#include <bits/stdc++.h>#define maxn
2020-11-17 16:42:55 134
原创 【题解】LOJ2347:寒冬暖炉
原题传送门可以看成本来有nnn个点每次把间距最小的两个点合并,直到只剩kkk个点所以答案就是最小的n−kn-kn−k个间距加上nnn如果用快排思想,可以在O(n)O(n)O(n)时间内实现Code:#include <bits/stdc++.h>#define maxn 100010using namespace std;int n, m, a[maxn], t[maxn];inline int read(){ int s = 0, w = 1; char c = ge
2020-11-17 09:55:59 166
原创 【题解】LuoGu7077:函数调用
原题传送门还记得初中的时候Ag学长FancyCoder给我们讲过一个倒着做的思想这道题不妨倒着做如果操作 *2 +3 *4把每个数的初始值看成一次加操作那么就是 +ai *2 +3 *4对于这个+3的贡献其实是+3∗4+3*4+3∗4,对于+ai+a_i+ai,贡献是+ai∗8+a_i*8+ai∗8所以倒着做的话,对于每个加操作,乘上当前乘操作的累乘积,就是贡献可以对于每个函数记一个mulimul_imuli表示调用一次该函数,会乘上多少如果函数类型是1,那么mul=1mul=1
2020-11-14 17:25:42 310
原创 【题解】LuoGu7078:贪吃蛇
原题传送门首先是要推一个结论加入我是当前最强的蛇,我会如何抉择?当前有四条蛇,长度为a>b>c>da>b>c>da>b>c>d,我是aaaa−d>=b,a-d>=b,a−d>=b,我吃了一条最弱的之后,还是最强的,肯定是吃的a−d>=c,a-d>=c,a−d>=c,我吃了一条最弱的之后,不是最弱的,那么如果我吃了,我变成了a−da-da−d,现在最强的是bbb,最弱的是ccc,一定有b−c<=a−db
2020-11-14 16:55:53 471
原创 【题解】LuoGu7076:动物园
原题传送门对于某一位,只要有已有的动物的这一位是1,或是要求中没有提及这一位,都有2种情况设有mmm位这样的位,答案就是2m−n2^m-n2m−n可以直接用二进制的位运算解决问题,但是因为数据范围是2642^{64}264,所以要爆ll我考场上不敢用ull,所以写了高精,但是T了然后ull的话也要注意m=0,k=64m=0,k=64m=0,k=64的情况,特判一下Code:...
2020-11-13 12:12:00 260
原创 【题解】LuoGu7075:儒略日
原题传送门模拟题,比同为联赛题的时间复杂度还要复杂一点两个分界点,公元前后,以及1582年10月4日直接模拟是可行的,但是注意到询问有10510^5105组,所以每个询问最多做1000次计算可以考虑周期性,不管分界点的话,周期是400年但是我考场上没有想到这一层,为了过掉大样例,我先做10000年,再做2000年,再做1000年,是在前1000年还是在后1000年在4年4年跳然后我在民间数据上只拿了40分,原因是我在1582年10月份,日期统统加了10这导致本来合法的1582年10月1号
2020-11-12 16:44:48 897
原创 CSP-S2020复赛游记
Day0最近一个星期,整个人没由来的陷入了一种迷茫焦虑,无所适从的状态,模拟赛也一直炸,怎么回事呢,爸妈说我压力太大了,我也没感觉哪大了啊,跟盛老师说呢,我文化课竞赛两头顾及,两头顾不及,还是能力不够。那我抓重点吧,把重心放到竞赛上。今天晚上我在机房里讲了讲经验,以及最近脑子里在思考的两个课题,一个是并查集的操作,一个是逐位确定的思想,...
2020-11-06 20:33:39 1282 1
原创 【题解】LuoGu4610:[COI2012] KAMPANJA
原题传送门先用floydfloydfloyd预处理出wx,yw_{x,y}wx,y表示x−>yx->yx−>y的最短路所以x−>yx->yx−>y最少经过wx,y+1w_{x,y}+1wx,y+1个不同的点考虑最短路disu,vdis_{u,v}disu,v表示1−>u−>v−>11->u->v->11−>u−>v−>1最少经过不同的点枚举状态(i,j)(i,j)(i,j)disi,j<−di
2020-11-06 18:38:48 227
原创 【题解】LuoGu4611:[COI2012] TRAMPOLIN
原题传送门如果可以,尽可能经过所有蹦床只要到达一个蹦床,那么就能到达所有蹦床暂且先不考虑高度相平的情况,那么必定形如假设我现在正在aaa蹦床,我可以跳到ddd,再回到aaa假设我现在正在bbb蹦床,我可以先跳到eee,再回到bbb,再跳到ccc,再回到bbb假设我现在正在ccc蹦床,我什么也干不了这样我就把蹦床的三种位置情况的操作方法搞清楚了如果蹦床在一段斜坡中,可以跳到旁边的高峰,在回来(蹦床在顶峰的情况归于此)如果蹦床在谷底处,可以分别往两边的高峰跳,再跳回来然后讨论起点如果
2020-11-06 17:31:59 178
原创 【题解】LuoGuU67748:坤链剖分
原题传送门题目大意:一颗n个节点的树,m个询问(u,v),每次输出经过了u到v的最短路径的坤链的条数。首先可以发现的是每个叶子借点都对应着一条坤链。30%暴力,对于每一个询问,把u到v的路径上的边打标记,从根节点开始遍历每一条坤链,遍历到叶子节点结束,到叶子结点结束时统计该坤链是否经过了u到v的路径,若是,则统计入答案。20%链的情况,送分,发现整棵树只有一个叶子节点,所有只有一条坤链,且该链一定经过任意一条路径,所以对于每个询问,都只要输出1即可。20%每个询问的两个端点的lca是根节点的
2020-11-03 21:33:57 116
原创 【题解】LuoGuU67070:二叉树阵
原题传送门卡特兰数暴力O(n2)O(n^2)O(n2)dp或者用O(n)O(n)O(n)跑公式Code:#include <bits/stdc++.h>#define maxn 1010#define LL long longusing namespace std;const LL qy = 998244353;LL dp[maxn];int n;int main(){ scanf("%d", &n); dp[0] = 1; for (int i = 1;
2020-11-03 20:57:50 115
原创 【题解】LuoGuU84033:败走
原题传送门30%部分O(nm)枚举正方形左上角,O(nm)枚举正方形右下角,O(nm)验证正方形是否合法总时间复杂度O(n^3m^3)可以过30分过水,过无脑,没有代码示例50%部分O(nm)枚举正方形左上角,O(n)枚举正方形边长,O(nm)验证正方形是否合法总时间复杂度O(n^3m^2)可以过50分具体见baoli.cpp100%部分简化题目,如果求最大的全是0的正方形,怎么做?想到dp设计状态dp[i][j]表示选择(i,j)这个点作为正方形的右下角能得到的最大正方形的边长
2020-11-03 20:39:03 89
原创 【题解】2020.11.2 B
高位贪心,逐位确定这个肯定是套路大方针对于每一个新来的,之前的答案肯定要满足然后用O(n2)O(n^2)O(n2)dp暴力验证时间复杂度O(qn2log2n)O(qn^2log^2n)O(qn2log2n)差不多要3.6s,很接近了,按照一般出题者的思路,接下来再优化一下首先O(n2)O(n^2)O(n2)跑不满,差不多可以少掉一半时间然后加一些inline,registerinline,registerinline,register之类的极限数据最多只要0.7sCode:#prag..
2020-11-03 10:19:05 125
原创 【题解】2020.11.2 A
秒杀签到题2 * 2 = 42 * 3 = 63 * 3 = 9用4,6,9能构造出什么?4,6能够造出>=4的偶数9和4,6能构造出>=13的奇数和9自己所以只有1,2,3,5,7,111,2,3,5,7,111,2,3,5,7,11是无解的Code:#include <bits/stdc++.h>#define LL long longusing namespace std;LL n;inline LL read(){ LL s = 0, w..
2020-11-03 10:14:20 140
原创 【题解】模拟赛:愤怒的元首
令dpidp_idpi表示iii个点的答案考虑枚举整个DAGDAGDAG有jjj个入度为0的点Cij∗2j(i−j)∗dpi−jC_{i}^{j}*2^{j(i-j)}*dp_{i-j}Cij∗2j(i−j)∗dpi−j意思是先从iii个点中选出jjj个入度为0的点,枚举这jjj个点与剩下的点中连边关系(指向他或不连),剩下的点自己是个DAGDAGDAG发现上面这个式子其实包含了至少jjj个入度为0的点,所以要容斥Code:#include <bits/stdc++.h>..
2020-11-01 18:53:49 175
原创 【题解】AT4520:[AGC032E] Modulo Pairing
原题传送门首先想到的当然是二分答案+贪心但是正解二分的并不是答案结论:最终的正确答案一定存在一个分界点,满足蓝线表示x+y<Mx+y<Mx+y<M红线表示x+y>=Mx+y>=Mx+y>=M给出证明情况1:任意两个数加起来都<M<M<M的情况,Ⅰ最优令从左到右分别为a<b<c<da<b<c<da<b<c<d计算出三种方案的价值Ⅰ:max(a+d,b+c)max(a+d,b+c
2020-11-01 11:32:11 228
原创 【题解】AT4439:[AGC028E] High Elements
原题传送门这题很难因为要求输出的字典序最小,所以0优先想到逐位确定的贪心思想:从第1位开始,先假设这一位是0,就把这个数放到xxx序列中,验证一下之后的数能否再合法,如果可以,就把这个数放到xxx序列,否则就只能放到yyy序列逐位确定的复杂度是O(n)O(n)O(n)所以要求我们在O(logn)O(logn)O(logn)时间内解决checkcheckcheck问题先定义原序列中的上升位为“原上升位”,到新序列新产生的上升位(即本来不是上升位变成了上升位)为“新上升位”结论1:原上升位到新的序
2020-11-01 11:00:45 222
原创 【题解】LuoGu4645:[COCI2006-2007 Contest#3] BICIKLI
原题传送门如果是求一个点到另一个点的路径条数,那么直接用拓扑就好了但是这道题目里面不一定是DAGDAGDAG所以要判环,问题是有些环跟自己没关系,存在着并不影响答案,但是如果我能经过一个环到达终点,那么我就有无数条路径,所以是inf就是如何判断会不会走过环从起点跑一遍dfsdfsdfs,vis1vis1vis1表示哪些点被经过建反图,从终点跑一遍dfsdfsdfs,vis2vis2vis2表示哪些点被经过对于一个点uuu,有一条合法路径经过uuu的充要条件是vis1u=1且vis2u=1vis
2020-11-01 10:41:32 171
原创 【题解】AT4502:[AGC029C] Lexicographic constraints
原题传送门首先想到类似进制或是全排列一样的操作假如k=3k=3k=3可以11111111112111311311212113221112112可以总结出一些规律若ai>ai−1a_i>a_{i-1}ai>ai−1,就直接在si−1s_{i-1}si−1的末尾补1,补到当前长度为止若ai=ai−1a_i=a_{i-1}ai=ai−1,sis_isi就是si−1s_{i-1}si−1的下一个排列若ai<ai−1a_i<a_{i
2020-10-30 21:05:22 207
原创 【题解】AT4501:[AGC029B] Powers of two
原题传送门手玩数据以5为例00000101比5大的最小的能和5匹配的是11(00001011)再大,就是00011011001110110111101111111011……再假如1000001010与之匹配可以是00010110(22)00110110(54)0111011011110110……结论,对于一个数xxx,另一个数y>=xy>=xy>=xx+y=2px+y=2^px+y=2pyyy一定是xxx最后一位1不动,之前全部取反,然后最
2020-10-30 20:07:04 128
原创 【题解】LuoGu6287:Mag
原题传送门结论:答案一定是某个点,或者一段1,或者一段1中间有个2某个点的情况不论,如果能有答案比单个点更优,一定满足上面的结论证明:1.11111(x个)311111(y个)1.11111(x个)311111(y个)1.11111(x个)311111(y个),总的值是3x+y+1\frac{3}{x+y+1}x+y+13,令x<=yx<=yx<=y,则还有一种情况是1y\frac{1}{y}y13x+y+1<1y,3y<x+y+1,2y<x+1\frac{
2020-10-28 11:29:24 170
原创 【题解】LuoGu6398:KOLEKCIJA
原题传送门先升序排序令dpidp_idpi表示包含这一个的答案dpi=min(dpj+max(k,ai−aj+1+1))(j<i)dp_i=min(dp_j+max(k,a_i-a_{j+1}+1))(j<i)dpi=min(dpj+max(k,ai−aj+1+1))(j<i)然后,求方案如果dpi−dpi−1=ai−ai−1dp_i-dp_{i-1}=a_i-a_{i-1}dpi−dpi−1=ai−ai−1,说明iii和i−1i-1i−1属于同一个区间所以可
2020-10-25 20:23:32 330 1
原创 【题解】LuoGu6503:DIFERENCIJA
原题传送门只要知道每个点作为最大/小值往左/右能扩展到哪里这个可以用单调栈处理O(n)O(n)O(n)解决但是我有另一种方法假如是一棵树,要求从某一点到另一点边权最大-边权最小加起来可以用类似kruskalkruskalkruskal的并查集写法详情见这道题目然后我把这道题化归成一条链的情况Code:#include <bits/stdc++.h>#define maxn 1000010#define LL long longusing namespace std;/
2020-10-25 18:15:27 174
原创 【题解】LuoGu6289:Vještica
原题传送门这题可以想出很多性质n<=16n<=16n<=16暗示的非常明显,我后来才意识到是状压对于一堆字符串,显然,我们可以先把它们共有的部分弄掉,剩下的不存在共有的部分我可以状压dpidp_idpi表示状态iii的答案枚举iii的子集jjj,表示先把jjj和i−ji-ji−j内部先算好答案所以两部分的答案加起来的时候总共共有的部分重复算了一遍要减掉令sum=总共的共有部分sum=总共的共有部分sum=总共的共有部分dpi=min(dpj+dpi−j−sum)dp_
2020-10-25 18:08:22 165
原创 【题解】LuoGu4623:BUREK
原题传送门直线能穿过三角形,因为直线是平行于坐标轴的,所以很简单以x=px=px=p为例若直线能穿过某一个三角形,那么这条直线必定能穿过三角形的某一条边换句话说,令三角形三个点中横坐标最小是xminxminxmin,最大是xmaxxmaxxmax如果xmin<p<xmaxxmin<p<xmaxxmin<p<xmax,直线就能穿过这个三角形所以可以直接差分,dxmin+1++,dxmax−−d_{xmin+1}++,d_{xmax}--dxmin+1++,dx
2020-10-25 17:56:02 226
原创 【题解】LuoGu6859:蝴蝶与花
原题传送门这是一个超难题的模板,但是有一个性质,ai=1/2a_i=1/2ai=1/2,我敏锐的感觉到这道题可能是基于这个性质来做的先令l=1l=1l=1,看看是否存在rrr,使得al+...+ar=sa_l+...+a_r=sal+...+ar=s发现不存在这个rrr,当且仅当存在rrr,使得∑i=lrai=s−1且ar+1=2\sum_{i=l}^{r}a_i=s-1且a_{r+1}=2∑i=lrai=s−1且ar+1=2如果存在rrr满足,当然直接输出,若是不存在必定形如考虑移
2020-10-25 12:03:12 209
原创 【题解】LuoGu6858:深海少女与胖头鱼
原题传送门期望dpdpn,m=1+nn+mdpn+m−1,1+mn+mdpn,m−1dp_{n,m}=1+\frac{n}{n+m}dp_{n+m-1,1}+\frac{m}{n+m}dp_{n,m-1}dpn,m=1+n+mndpn+m−1,1+n+mmdpn,m−1然后发现无法实现经过部分分m=0m=0m=0启发又看见了n<=1014,m<=106n<=10^{14},m<=10^6n<=1014,m<=106猜想时间复杂度可能只与mmm有关d
2020-10-22 21:14:24 264
原创 【题解】LuoGu6286:Cezar
原题传送门一开始看错了题意,错以为是每个字符串里面加密后排序后来才发现是字符串之间排序那么对于两个字符串sai,sai+1s_{a_i},s_{a_{i+1}}sai,sai+1,加密后的sais_{a_i}sai的字典序要小于sai+1s_{a_{i+1}}sai+1可以从最高位开始比较,第一位不同的字符,比如是c1,c2c1,c2c1,c2,说明加密后的c1<c2c1<c2c1<c2,就从c1c1c1往c2c2c2连一条有向边最终做一遍拓扑构造答案如果有点的
2020-10-22 16:43:01 144
原创 【题解】LuoGu6404:bob
原题传送门一开始考虑到悬线法,但是我忘了,所以我就自己创新假设我已经扣出了一个相同颜色的连通块计算答案对于第一列,答案贡献是4∗14*14∗1第二列答案是3∗13*13∗1第三列答案是2∗22*22∗2第四列答案是2∗12*12∗1第一列答案是2∗42*42∗4第二列答案是2∗32*32∗3第三列答案是3∗23*23∗2第四列答案是4∗14*14∗1可以直接O(n2)O(n^2)O(n2)扫过来对于每一列的点,用upexjupex_jupexj维护往上扩展最远能到哪里用单调栈
2020-10-21 20:47:41 119
原创 【题解】LuoGu4422:Deda
原题传送门这是二维偏序,注意到每个小朋友的年龄为1−n1-n1−n不同可以按照小朋友的年龄为线段树的下标,维护一段小朋友区间中最小的站台每次updateupdateupdate暴力把所有包含这个小朋友的区间更新,这个部分稳定O(nlogn)O(nlogn)O(nlogn)每次queryqueryquery先看看能不能往左找到满足的小朋友,不行看看往右走可不可以算是一个常数比较大的线段树Code:#include <bits/stdc++.h>#define maxn 200010
2020-10-21 20:32:51 156
原创 【题解】LuoGu6417:mafija
原题传送门思路源自luogu初赛模拟卷贪心从每个入度为0的点开始遍历,删边整张图就剩下一些环,再处理一下环的情况Code:#include <bits/stdc++.h>#define maxn 500010using namespace std;int n, d[maxn], nxt[maxn], vis[maxn], ans;inline int read(){ int s = 0, w = 1; char c = getchar(); for (; !isdigi
2020-10-21 20:27:57 150
原创 【题解】CF1213G:Path Queries
原题传送门这个题目就比较套路了此前做过三个比较相似的题目就是并查集的同时维护一些信息,这题只要维护结点个数按照边从小到大连对于目前一条(x,y,l)(x,y,l)(x,y,l),找到xxx的祖先s1s1s1,yyy的祖先s2s2s2,ansl+=sizes1∗sizes2ans_{l}+=size_{s1}*size_{s2}ansl+=sizes1∗sizes2Code:#include <bits/stdc++.h>#define maxn 200010#define
2020-10-20 16:47:37 209
原创 【题解】CF1154D:Walking Robot
原题传送门贪心模拟分类讨论如果蓄电池没电了,那么肯定走干电池,如果走到一条1线段,蓄电池电量可以+1如果蓄电池还有电,那么如果干电池没电,或者下一条线段为0,又或者蓄电池目前满电,走蓄电池,否则才走干电池Code:#include <bits/stdc++.h>#define maxn 200010using namespace std;int n, a, b, c;inline int read(){ int s = 0, w = 1; char c = getc
2020-10-20 16:30:56 130
原创 【题解】LuoGu6857:梦中梦与不再有梦
原题传送门从某一点出发,一笔画最多几条边就是从一个完全图最少删去几条边使之能一笔画发现如果点数是奇数,那么每个点的度数都是偶数,直接一笔画如果点数是偶数,每个点的度数都是奇数,根据小学奥数,度数为奇数的点有0/2个时候,可以一笔画,又删去一条边可以减少两个度数为奇数的点,所以删去n/2−1n/2-1n/2−1条边Code:#include <bits/stdc++.h>#define LL long longusing namespace std;inline int rea
2020-10-20 16:09:39 330
原创 【题解】CF1175C:Electrification
原题传送门二分最优值,然后O(n)O(n)O(n)验证对于每个iii,就是看[i,i+k][i,i+k][i,i+k]这段区间能不能达到这个最优值就是[ai+k−ai+12]<=mid[\frac{a_{i+k}-a_i+1}{2}]<=mid[2ai+k−ai+1]<=mid,可行的话,答案就是[ai+k+ai+12][\frac{a_{i+k}+a_i+1}{2}][2ai+k+ai+1]Code:#include <bits/stdc++.h>#d
2020-10-19 09:16:35 213
原创 【题解】CF1157B:Long Number
原题传送门根据字典序的方便性质找到第一个可以更优的就换换到第一个会更劣的为止Code:#include <bits/stdc++.h>#define maxn 200010using namespace std;int n, a[maxn], b[maxn];inline int read(){ int s = 0, w = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') w
2020-10-19 08:54:54 223
原创 【题解】CF1143B:Nirvana
原题传送门数位dpdpi,0/1dp_{i,0/1}dpi,0/1表示第i位,是否退位了dpi,0=dpi−1,0∗aidp_{i,0}=dp_{i-1,0}*a_idpi,0=dpi−1,0∗aidpi,1=max(9dpi−1,1,dpi−1,0∗(ai−1))dp_{i,1}=max(9dp_{i-1,1},dp_{i-1,0}*(a_i-1))dpi,1=max(9dpi−1,1,dpi−1,0∗(ai−1))可以把第一维弄掉然后初始化dp0=a1,dp1=max(1,
2020-10-18 14:15:16 175
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人