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\)

显然要考虑容斥。

posted @ 2025-06-22 23:41  Just_int_mian  阅读(80)  评论(5)    收藏  举报