题目背景

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

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. Codeforces 798C:Mike and gcd problem
  2. p2657 windy数
  3. 大剑无锋之已知后续遍历bfegcda,中序badefcg,前序是?【面试推荐】
  4. 使用SoapUI调用安全WCF SOAP服务–第1部分,该服务
  5. 作者:张丹(1991-),女,中南大学信息与工程学院硕士生。
  6. memcached安装及.NET中的Memcached.ClientLibrary使用详解
  7. Deploy Oracle 10.2.0.5 DataGuard on Red Hat Enterprise Linux 6.4
  8. linux 内核同步--理解原子操作、自旋锁、信号量(可睡眠)、读写锁、RCU锁、PER_CPU变量、内存屏障
  9. 超级硬盘数据恢复软件v2.7.2.6_电脑磁盘上的视频误删如何恢复?误删视频恢复教程...
  10. FreeSurfer Tutorial Datasets训练数据配置
  11. java取负数_[Java] 告别“CV 工程师”码出高效!(基础篇)
  12. 西门子PLC学习笔记七-(位逻辑指令)
  13. vim字符串全局替换
  14. 最全的iOS开发资源整理
  15. nginx-proxy-manager在线申请证书
  16. Cuda相关的函数数
  17. 短视频内容创业,注定只是少数人的游戏
  18. Oracle-enq:TX-row-contention等待场景
  19. 利用python渲染IPsec配置
  20. Java leetcode 相交链表

热门文章

  1. 【通信原理】基带数字传输和码间干扰核心问题解析
  2. Java Lambda 连接字符串
  3. 感知器(perceptron)模型分析及实现
  4. jQuery为input赋值(调用函数)
  5. 图像分解python_将图像等分为两部分python open
  6. 如何高效撰写毕业论文之Origin绘图 (一)
  7. 跟软件专家学沟通技巧(一)
  8. HashMap如何计算数组下标
  9. Konva 使用方法
  10. QQ--基于TCP/UDP协议的通讯原理