5250: [2018多省省队联测]秘密袭击

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 3  Solved: 0
[Submit][Status][Discuss]

Description

【题目背景】
We could have had it all. . . . . .
我们本该,拥有一切
Counting on a tree. . . . . .
何至于此,数数树上
Counting on a Tree( CoaT)即是本题的英文名称。
【题目描述】
AccessGlobe最近正在玩一款战略游戏。在游戏中,他操控的角色是一名C国士兵。他的任务就是服从指挥官的指令
参加战斗,并在战斗中取胜。C国即将向D国发动一场秘密袭击。作战计划是这样的:选择D国的s个城市,派出C国
战绩最高的s个士兵分别秘密潜入这些城市。每个城市都有一个危险程度di,C国指挥官会派遣战绩最高的士兵潜入
所选择的城市中危险程度最高的城市,派遣战绩第二高的士兵潜入所选择的城市中危险程度次高的城市,以此类推
(即派遣战绩第i高的士兵潜入所选择城市中危险程度第i高的城市)。D国有n个城市,n-1条双向道路连接着这些
城市,使得这些城市两两之间都可以互相到达。为了任务执行顺利,C国选出的s个城市中,任意两个所选的城市,
都可以不经过未被选择的城市互相到达。AccessGlobe操控的士兵的战绩是第k高,他希望能估计出最终自己潜入的
城市的危险程度。AccessGlobe假设C国是以等概率选出任意满足条件的城市集合S,他希望你帮他求出所有可能的
城市集合中,AccessGlobe操控的士兵潜入城市的危险程度之和。如果选择的城市不足k个,那么AccessGlobe不会
被派出,这种情况下危险程度为0。当然,你并不想帮他解决这个问题,你也不打算告诉他这个值除以998,244,353
的余数,你只打算告诉他这个值除以64,123的余数。

Input

第1行包含3个整数n、k、W
表示D国城市的个数、AccessGlobe所操控士兵潜入的城市战绩排名以及D国的所有城市中最大的危险程度;
第2行包含n个1到W之间的整数d1,d2,...,dn,表示每个城市的危险程度;
第3行到第n+1行,每行两个整数xi,yi,表示D国存在一条连接城市xi和城市yi的双向道路
1 ≤ k ≤ n,, 1 ≤ di ≤ W, n, k, W ≤ 1, 666。

Output

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

Sample Input

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

Sample Output

11

HINT

请不要提交,原题空间限制为1G,单点时限5s.请下载数据自行测评.数据如下:https://begin.lydsy.com/JudgeOnline/upload/5240.rar

Source

[Submit][Status][Discuss]

正解好像是从本质理解FFT?听起来就不可做。

考虑暴力踩标程。我们枚举每个点,算出以这个点为第k名的连通块个数。

我们将枚举的点作为根DP,因为可能有重复,所以规定相等的点只能从编号小的走向大的,这题就成了某道CF原题了。

下面代码的主要思想是,递归时由父亲将信息传下来,然后修改当前点的信息,然后递归到子节点完善信息,再将信息返回给父亲。这个思路感觉比较新奇。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std; const int N=,mod=;
int n,k,W,cnt,S,ans,u,v,to[N<<],nxt[N<<],h[N],d[N],f[N][N]; void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; }
void up(int &x,int y){ x+=y; if (x>=mod) x-=mod; } void dfs(int x,int fa,int g[]){
if (d[x]>d[S] || (d[x]==d[S] && x>S)) rep(i,,k) f[x][i]=g[i-];
else rep(i,,k) f[x][i]=g[i];
for (int i=h[x]; i; i=nxt[i]) if (to[i]!=fa) dfs(to[i],x,f[x]);
rep(i,,k) up(g[i],f[x][i]);
} void calc(int x){
int tot=;
rep(i,,n) if (d[i]>d[x] || (d[i]==d[x] && i>x)) tot++;
if (tot<k) return;
S=x; memset(f[x],,sizeof(f[x])); f[x][]=;
for (int i=h[x]; i; i=nxt[i]) dfs(to[i],x,f[x]);
ans=(ans+1ll*d[x]*f[x][k])%mod;
} int main(){
freopen("coat.in","r",stdin);
freopen("coat.out","w",stdout);
scanf("%d%d%d",&n,&k,&W);
rep(i,,n) scanf("%d",&d[i]);
rep(i,,n) scanf("%d%d",&u,&v),add(u,v),add(v,u);
rep(i,,n) calc(i);
printf("%d\n",ans);
return ;
}

[BZOJ5250][九省联考2018]秘密袭击(DP)的更多相关文章

  1. 【BZOJ5250】[九省联考2018]秘密袭击(动态规划)

    [BZOJ5250][九省联考2018]秘密袭击(动态规划) 题面 BZOJ 洛谷 给定一棵树,求其所有联通块的权值第\(k\)大的和. 题解 整个\(O(nk(n-k))\)的暴力剪剪枝就给过了.. ...

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

    [九省联考2018]秘密袭击coat 研究半天题解啊... 全网几乎唯一的官方做法的题解:链接 别的都是暴力.... 要是n=3333暴力就完了. 一.问题转化 每个联通块第k大的数,直观统计的话,会 ...

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

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

  4. 并不对劲的复健训练-bzoj5250:loj2473:p4365:[九省联考2018]秘密袭击

    题目大意 有一棵\(n\)(\(n\leq 1666\))个点的树,有点权\(d_i\),点权最大值为\(w\)(\(w\leq 1666\)).给出\(k\)(\(k\leq n\)),定义一个选择 ...

  5. 解题:九省联考2018 秘密袭击CoaT

    题面 按照*Miracle*的话来说,网上又多了一篇n^3暴力的题解 可能是因为很多猫题虽然很好,但是写正解性价比比较低? 直接做不可做,转化为统计贡献:$O(n)$枚举每个权值,直接统计第k大大于等 ...

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

    Description 题库链接 给出一棵 \(n\) 个点的树,每个点有点权.求所有联通块的权值 \(k\) 大和,对 \(64123\) 取模. \(1\leq n,k\leq 1666\) So ...

  7. [LOJ #2473] [九省联考2018] 秘密袭击coat

    题目链接 洛谷. LOJ,LOJ机子是真的快 Solution 我直接上暴力了...\(O(n^2k)\)洛谷要\(O2\)才能过...loj平均单点一秒... 直接枚举每个点为第\(k\)大的点,然 ...

  8. LuoguP4365 [九省联考2018]秘密袭击

    https://zybuluo.com/ysner/note/1141136 题面 求一颗大小为\(n\)的树取联通块的所有方案中,第\(k\)个数之和. \(n\leq1,667,k\leq n\) ...

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

    luogu 这里不妨考虑每个点的贡献,即求出每个点在多少个联通块中为第\(k\)大的(这里权值相同的可以按任意顺序排大小),然后答案为所有点权值\(*\)上面求的东西之和 把比这个点大的点看成\(1\ ...

随机推荐

  1. Python学习笔记 - day14 - Celery异步任务

    Celery概述 关于celery的定义,首先来看官方网站: Celery(芹菜) 是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具. 简单来看,是一个基于pyt ...

  2. 手動設定 電池溫度 mtk platform

    adb root adb shell echo "3 1 27" > ./proc/mtk_battery_cmd/battery_cmd 27 即是所要設定的溫度, 此設定 ...

  3. python string 对齐文本的几个方法

    用rjust().ljust()和center()方法对齐文本

  4. STL之顺序容器 deque 动态数组

    deque是一个动态数组,deque与vector非常类似,vector是一个单向开口的连续线性空间,deque则是双向开口的连续线性空间.两者唯一的区别是deque可以在数组的开头和末尾插入和删除数 ...

  5. java8新特性视频、spring4.0视频讲解,javaee基础知识讲解等网址汇总

    1.http://ke.atguigu.com/     海量视频首页 2.http://ke.atguigu.com/course/56    java8新特性学习地址

  6. 微信支付之SHA256签名失败

    在接微信支付的时候,或多或少会遇到签名失败,本人接入的时候也遇了不少次: 总结如下: 1.参数没有经过ASCII排序 2.参数包含中文未经过UTF-8标准转化加密后的签名不对应(经本人测验:加密算法要 ...

  7. 利用BeanUtils工具类封装表单数据

    一.BeanUtils工具类的使用 1.首先导入BeanUtils工具类的jar包 commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar 2.se ...

  8. Python Flask 配置文件

    1. 什么是配置文件? 就是当程序调用的一些参数,文件路径,方法或者类放到一个文件中, 当下次需要修改的一个参数的时候,不用再从所有关联的程序中找到该参数挨个修改, 比较繁琐.像Django中,程序启 ...

  9. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记6——四大变换&光照与材质

    第13章 四大变换 在Direct3D中,如果为进行任何空间坐标变换而直接绘图的话,图形将始终处于应用程序窗口的中心位置,默认这个位置就成为世界坐标系的原点(0,0,0).而且我们也不能改变观察图形的 ...

  10. 微信小程序~触摸相关事件(拖拽操作、手势识别、多点触控)

    touchstart     手指触摸动作开始 touchmove    手指触摸后移动 touchcancel  手指触摸动作被打断,如来电提醒,弹窗 touchend      手指触摸动作结束 ...