11.21 VP edu114 被B卡死了
B的个人思路:首先很容易发现当 a+b+c−3<m 时一定是NO, 然后我们考虑m的值是可以连续变化的。 AAAAAABBBBBCCC 最大值的构造一定是这样的。然后每一次我们都可以破坏一个连续的,来放到最左端和最右端中和它不同的一端,这里每次都有一种方式拿到一个不同的。这样的话m的最小值就是0,我们让 a<b<c可以发现每两个c之间可以放最多两个b和c,例如ABCABCABCAB这样就有了最低限制,就是一定要填满c的空
,c−1>a+b 说明填不满。
没有做出来的原因是,虽然知道他变化是连续的。但是没有想着直接用两个边界去判断,反而写麻烦了,忽略了在一定范围内一定可以构造出来,也就是没有想去证明这个m的取值连续性。
C 贪心, 优先满足防御的,就是让第一个比龙弱的人去打龙,然后让第一个比龙强的去打龙,两种取min就行了。证明:一定要让一个人去打龙,如果去打龙的人力量大于龙,那么我们让去的人的力量最好是第一个大于龙的。因为这样一定是对防守的影响最小。然后考虑要人的力量小于龙,画个图就能知道选择最靠近龙的代价最小。
D 要贪心 + 减枝,因为m才2e5所以限制不满10!所以最多只会跑nm次。从最贪心的开始dfs,加上合理的减枝就行。
11.22 VP edu113 很快就想出了C,但是不知道怎么去计算,数学死。
赛后独立做出了D,感觉挺不错。思路比较好想,就是难在怎么计算。但其实用一种类似双指针的思想就可以。
这一场的实现需要一些技巧,思维难度不高。
11.23 VP edu112 A想的很慢,打表看了很久,虽然一下就知道选得饼越少就越好,但不知道怎么算选得饼。B想得挺快的,写慢了。C画个图就看出来了。D手玩了几组样例发现相邻三个不能重复出现。所以想了一个O(18∗2e5)的暴力,但是auto 它会复制出一个新的遍历。复杂度直接乘了个N直接爆炸了,赛时一直在想为什么会T,最终还是改出来了。 这里就有一个小技巧使用auto & 就不会寄了。
E题,维护所有线段覆盖,可以用线段树来维护,维护一个区间最小值,并且支持修改。还有一个细节就是更新时要把右端点减一来确保线段覆盖。update(1, m - 1, a[j].l, a[j].r - 1, 1, 1);
不然可能会出现覆盖了[L,R],[R+1,m],会认为[R,R+1]也被覆盖了,实际上没有被覆盖。其实就是第i个节点,覆盖了[i,i+1]段
11.24 VP edu111 C很快就看出来了单调增和单调减一定是坏的。以为性质就到此为止了。遂苦苦想于如何计算答案。其实只要多画两个点就能看出来只要子数组长度大于4一定会有单调增和单调减出现。下次遇到类似的很难计算的情况,不如再推一下,或许就可以暴力计算了。
11.29 VP 2022-2023 ICPC, NERC, Southern and Volga Russian Regional Contest
11.30 VP 2022CCPC女生赛
12,1 VP 2021江苏省赛
一年之后重新VP了江苏省赛。 感觉自己还是好菜。
B 状压dp + 虚拟源点最短路
12.2 VP German CPC
I有着最短路和DP两种写法,两者本质上是相同的。
H通过二进制来唯一确定每个字母的交集。没有两个数的二进制是相同的,所以一定能确定出每一个字母存在的位置。
J题每次抽牌都能放到一个合法的地方。所以我们只用考虑最少需要抽多少牌。考虑dp, 考虑(1<<k) 种状态。表示现在存在多少种牌。dp[i][st][j] 表示第i位状态为st时,当前位是第i种牌的最小抽牌数。
于是有转移方程
if(a[i] == j) dp[i][st][j] = dp[i - 1][st][j];
else dp[i][st][j] = dp[i - 1][st][j] + 1;
if(a[i] != j) continue;
int now = (1 << j) ^ st;
for(int k = 0;k < 4;k ++){
dp[i][st][j] = min(dp[i][st][j], dp[i - 1][now][k]);
}
1.4 vp edu110 三题,第四题差个记忆化,主要是实现二叉树上快速单点更新。B的sort有一些不知名的错误,卡了很久。还在研究中。好像是因为对于同一对数可能给出了不同的判定标准,所以导致了T。
E题树上倍增,就跟lca差不多,感觉挺简单的。只要根到当前点的都预处理完了,现在这个点也很显然的可以预处理出来。
3.21 vp edu109 两题, 打之前就有点困,打到一半睡着了。第二题要注意最大值和最小值能否放到相应的位置。C感觉就是硬模拟写,只要第一次相遇的时候不是整数倍的话,之后可以直接认为相互之间看不见了。赛后试了一下就过了。
D题要先知道如果他们分成两部分,然后进行连线,最小代价的情况下连出的线肯定不会相交, 从这一点出发考虑dp。dp[i][j]表示前i个人在前j个座位中挑选座位的最小代价。因为数据保证了至少有n/2个空位置。所以也不会发生两个人坐同一个座位的情况。一定有分开的情况更优。