ARC201
A - CatCoder Double Contest
分讨题。
B - Binary Knapsack
不小心当成 梦幻岛宝珠 来做了,还使用了神奇的决策单调性,没想到居然能过。
正解比较聪明,技巧性很强。首先根据 \(W\) 分讨。
- 若 \(W\) 为偶数:
假设当前没有体积为 \(1\) 的物品,那么将 \(W\) 与所有物品体积均除以 \(2\) 后答案显然不变。那么,可以把体积为 \(1\) 的物品两两组合变成体积为 \(2\) 的物品,但这就需要保证组合的两个物品不会拆开选。可以发现只要将物品价值从大到小排序再按顺序两两组合就行了。如果还剩下一个,让它与虚拟的体积为 \(1\) 价值为 \(0\) 的物品组合就行了。做完这件事后就可以进行除以 \(2\) 操作了。 - 若 \(W\) 为奇数:
用当前价值最大的体积为 \(1\) 的物品填充掉 \(W\) 的 \(2^0\) 那一位,然后按 \(W\) 为偶数处理。
这样就只会进行 \(O(\log W)\) 轮,并且容易证明每个物品被排序的次数是 \(O(1)\) 的。总时间复杂度 \(O(n \log n + \log W)\)。
C - Prefix Covering
对于一个询问来说,首先把所有字符串放在字典树上。这个字典树是一个二叉树,其中,我们把某个字符串的结尾称作真节点,反之称为假节点。然后,倘若一个节点只有一个儿子,在它另一个儿子的位置添加一个假节点。要做的事情就变成了在原树上选出一些真节点,使得从根开始不经过这些真节点无法到达任何叶子的选择方案数。
仔细想想发现这个转化是相当正确的。然后计数做法是树形 DP,设 \(dp_u\) 为从 \(u\) 出发不经过选择的真节点到不了子树内叶子节点的选择方案数,转移很简单。
然后要动态的去维护这个东西。发现 \(dp\) 只和左右儿子有关,然后每加入一个字符串只会修改这么一条链的信息,直接做就可以了。
D - Match, Mod, Minimize
如果将 \(A\) 从大到小排序,并找到一个分界点,那么分界点前的数就可以看做一些绝对值递增的负数,分界点后的数可以看做一些绝对值递减的正数。将 \(B\) 从小到大排序,那么越小的数越需要大的 \(A\) 值,然后就能感性理解到 \(B\) 对应的是 \(A\) 的一个循环移位,并且要满足进行分界操作后,\(0 \leq A_i+B_i\),且 \(max(A_i+B_i)\) 最小。当分界点越靠前,\(max\) 就越大,所以需要找的是最靠后的满足 \(0 \leq A_i + B_i\) 的分界点。二分答案即可。
Code
#include<bits/stdc++.h>
using namespace std;
int T,N,M,A[300005],B[300005];
inline bool cmp1(int a,int b){return a<b;}
inline bool cmp2(int a,int b){return a>b;}
inline bool Check(int x){
for(int i=1;i<x;i++){
if(A[i]-M+B[i+N-x+1]<0)return false;
}
return true;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d %d",&N,&M);
for(int i=1;i<=N;i++)scanf("%d",&A[i]);
for(int i=1;i<=N;i++)scanf("%d",&B[i]);
sort(A+1,A+N+1,cmp2),sort(B+1,B+N+1,cmp1);
int l=1,r=N+1;
while(l<r){
int Mid=(l+r+1)>>1;
if(Check(Mid)){
l=Mid;
}
else{
r=Mid-1;
}
}
int Mid=(l+r+1)>>1;
int ans=0;
for(int i=1;i<Mid;i++){
ans=max(ans,(A[i]+B[i+N-Mid+1])%M);
}
for(int i=Mid;i<=N;i++){
ans=max(ans,(A[i]+B[i-(Mid-1)])%M);
}
printf("%d\n",ans);
}
return 0;
}
E - Total Area of Bounding Boxes
问题可以转化为每个格子被包含的次数之和。若当前选择集合 \(S\),那么一个左下角坐标为 \((X,Y)\) 右上角坐标为 \((X+1,Y+1)\) 的格子被包含当且仅当下列条件全部满足:
- 存在一个格子横坐标 \(\leq X\)。
- 存在一个格子横坐标 \(\geq X+1\)。
- 存在一个格子纵坐标 \(\leq Y\)。
- 存在一个格子纵坐标 \(\geq Y+1\)。
显然要考虑容斥。

浙公网安备 33010602011771号