zoukankan      html  css  js  c++  java
  • NOIp前做题记录

    CSP2021

    A 廊桥分配

    考场上做出来了。比较简单,但是考场上脑抽了好久。

    用一个 set 增量维护第 (i) 个飞机来后要全部填满的廊桥数,然后随便统计一下即可。

    https://loj.ac/s/1281530

    B 括号序列

    我设计了一个比较复杂的状态,但是实际上感觉很清晰。(f(i,j,0/1/2/3/4)) 代表 ([i,j]) 区间样式分别为 *...**...*AA*...*(...)A 的一个字符串(*...* 代表一段 *... 代表一段任意字符串但是满足内部括号匹配,A 是一个合法串)。

    https://loj.ac/s/1281526

    C 回文

    实际上挺简单的。考虑你提取出第一个字符(两种情况,头或者尾)后序列分成两端,于是就可以把这两段用两个双端队列维护,每次贪心考虑取头还是取尾。

    https://loj.ac/s/1288236

    D 交通规划

    待补。

    BJOI2015 树的同构

    树哈希板子题。随便设一个哈希:子节点有序的情况下的有根树的一个子树的哈希为(设 (sz_u) 为目前的一个前缀 (sz_v) 的和)

    [h(u)=B imes d(u)+sum_v h(v) imes B^{sz_u} ]

    对于处理有序问题,考虑给子节点按照哈希值排序即可;对于根的问题,取重心即可(两个话就都求一下)。

    https://hydro.ac/d/bzoj/record/617caee363b6465eb4e5811b

    BJOI2015 糖果

    答案为

    [inom{m+k-1}{m}^{underline{n}} ]

    那如何计算组合数膜合数呢?

    [inom{m+k-1}{m} = frac{1}{m!} prod_{i=1}^{m} (m+k-i) ]

    处理一下 (m!) 的分解质因数。没了。

    SCOI2015 小凸玩矩阵

    Binary search 一下,然后就是一个套路行列匹配。

    https://loj.ac/s/1294409

    方伯伯的 OJ

    用两个 map 建立用户的原编号和现编号的双重映射,然后用一个线段树维护排名即可。

    https://loj.ac/s/1294649

    JOISC2018 比太郎的聚会

    首先考虑一个 (O(n^2)) 的显然做法,对于每一个点维护一个序列 (S) 表示自己的前驱中按到自己距离的一个排序,然后询问的时候扫一遍。

    实际上,对于询问 (i),只有前 (T_i+1) 个是有用的。考虑根号分治。对于每个点,我们只保存前 (B) 个值,然后对于 (T_i<B) 的问询扫一遍即可。而对于 (>B) 的问询,我们暴力更新一遍,令 (P=sum T) 有复杂度 (O((n+Q)B+nfrac{P}{B})),取 (B=sqrt{frac{nsum T}{n+Q}}) 可得到理论最优复杂度 (O(sqrt{n(n+Q)P}))。不过第一部分常数巨大,所以快长开小一点好。

    https://loj.ac/s/1299147

    HNOI2016 网络

    考虑把一个请求路径变成其补子图(即整个树去掉这段路径),在树剖后会形成 (O(log n)) 个区间。然后询问相当于一个树上点询问,即点上覆盖的补子图的最大权值。由于它是一个加入和回撤(删除)操作,考虑线段树上套一个可删堆(用两个优先队列维护的)。由于这题的删除时回撤操作,所以其实线段树可以简单很多。

    https://loj.ac/s/1301150

    HNOI2016 大数

    考虑一段区间数的表示,用后缀和,然后如果 (p eq 2,5) 就直接莫队,否则直接算。

    A2OJ Ladder 题板刷

    (color{blue}{蓝色}) 自己攻克了的的简单题;(color{green}{绿色}) 自己攻克了的稍复杂题;(color{pink}{粉色}) 自己没攻克的简单题;(color{purple}{紫色}) 自己没攻克的复杂题,(*) 表示感觉相对有趣的题(数量决定程度)。

    (color{pink}{ ext{*CF248D}})

    给定一个一维地图,(H) 表示一户人家(遇到可以送糖果或者不送),(S) 表示一个糖果(遇到可以捡起或者不捡),(.) 表示空地,走过一格需要一单位时间。问从第一格左边开始,最少提前准备多少糖果才能在 (t) 时间内给每户人家都有一份糖果。

    先上 binary search。

    Observation:糖一定捡,并且一定送。

    但是我一开始想的直接来回是错的。因为还有一种情况,拿到糖先回去送人然后再往后走。

    这种情况可以这样理解:我先把糖欠着,然后一旦糖够了立马还回来。可以发现这样的决策在决定走 S 形(去+回+去)的方法上是最优的。

    当然你也可以不还。但实际上,一旦你在第 (i) 户做出决定要全部赖账然后跑回来再还,那你就在之后不可能再做上述决定了。所以我们在按上述决策跑的同时,每一步都看一下,如果剩下的要跑过去然后跑回来要花多少时间。每次最远到达的那个点必然是固定的,所以求出来后直接做就好了。

    https://codeforces.com/contest/248/submission/134194983

    (color{blue}{ ext{CF237D}})

    这题属于是把做法写脸上了。给每条边分配一个集合,集合内就边的两个端点,然后用类似兄弟儿子的东西连边即可。

    https://codeforces.com/contest/237/submission/134198693

    (color{blue}{ ext{CF209C}})

    考虑处理每个连通块。忽略那些孤点无边连通块。如果连通块中存在奇点,则留两个奇点可以向外面连,其他奇点就随便和连通块内点自我消化。这样我们就得到了 (k) 个连通块,希望把这 (k) 个连通块连起来使得每个连通块度数都为 (2)。连一个环即可。

    还有 1 一定要连上就算 1 是孤立的。

    https://codeforces.com/contest/209/submission/134201806

    (color{pink}{ ext{CF144E}})

    只要配上那必然能够形成不相交路径。然后就是一个贪心的区间匹配问题了。

    对于如何处理区间匹配,我们考虑对于每一个位置维护所有覆盖它的区间,以右端点为关键字塞入堆中,然后每次选择右端点最小的区间即可。

    https://codeforces.com/contest/144/submission/134219867

    (color{pink}{** ext{CF150D}})

    感觉好强。

    (f(l,r)) 表示区间 ([l,r]) 全部删完的最大价值。(h(l,r)) 表示区间 ([l,r]) 不需要全部删完的最大价值。(g(l,r,k)) 表示区间 ([l,r]) 删到只剩下一个长 (k) 的回文串的价值。

    [f(l,r)=max g(l,r,k)+a_k\ h(l,r)=max f(l,r),h(l,k-1)+h(k+1,r)\ g(l,r,k)=max f(l,p-1)+g(p,r,k), f(p+1,r)+g(l,p,k), [s_l=s_r]g(l+1,r-1,k-1)\ ]

    初值有

    [g(x,x,1)=0\ g(x,x,0)=a_1\ f(l,r)=h(l,r)=g(l,r,0)=0quad (l>r)\ ]

    其余为 (-inf)

    被卡常了 /fn

    https://codeforces.com/contest/150/submission/134637277

    (color{pink}{*CF404E})

    Observation 1:如果存在两块石头同侧,则必然远的那块是没有意义的。所以每一侧最多有一块石头。然而,如果原点两侧都必须要有石头,则中间的所有点都一定会被经过(否则有一块石头无意义),即不存在只经过一次的终点。所以只能有一块石头(没有石头也可能可以)。

    Observation 2:最后一步一定有效,所以如果最后一步是 L 则终点一定在原点左侧;否则在右侧。

    Observation 3:如果在 (x) 放可以,则更靠近原点的同侧点 (y) 也可以。所以有单调性。Go and use binary search.

    然后这题就结束了。

    但是巨大多 corner case……………………

    https://codeforces.com/contest/404/submission/134724547

    (color{blue}{CF309C})

    如果要放的话,肯定是放小的几个。但是放的时候必然是先考虑大的怎么放,于是二分一下,然后从大往小考虑。

    至于从大到小做的时候就先给所有数二进制拆分,然后直接贪即可。

    https://codeforces.com/contest/309/submission/134730847

  • 相关阅读:
    设备树(Device Tree)
    深度Linux Deepin系统安装教程使用体验
    Qt Creator的安装与Qt交叉编译的配置
    移植tslib和Qt5.6到三星s5pv210开发板
    Linux下读取RFID卡号(C串口编程)
    如何移植openwrt系统
    如何在Qt Creator中添加库文件和头文件目录
    Qt Creator中如何选择某个子项目为启动项目
    QT中子目录调用另一个子目录
    在Qt项目中如何添加一个已有的项目作为子项目
  • 原文地址:https://www.cnblogs.com/TetrisCandy/p/15506568.html
Copyright © 2011-2022 走看看