专栏文章

泉州一中普及组日赛 0708

题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioyf45a
此快照首次捕获于
2025/12/03 03:11
3 个月前
此快照最后确认于
2025/12/03 03:11
3 个月前
查看原文

A(很简单)

题目

主赛有 cc 道题目和 nn 个晋级选手
淘汰赛有 dd 道题目和 11 个晋级选手
n×mkn\times m-k 个选手至少要多少道题目
1c,d,n,m,k1001\leq c,d,n,m,k\leq 100

sol

简单的完全背包,两个物品,一个主赛,一个淘汰赛。
注意从程序上要特判 n×mk<0n\times m-k<0 的情况。(不过实际上没有这样的测试数据)
易错点:写反重量和价值

B(简单)

题目

给出一个 nn 位的二进制数 mm ,每一个二进制位有一个权重 aia_i , 求 x=(sn1s1s0)2mx=(s_{n-1}\dots s_1s_0)_2\leq m 使得 f(x)=aisimaxf(x)=\sum a_i s_i \rightarrow \max
1n,ai1051\leq n,a_i\leq 10^5

sol

数位贪心,考虑直接枚举所有的 xx
不难注意到,x,ym  s.t.yx\forall x,y\leq m\ \ s.t.y\subseteq xf(x)f(y)f(x)\geq f(y) 所以我们只需要统计 11 最多的那些 xx 就可以,而这些 xx 一共只有至多 log2m\log_2m
例如:样例二,m=(11010)2m=(11010)_2
我们只需要考虑
  • (01111)2(01111)_2
  • (10111)2(10111)_2
  • (11001)2(11001)_2
  • (11010)2(11010)_2
易错点:进制位混乱

C(简单)

题目

在二维平面上给出 nn 个点(坐标均为整数),从 (w0,h0)(w_0,h_0) 开始每次往第一象限方向移动到另一个点,求最多移动几次。
1n5000,1wi,hi1061\leq n\leq 5000,1\leq w_i,h_i\leq 10^6

sol

暴力DP:dp[i]=maxwj<wihj<hi{dp[j]+1}dp[i]=\max_{w_j<w_i\cap h_j<h_i}\{dp[j]+1\} 可以通过本题。时间复杂度 O(n2)O(n^2)
此外,一起来欣赏一份经典错误代码
CPP
for(int i=1; i<=n; ++i)
  for(int j=1; j<=m; ++j) 
    if( w[i]>w[j] && h[i]>h[j] )
      dp[i] = max ( dp[i], dp[j]+1 );
此外,该转移可以通过线段树优化,达到 O(nlogh)O(n\log h)
易错点:严格大于做成不严格,初始没有从 (w0,h0)(w_0,h_0) 开始

D(送分)

题目

给出两个长度为 nn 的序列 si,cis_i,c_i ,求所有满足 i<j<k  si<sj<ski<j<k\ \cap\ s_i<s_j<s_k 的三元组 (i,j,k)(i,j,k)ci+cj+ckc_i+c_j+c_k 的最小值
1n3000,1si,ci1091\leq n\leq 3000,1\leq s_i,c_i\leq 10^9

sol

枚举 jj ,然后分别枚举 i,ki,k
根据加法原理和乘法原理得时间复杂度为 O(n2)O(n^2)
当然,可以用类似 C 题的线段树优化达到 O(nlogn)O(n\log n)

E(送分)

黑白染色即可。

F(送分)

易错点: n,mn,m 弄反

G(很简单)

题目

在网格图中给出一个联通块,要求去掉 kk 个联通块中的格子后依旧保持联通,标记去掉的格子后输出网格。(保证有解)

sol

dfs 之后,联通块可以标记成一个树
每次去掉任意一个叶子即可。

H(简单)

题目

给出一个长度为 nn 序列,求一种划分,使得划分后每个组内的极差和最大
1n1061\leq n\leq 10^6

sol

注意到:
  • 对于一个不单调的序列,不会划分很长的一段
  • 对于单调的序列,中间不会划分
所以将单调的部分中间直接砍掉只留首尾两个,并且每次划分长度不超过 k=5k=5 即可
直接 暴力DP O(nk)O(nk)

I(比较简单)

题目

给出一个树,有若干个顶点被染黑,求有多少种分割树的方案使得每个子树恰好有一个黑色顶点,答案对 109+710^9+7 取模
1n1051\leq n\leq 10^5

sol

考虑DP,设计状态 dpi,0/1dp_{i,0/1} 表示[ ii 所在联通块及其子树交集]有 0/10/1 个黑色顶点
在转移过程中,要保证:每个联通块恰好一个黑色节点,于是由划分与不划分有转移方程:
CPP
int f[2]={dp[u][0],dp[u][1]};
dp[u][0]=f[0]*(dp[v][0]+dp[v][1])%mod;
dp[u][1]=f[0]*(dp[v][1])%mod+f[1]*(dp[v][0]+dp[v][1])%mod;

评论

0 条评论,欢迎与作者交流。

正在加载评论...