LuoguP4365 [九省联考2018]秘密袭击
https://zybuluo.com/ysner/note/1141136
题面
求一颗大小为\(n\)的树取联通块的所有方案中,第\(k\)个数之和。
- \(n\leq1,667,k\leq n\)
解析
这题可以当作暴力踩标算的范本题目。。。(其实是因为高级算法嵌套起来有时不如暴力快)
但这个暴力我是想不到的。。。
我们可以单独讨论每个点对答案的贡献,并把大于该点权值的点权值设为\(1\),其它设为\(0\)。接下来,我们就可以用\(O(nk^2\))的树形DP暴搞了。
但是,复杂度\(O(n^2k^2)\)会鬼啊。
于是换一种思路,枚举一颗树的根(讨论这个点对答案的贡献),统计儿子点在联通块中的结果,并强制取根到儿子点的路径。我们设\(dp[u][i]\)表示点\(u\)为联通块中第\(i\)个点的方案数,就可以转移了。
然而复杂度\(O(n^2k)\)???
但是我们只用枚举整颗树值排名\(\leq k\)的数作为根的情况,复杂度可以降为\(O((n-k)nk)\)。
这还跑过了。。。
Update:强制认为只能转移到 点权值大 或者 点权值相等且点编号大的点,否则会记重。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=s;i>=b;i--)
using namespace std;
const int N=2100,mod=64123;
struct Edge{int to,next;}e[N<<1];
int d[N],h[N],dp[N][N],ans,cnt,n,k,w,root,tot;
il void add(re int u,re int v){e[++cnt]=(Edge){v,h[u]};h[u]=cnt;}
il int gi()
{
re int x=0,t=1;
re char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
il void dfs(re int u,re int fa)
{
if((d[root]<d[u])||((d[u]==d[root])&&u<root))
fp(i,1,k-1) (dp[u][i+1]+=dp[fa][i])%=mod;
else fp(i,1,k) (dp[u][i]+=dp[fa][i])%=mod;
for(re int i=h[u];i+1;i=e[i].next)
{
re int v=e[i].to;
if(v==fa) continue;
dfs(v,u);
}
fp(i,1,k) (dp[fa][i]+=dp[u][i])%=mod;
}
int main()
{
memset(h,-1,sizeof(h));
n=gi();k=gi();w=gi();
fp(i,1,n) d[i]=gi();
fp(i,1,n-1)
{
re int u=gi(),v=gi();add(u,v);add(v,u);
}
fp(i,1,n)
{
root=i;tot=0;
fp(j,1,n) if((d[j]>d[i])||(d[i]==d[j]&&i>j)) ++tot;
if(tot<k-1) continue;
memset(dp,0,sizeof(dp));
dp[i][1]=1;
for(re int j=h[i];j+1;j=e[j].next)
{
re int v=e[j].to;
dfs(v,i);
}
(ans+=(1ll*dp[i][k]*d[i])%mod)%=mod;
}
printf("%d\n",ans);
return 0;
}
LuoguP4365 [九省联考2018]秘密袭击的更多相关文章
- [九省联考2018]秘密袭击coat
[九省联考2018]秘密袭击coat 研究半天题解啊... 全网几乎唯一的官方做法的题解:链接 别的都是暴力.... 要是n=3333暴力就完了. 一.问题转化 每个联通块第k大的数,直观统计的话,会 ...
- 【BZOJ5250】[九省联考2018]秘密袭击(动态规划)
[BZOJ5250][九省联考2018]秘密袭击(动态规划) 题面 BZOJ 洛谷 给定一棵树,求其所有联通块的权值第\(k\)大的和. 题解 整个\(O(nk(n-k))\)的暴力剪剪枝就给过了.. ...
- [BZOJ5250][九省联考2018]秘密袭击(DP)
5250: [2018多省省队联测]秘密袭击 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 0[Submit][Status][D ...
- P4365 [九省联考2018]秘密袭击coat
$ \color{#0066ff}{ 题目描述 }$ Access Globe 最近正在玩一款战略游戏.在游戏中,他操控的角色是一名C 国士 兵.他的任务就是服从指挥官的指令参加战斗,并在战斗中取胜. ...
- 解题:九省联考2018 秘密袭击CoaT
题面 按照*Miracle*的话来说,网上又多了一篇n^3暴力的题解 可能是因为很多猫题虽然很好,但是写正解性价比比较低? 直接做不可做,转化为统计贡献:$O(n)$枚举每个权值,直接统计第k大大于等 ...
- [九省联考 2018]秘密袭击coat
Description 题库链接 给出一棵 \(n\) 个点的树,每个点有点权.求所有联通块的权值 \(k\) 大和,对 \(64123\) 取模. \(1\leq n,k\leq 1666\) So ...
- [LOJ #2473] [九省联考2018] 秘密袭击coat
题目链接 洛谷. LOJ,LOJ机子是真的快 Solution 我直接上暴力了...\(O(n^2k)\)洛谷要\(O2\)才能过...loj平均单点一秒... 直接枚举每个点为第\(k\)大的点,然 ...
- 并不对劲的复健训练-bzoj5250:loj2473:p4365:[九省联考2018]秘密袭击
题目大意 有一棵\(n\)(\(n\leq 1666\))个点的树,有点权\(d_i\),点权最大值为\(w\)(\(w\leq 1666\)).给出\(k\)(\(k\leq n\)),定义一个选择 ...
- luogu P4365 [九省联考2018]秘密袭击coat
luogu 这里不妨考虑每个点的贡献,即求出每个点在多少个联通块中为第\(k\)大的(这里权值相同的可以按任意顺序排大小),然后答案为所有点权值\(*\)上面求的东西之和 把比这个点大的点看成\(1\ ...
随机推荐
- Resources.getResourceAsReader 报空指针
1.maven项目中 可能未编译 导致找不到, 解决方法:mvn clean install -DskipTests -X 编译一下项目 2.可能在 Resources.getResourceAs ...
- C# Winform 最大化后 任务栏还显示解决
//最大化 this.WindowState = FormWindowState.Maximized; //窗体最大化时 非全屏 不会遮盖任务栏 //去掉标题栏 this.FormBorderStyl ...
- day08-字符编码
目录 计算机基础 启动应用程序 写文本的流程 Python解释器执行文件的原理 Python解释器与文本编辑器的区别 字符编码 字符编码发生在哪三个阶段 字符编码发展史与分类 总结 Python2与P ...
- linux安装mysql可视化工具MySQL-workbench 连接数据库 执行sql
Step1:建立数据库连接 点击新建连接的按钮,符号是“+”的按钮,出现下图,在“Connection name”输入连接名称. 填写连接信息 输入数据库连接密码 测试连接: 再次点击连接时会要求输入 ...
- vue学习笔记(六)— 关于Vuex可以这样简单理解
关于Vuex可以这样简单理解 作者:狐狸家的鱼 本文链接:关于Vuex GitHub:sueRimn 概念理解 和大多数文章都一样,从概念解释到引出问题再举例解决问题. 官网中,Vuex是状态管理模式 ...
- mt_rand()和rand()两者的区别
在随机读取中使用了mt_rand(),而不适用rand(),他们两者的区别: mt_rand()是更好地随机数生成器,因为它跟rand()相比播下了一个更好地随机数种子:而且性能上比rand()快4倍 ...
- python学习笔记--关于函数的那点事1
函数参数 1.位置参数 类似于java函数的基本参数,按照顺序和结构定义参数 2.默认参数 def method(param,defaultParam=defaultValue) 调用时,可以调用me ...
- 获取webconfig配置文件内容
string ServerUrl= ConfigurationManager.AppSettings["ServerUrl"].ToString(); web.config中的配置 ...
- PostgreSQL使用总结
最近项目用到了PostgreSQL数据库,网上一堆教程,这里自己整理一下做个笔记: 1,下载安装,我这边安装在Windows7,在这里找到大象一样的标志: 2,双击打开,这里的话按流程直接走: 3,这 ...
- 第十四节:pandas之merge()合并
Pandas提供了一个merge()函数,作为DataFrame对象之间所有标准数据库连接操作的入口pandas.merge(left,right,how='inner',on=None,left_o ...