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\ ...
随机推荐
- Ajax——异步基础知识(二)
XML数据格式 首行必须是版本号和格式等信息 <?xml version="1.0" encoding="utf-8" ?> 最外层需要一个根节点进 ...
- 【SQLite】select into 语句
sqlite不支持类似sqlserver中的select into 语法 在SQL Server中,我们要将一个表中的数据复制到一个新表中,可以这样写: SELECT * INTO newtable ...
- javascript之console篇
javascript中的console使用得当,将会事半功倍,对bug,性能等的跟踪,优化是个不错的利器! 1.基本日志消息打印: console.debug(msg); console.info() ...
- 15、Scala隐式转换和隐式参数
1.隐式转换 2.使用隐式转换加强现有类型 3.隐式转换函数的作用域与导入 4.隐式转换发生时机 5.隐式参数 1.隐式转换 要实现隐式转换,只要程序可见的范围内定义隐式转换函数即可.Scala会自动 ...
- Oreacle 语句
SELECT * FROM = and CREATETIME >to_date('2019-01-01' , 'yyyy-mm-dd hh24:mi:ss') and CREATETIME &l ...
- C# Winform 获得下拉框 选中的值
string PrintName = cmbPrinter.SelectedIndex.ToString(); PrintName = cmbPrinter.SelectedItem.ToString ...
- 非常简单的Python HTTP服务
如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS等.那么, Python 可能帮助你.使用Python可以完成一个简单的内建 HT ...
- ES6 基础学习
ECMAScript 6 标准入门 一.let和const let命令 let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效:是块级作用域,且let不允许 ...
- Yii2开发技巧 使用类似闭包的方式封装事务
在控制器中执行事务的时候,一般的代码如下: $transaction = Yii::$app->db->beginTransaction(); try { //一些业务代码 $transa ...
- copy the content of a file muliptle times and save as ordered files:
input: transient.case outputs: transient_1.case, transient_2.case,...transient_101.case ********** n ...