$ \color{#0066ff}{ 题目描述 }$

Access Globe 最近正在玩一款战略游戏。在游戏中,他操控的角色是一名C 国士 兵。他的任务就是服从指挥官的指令参加战斗,并在战斗中取胜。

C 国即将向D 国发动一场秘密袭击。作战计划是这样的:选择D 国的s 个城市, 派出C 国战绩最高的s 个士兵分别秘密潜入这些城市。每个城市都有一个危险程度did_idi,

C 国指挥官会派遣战绩最高的士兵潜入所选择的城市中危险程度最高的城市,派遣战绩第二高的士兵潜入所选择的城市中危险程度次高的城市,以此类推(即派遣战绩第i高的士兵潜入所选择城市中危险程度第i 高的城市)。D 国有n 个城市,n - 1 条双向道路连接着这些城市,使得这些城市两两之间都可以互相到达。为了任务执行顺利,C 国选出的s 个城市中,任意两个所选的城市,都可以不经过未被选择的城市互相到达。

Access Globe 操控的士兵的战绩是第k 高,他希望能估计出最终自己潜入的城市的 危险程度。Access Globe 假设C 国是以等概率选出任意满足条件的城市集合S ,他希望你帮他求出所有可能的城市集合中,Access Globe 操控的士兵潜入城市的危险程度之和。如果选择的城市不足k 个,那么Access Globe 不会被派出,这种情况下危险程度为0。

当然,你并不想帮他解决这个问题,你也不打算告诉他这个值除以998 244 353 的 余数,你只打算告诉他这个值除以64,123 的余数。

\(\color{#0066ff}{输入格式}\)

从文件coat.in 中读入数据。

第1 行包含3 个整数n、k、W,表示D 国城市的个数、Access Globe 所操控士兵 潜入的城市战绩排名以及D 国的所有城市中最大的危险程度;

第2 行包含n 个1 到W 之间的整数\(d_1\); \(d_2\); ... \(d_n\),表示每个城市的危险程度;

第3 行到第n + 1 行,每行两个整数\(x_i\); \(y_i\),表示D 国存在一条连接城市\(x_i\) 和城市\(y_i\) 的双向道路。

\(\color{#0066ff}{输出格式}\)

输出到文件coat.out 中。
输出一个整数,表示所有可行的城市集合中,Access Globe 操控的士兵潜入城市的危险程度之和除以64,123 的余数。

\(\color{#0066ff}{输入样例}\)

5 3 3
2 1 1 2 3
1 2
2 3
1 4
1 510 2 3
2 1 1 3 1 2 3 3 1 3
1 2
2 3
2 4
2 5
2 6
5 7
1 8
8 9
1 10

\(\color{#0066ff}{输出样例}\)

11435

\(\color{#0066ff}{数据范围与提示}\)

D 国地图如下,其中危险程度为d 的城市的形状是(d + 3) 边形。

以下是所有符合条件且选择的城市不少于3 个的方案:

• 选择城市1、2、3,Access Globe 的士兵潜入的城市危险程度为1;

• 选择城市1、2、3、4,Access Globe 的士兵潜入的城市危险程度为1;

• 选择城市1、2、3、5,Access Globe 的士兵潜入的城市危险程度为1;

• 选择城市1、2、3、4、5,Access Globe 的士兵潜入的城市危险程度为2;

• 选择城市1、2、4,Access Globe 的士兵潜入的城市危险程度为1;

• 选择城市1、2、5,Access Globe 的士兵潜入的城市危险程度为1;

• 选择城市1、2、4、5,Access Globe 的士兵潜入的城市危险程度为2;

• 选择城市1、4、5,Access Globe 的士兵潜入的城市危险程度为2;而在选择的 城市少于3 时,Access Globe 的士兵潜入的城市危险程度均为0;

所以你应该输出(1 + 1 + 1 + 2 + 1 + 1 + 2 + 2) mod 64 123 = 11。

7000ms / 1024MB

\(\color{#0066ff}{题解}\)

考虑正解暴力碾标算

这种数据范围,可以想到树形DP

答案就是所有联通块的第k大之和

对于每个联通块求第k大是不太好弄的

可以转化一下

我们枚举一个下界x,\(ans+=第k大\ge x的联通块个数\)

这样的话,比如第k大是5,那么我们从1枚举到5,每次都会算一遍,对答案的贡献是正确的

然后就可以DP了

\(f[i][j]为以i为根子树选j个\ge x的点且与i联通的联通块个数\)

跑树形背包即可

上界\(O(n^3)\)

卡卡常数就能碾过!

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
LL in() {char ch; LL x = 0, f = 1;while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));return x * f;
}
const int maxn = 2050;
const int mod = 64123;
struct node {int to;node *nxt;node(int to = 0, node *nxt = NULL): to(to), nxt(nxt) {}
};
node *head[maxn];
int f[maxn][maxn], n, k, w, s[maxn], val[maxn], ans, siz[maxn];
void add(int from, int to) {head[from] = new node(to, head[from]);
}
void dfs(int x, int fa, int limit) {f[x][siz[x] = val[x] >= limit] = 1;for(node *i = head[x]; i; i = i->nxt) {if(i->to == fa) continue;dfs(i->to, x, limit);for(int l = siz[x]; l >= 0; l--) {if(f[x][l]) {for(int r = siz[i->to]; r >= 0; r--) {if(f[i->to][r])(f[x][l + r] += 1LL * f[x][l] * f[i->to][r] % mod) %= mod;}}}siz[x] += siz[i->to];}for(int i = k; i <= siz[x]; i++) (ans += f[x][i]) %= mod;
}int main() {n = in(), k = in(), w = in();for(int i = 1; i <= n; i++) s[val[i] = in()]++;int x, y;for(int i = 1; i < n; i++) x = in(), y = in(), add(x, y), add(y, x);for(int i = w; i >= 1; i--) s[i] += s[i + 1];for(int now = 1; now <= w; now++) {if(s[now] < k) break;for(int i = 0; i <= n; i++)for(int j = 0; j <= n; j++) f[i][j] = 0;dfs(1, 0, now);}printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/olinr/p/10542181.html

P4365 [九省联考2018]秘密袭击coat相关推荐

  1. [九省联考2018]秘密袭击coat

    树形dp碾压标算 这道题目我写了60分的暴力(N^2*k),没有优化,只是说一说树形dp相关. 这道题我们可以转化一下,我们可以考虑每一个点对答案的贡献.这道题可以转化为以该点为根的树中包含根的连通块 ...

  2. [BZOJ5250][九省联考2018]秘密袭击(DP)

    5250: [2018多省省队联测]秘密袭击 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 3  Solved: 0 [Submit][Status] ...

  3. 九省联考2018总结

    前言 我作为一名ZJOI2018day1凉凉选手,为获得更多的省选体验,去上海参加了九省联考2018,当然,是属于外省选手参加的(所以实际并测的时候出现了一些问题也得不到解决),做完两天的题,深有感触 ...

  4. 「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess

    「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess 学校省选模拟居然拿九省联考来考 然而我还是\(too\space young\),搞不懂什么叫最优 让二者的答案最接近可 ...

  5. 【洛谷】【博弈搜索】P4363 [九省联考2018]一双木棋chess

    洛谷 P4363 [九省联考2018]一双木棋chess 题目大意 ◇题目传送门◆ 分析 根据题目所给定的规则,可以发现对于每一行,其下面一行上放的棋子数目不可能多于上面的一行. 所以我们可以将每行上 ...

  6. 「九省联考 2018」一双木棋

    「九省联考 2018」一双木棋 题目描述 菲菲和牛牛在一块 \(n\) 行 \(m\) 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满 ...

  7. [luogu]P4365[九省联考]秘密袭击coat(非官方正解)

    题目背景 警告:滥用本题评测者将被封号 We could have had it all. . . . . . 我们本该,拥有一切 Counting on a tree. . . . . . 何至于此 ...

  8. 【九省联考2018】秘密袭击【树形dp】【生成函数】【线段树合并】【多项式插值】

    题意:nnn 个点的带点权的树,点权最大值为 www,求所有连通子图第 kkk 大权值之和模 641236412364123. n,w≤1666n,w\leq 1666n,w≤1666,时限 5s. ...

  9. [BZOJ5249][九省联考2018]IIIDX(线段树)

    5249: [2018多省省队联测]IIIDX Time Limit: 40 Sec  Memory Limit: 512 MB Submit: 32  Solved: 17 [Submit][Sta ...

最新文章

  1. java db 10.4.13_Spring Data MongoDB 1.10.13和Mongo 3.4
  2. 深入浅出Node.js(八):Connect模块解析(之二)静态文件中间件
  3. Netflix在安卓移动启用AV1格式 较VP9编码效率提升20%
  4. lorawan的工作原理_LoRaWAN协议的工作原理是怎样的
  5. 不同语言,系统通过共享内存方式实现信息交互
  6. email 添加附件 java_Java发送email 带附件 | 学步园
  7. 大数据_Flink_Java版_数据处理_流处理API_Sink操作_把数据存储到ElasticSearch---Flink工作笔记0040
  8. 主要省份城市的DNS服务器地址
  9. Java序列化技术性能分析(JDK原生与Protostuff)
  10. 南航计算机科学与技术学院老师,南航计算机科学与技术学院导师介绍:孙涵
  11. 金蝶K3WISE盘点机PDA扫码入库仓库条码管理,外购入库单
  12. 计算机桌面显示保护眼睛设置,教你把电脑屏幕设置成可以保护眼睛的颜色
  13. SQLite3 编译
  14. 【路径规划】基于matlab人工势场法机器人避障路径规划【含Matlab源码 620期】
  15. win7的音量图标不见了
  16. US Shirt Size
  17. 一张图看懂光圈、快门、感光度的意义
  18. JS 日期的获取和计算 ios不兼容问题
  19. 为何苹果电脑虚拟机如此受欢迎
  20. 我的2012,一个2b青年的表白

热门文章

  1. RAC环境调整系统时间
  2. web前端会徽_光泽会徽文本效果– Photoshop教程
  3. Andorid学习笔记一:概述
  4. 圆锥体的高度是多少?
  5. 计算机视觉 ——SIFT算子
  6. 三星给Galaxy Z Fold5上了IP58级别防护:还没摸到旗舰防护级别
  7. Maya Python 游戏与影视编程指南 第一章
  8. 申报高企如何提高审计报告可读性
  9. CVTE广州视源的一次面试经历
  10. 用计算机打青春不打烊,青春不打烊作文