g++
。这时老师说防火墙只开放了 TUOJ yum
一个了,赶紧调 Windoge 命令行下的 gcc/gdb。结果调到比赛开始也没调出来 (校赛热身赛再现),只好用傻逼题,直接输出 std::accumulate(a.begin(), a.end(), 0)
和 std::accumulate(a.begin(), std::unique(a.begin(), a.end()), 0)
就行了。
其实应该拿 Python 3 写的:
a = map(int, input().split(' '))
print(sum(a), sum(set(a)))
给你一个数列,允许你选一个正整数 然后把所有小于 的数删掉 (删数时数列分裂成两部分),要求使分裂出的子数列尽量多。
从小到大枚举 (显然枚举到最大的数就够了) 然后模拟一下就行了……
一个有浮点数 (甚至还有浮点比较) 的带模拟。
这题没 SPJ (而且有浮点比较所以加 SPJ 也没用),出题人宣称“只要你用 double
而且模拟对了就没有精度问题”。这种鬼话我根本不敢信,再加上这题复杂度 级别…… 所以先写 D 题去了。写完回来模拟了 1h 就过了,至于这个“没有精度问题”到底是出题人胡扯淡还是有什么高论我暂且蒙在鼓里。
有 种卡,每次随机抽卡 (抽到第 种的概率是 ,保证 ),如果抽到的卡你已经有了就可以把它卖 块钱,如果你有 块钱就能买一张 (任意类型的) 卡。假设随机抽了 次后能得到所有卡,求期望 。
一看 肯定是状压,用 表示已经有的卡的集合是 ,有 元钱的概率。然后我开始想买卡怎么决策,幸亏出题人提示了总是把钱攒着最后直接一次买掉所有没抽到的卡,不然估计自闭或者写出来假贪心。有了这个提示以后,就会发现满足
的状态是终态。然后把状态按 排序以后就很容易发现有无后效性,直接递推过去就能求出所有终态的概率。显然对于终态 一定抽了 次卡,这样直接按期望的定义算就行了:
有一个校队,其中每个人有一个权值,要求实现 种操作:
总共 次操作,部分数据异或防离线。
首先我们注意到各个状态的校队形成一棵树,每个状态 的校队都是根到某个节点 的路径。有 数据满足 ,这样直接暴力模拟,对于操作 1 给 加一个新儿子并且令 为这个新节点,对于操作 2 把 回退到 的父亲,对于操作 3 和 4 直接找到 ,暴力向根的方向找到深度 到 之间的节点进行修改/查询即可。时间复杂度 。
另外还有 数据中操作 1 和 2 是等概率随机出现的,这样树的深度的期望只有 ,所以也能过。
这个 目前存疑,当时根本不知道咋过的,后来随便乱猜了个这,现在觉得不对。
另外有 数据满足 ,这样在 分做法的基础上,我们加入节点时顺便把它的 阶祖先倍增出来,就能 地找到 的深度为 和 的祖先。然后暴力更新这 个点就行了,总的时间复杂度是 。
除了上面已经拿到的 分,还有 的数据没有防离线。修改和查询都是在树上两节点之间的路径上进行的,这样我们可以先处理操作 1 和 2,把操作 3 和 4 都存下来。处理完操作 1 和 2 后就得到完整的“校队历史“树,操作 3 和 4 就是树上两节点之间路径上的查询,显然可以用树剖和线段树优化到每次 ,总的时间复杂度就是 。
另有 数据没有操作 2,这样就是裸的线段树。因为这组数据有防离线,只能在出现操作 2 之前按这个方法做,同时把所有操作 3 存下来,一旦出现操作 2 就退回暴力算法并重新处理之前存的操作 3,否则会影响拿其他的暴力分。
我是傻逼,防离线没有把操作种类也异或,所以可以把所有操作存下来扫一遍看看有没有操作 2……
感觉正解 cjy 说就是裸 LCT,然而我并不会,就算会也没有 LCT 模板 (甚至 splay 板子都没有),场上肯定写不出来。所以最后 480 分爬了,终于扭转了之前一场比一场低的颓势。
说不定用 的毒瘤算法 (每 次操作 1 后重新树剖,类似洛谷 2137) 能过?场上我是不敢一上来直接试这种东西,写完 80 分以后就没时间了。
IGVA 说他 C 和 D 都卡自闭了,我也不知道为啥,还是很怀疑那个 C 有精度问题……