题目背景

警告:滥用本题评测者将被封号

We could have had it all. . . . . .

我们本该,拥有一切

Counting on a tree. . . . . .

何至于此,数数树上

Counting on a Tree(CoaT)即是本题的英文名称。

题目描述

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

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

输入输出格式

输入格式:

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

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

第2 行包含n 个1 到W 之间的整数d_1d1​; d_2d2​; ... d_ndn​,表示每个城市的危险程度;

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

输出格式:

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

输入输出样例

输入样例#1: 复制

5 3 3
2 1 1 2 3
1 2
2 3
1 4
1 5

输出样例#1: 复制

11

输入样例#2: 复制

10 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

输出样例#2: 复制

435

说明

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。

题解

这道题教会我们。
暴力是一定要打的.信仰是一定要有的。
万一A了呢?
因为本题正解涉及的算法过多且复杂。
所以暴力效率似乎>>正解。就像一些树套树的题目被分块水掉一样。

现在来讲暴力。
设f[i][j]表示第i个节点为根的子树,选了j个比当前预想的值大的方案。
那么转移方程为
\(if(ch[u]>ch[now])f[v][j+1]+=f[u][j];\)
\(if(ch[u]<ch[now])f[v][j]+=f[u][j];\)
但是相同的值呢?
我们把序号进行比较,这样我们就不会重复计算了。
对于每一个子树处理完之后,我们要加上它的值
\(f[u][i]+=f[v][i]\)
为什么?因为只要向下选了就是一种方案。
我们枚举一重循坏枚举当前哪个点要选
便利一遍树,对于每一个节点枚举k值。
就可以了。是的,w并没卵用。暴力出奇迹!!

Code

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=64123;
const int N=1675;
int n,k,w,ch[N],now,ans;
int f[N][N],num,head[N];
struct node{int to,nex;
}e[N<<1];
int read(){int x=0,w=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*w;
}void add(int from,int to){num++;e[num].to=to;e[num].nex=head[from];head[from]=num;
}void dfs(int x,int ff){for(int i=head[x];i;i=e[i].nex){int v=e[i].to;if(v==ff)continue;if((ch[v]>ch[now])||(ch[v]==ch[now]&&v>now))for(int j=1;j<k;j++)f[v][j+1]+=f[x][j],f[v][j+1]%=mod;else for(int j=1;j<=k;j++)f[v][j]+=f[x][j],f[v][j]%=mod;dfs(v,x);for(int j=1;j<=k;j++)f[x][j]+=f[v][j],f[x][j]%=mod;}
}int main(){n=read();k=read();w=read();for(int i=1;i<=n;i++)ch[i]=read();for(int i=1;i<n;i++){int x=read(),y=read();add(x,y);add(y,x);}for(int i=1;i<=n;i++){now=i;memset(f,0,sizeof(f));int tot=0;for(int j=1;j<=n;j++)if((ch[j]>ch[now])||(ch[j]==ch[now]&&j>now))tot++;if(tot<k-1)continue;f[i][1]=1;dfs(i,i); ans+=f[i][k]*ch[i];ans%=mod;}printf("%d\n",ans%mod);return 0;
}

转载于:https://www.cnblogs.com/hhh1109/p/10532663.html

[luogu]P4365[九省联考]秘密袭击coat(非官方正解)相关推荐

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

    $ \color{#0066ff}{ 题目描述 }$ Access Globe 最近正在玩一款战略游戏.在游戏中,他操控的角色是一名C 国士 兵.他的任务就是服从指挥官的指令参加战斗,并在战斗中取胜. ...

  2. [LUOGU] P4363 [九省联考2018]一双木棋chess

    题目描述 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子当且仅当这 ...

  3. luogu P4363 [九省联考2018]一双木棋chess

    analysis 这是一道很好的状压dp 这个题首先需要分析出任何一个合法的状态都可以化为从左下角到右上角的一条对角线 这样一来状态就很好表示了: 我们考虑设f[s]表示从状态s出发,最后先手减后手的 ...

  4. 九省联考2018总结

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

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

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

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

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

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

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

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

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

  9. BZOJ 4872 luogu P3750 [六省联考2017]分手是祝愿

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec  Memory Limit: 512 MB [Submit][Status][Discuss] Description ...

最新文章

  1. 浪潮刘军:为什么说计算力是AI时代“免费的午餐”?
  2. python模块之imghdr检测图片类型
  3. 用Ghost几秒钟快速格式化120G大硬盘
  4. numpy笔记 linalg
  5. perl基本语法--转载
  6. wxWidgets:wxMBConv概述
  7. few-shot learning 1.1——零样本学习
  8. 命令终端(CMD)自动补全功能 — Tab Complete 功能
  9. 推荐系统学习(三)SVD奇异值分解做推荐与python代码
  10. SAP-BW数据仓库增量更新
  11. iOS-使用代码约束布局(Masonry)
  12. 编程之美读书笔记1.2——中国象棋将帅问题
  13. java中parser_JavaParser:Java代码生成
  14. 《金字塔原理》学习笔记
  15. 前端特效 - 前置- - 01. 百叶窗
  16. python verilog就业_[持续演进] 应届生 FPGA 就业,一点微小的看法
  17. 谷歌邮箱服务器验证失败,Gmail错误:SMTP服务器需要安全连接,或者客户端未经身份验证。服务器响应为...
  18. 简单实现你想数字电脑猜的小游戏
  19. sql插入语句中value中含有单引号
  20. client_loop: send disconnect: Broken pipe

热门文章

  1. java+jsp+servlet+mysql【网上预约挂号系统】(源码+论文+PPT+任务书+中期检查)
  2. 浅谈面向对象三大特征的理解
  3. ACM简易对拍程序写法
  4. 激活函数 sigmoid、tanh、ReLu、Leaky ReLu、ELU、Maxout
  5. 顺丰同城入局洗衣行业 与浣洗合作提升用户体验
  6. 使用SQL Server数据库支持SharePoint的5条技巧
  7. 解决”VT-x/AMD-V 硬件加速在您的系统中不可用。您的 64-位虚拟机将无法检测到 64-位处理器,从而无法启动。“问题
  8. Java学到什么程度才能找到工作
  9. 2019年值得关注的区块链4大趋势
  10. Java获取二维数组行列长度