#2473. 「九省联考 2018」秘密袭击

链接

分析:

  首先枚举一个权值W,计算这个多少个连通块中,第k大的数是这个权值。

  $f[i][j]$表示到第i个节点,有j个大于W数的连通块的个数。然后背包转移。

  复杂度是$O(n^2k)$,时限5s,然后卡卡常就过了。

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<cctype>
  7. #include<set>
  8. #include<queue>
  9. #include<vector>
  10. #include<map>
  11. using namespace std;
  12. typedef unsigned int ui;
  13. inline int read() {
  14. int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
  15. for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
  16. }
  17.  
  18. const int N = , mod = ;
  19. struct Edge{ int to, nxt; } e[N << ];
  20. int head[N], id[N], fa[N], st[N], ed[N], a[N];
  21. ui f[N][N];
  22. int n, k, w, Now, En;
  23.  
  24. inline bool cmp(int x,int y) { return a[x] == a[y] ? x <= y : a[x] < a[y]; }
  25. inline void add_edge(int u,int v) {
  26. ++En; e[En].to = v, e[En].nxt = head[u]; head[u] = En;
  27. ++En; e[En].to = u, e[En].nxt = head[v]; head[v] = En;
  28. }
  29. void dfs(int u) {
  30. for (int i = st[u]; i <= ed[u]; ++i) f[u][i] = ;
  31. if (cmp(Now, u)) st[u] = ed[u] = ;
  32. else st[u] = ed[u] = ;
  33. f[u][st[u]] = ;
  34. for (int i = head[u]; i; i = e[i].nxt) {
  35. int v = e[i].to;
  36. if (v == fa[u]) continue;
  37. fa[v] = u;
  38. dfs(v);
  39. for (int j = ed[u]; j >= st[u]; --j)
  40. for (int k = ed[v]; k >= st[v]; --k)
  41. f[u][j + k] = (f[u][j + k] + f[u][j] * f[v][k]) % mod;
  42. ed[u] += ed[v];
  43. }
  44. for (int i = st[u]; i <= ed[u]; ++i) f[][i] = (f[][i] + f[u][i]) % mod;
  45. }
  46. int main() {
  47. n = read(), k = read(), w = read();
  48. for (int i = ; i <= n; ++i) a[i] = read();
  49. for (int i = ; i < n; ++i) {
  50. int u = read(), v = read();
  51. add_edge(u, v);
  52. }
  53. for (int i = ; i <= n; ++i) id[i] = i;
  54. sort(id + , id + n + , cmp);
  55. ui ans = ;
  56. for (int i = ; i <= n; ++i) {
  57. memset(f[], , sizeof(f[]));
  58. Now = id[i];
  59. dfs();
  60. for (int j = k; j <= n; ++j)
  61. ans = (ans + f[][j] * (a[id[i]] - a[id[i - ]])) % mod;
  62. }
  63. cout << ans % mod;
  64. return ;
  65. }

LOJ #2473. 「九省联考 2018」秘密袭击的更多相关文章

  1. LOJ 2743(洛谷 4365) 「九省联考 2018」秘密袭击——整体DP+插值思想

    题目:https://loj.ac/problem/2473 https://www.luogu.org/problemnew/show/P4365 参考:https://blog.csdn.net/ ...

  2. Loj #2479. 「九省联考 2018」制胡窜

    Loj #2479. 「九省联考 2018」制胡窜 题目描述 对于一个字符串 \(S\),我们定义 \(|S|\) 表示 \(S\) 的长度. 接着,我们定义 \(S_i\) 表示 \(S\) 中第 ...

  3. LOJ#2471「九省联考 2018」一双木棋 MinMax博弈+记搜

    题面 戳这里 题解 因为每行取的数的个数是单调不增的,感觉状态数不会很多? 怒而记搜,结果过了... #include<bits/stdc++.h> #define For(i,x,y) ...

  4. @loj - 2478@「九省联考 2018」林克卡特树

    目录 @description@ @solution@ @part - 1@ @part - 2@ @accepted code@ @details@ @description@ 小 L 最近沉迷于塞 ...

  5. 「九省联考 2018」IIIDX 解题报告

    「九省联考 2018」IIIDX 这什么鬼题,送的55分要拿稳,实测有60? 考虑把数值从大到小摆好,每个位置\(i\)维护一个\(f_i\),表示\(i\)左边比它大的(包括自己)还有几个数可以选 ...

  6. 【LOJ】#2479. 「九省联考 2018」制胡窜

    题解 老了,国赛之前敲一个后缀树上LCT和线段树都休闲的很 现在后缀树上线段树合并差点把我写死 主要思路就是后缀树+线段树合并+容斥,我相信熟练的OIer看到这已经会了 但就是不想写 但是由于我过于老 ...

  7. [loj 2478][luogu P4843]「九省联考 2018」林克卡特树

    传送门 Description 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一 ...

  8. loj2472 「九省联考 2018」IIIDX

    ref #include <algorithm> #include <iostream> #include <cstdio> using namespace std ...

  9. [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树

    [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树 题意 给定一个 \(n\) 个点边带权的无根树, 要求切断其中恰好 \(k\) 条边再连 \(k\) 条边权为 \(0\) ...

随机推荐

  1. Mysqlbinlog工具及导出数据并转换编码导入

    2014 - binlog是通过记录二进制文件方式来备份数据,然后在从二进制文件将数据恢复到某一时段或某一操作点. 1.使用mysqlbinlog工具来恢复 Mysqlbinlog日志如何开启? 在m ...

  2. 基于dispatch_after封装YXTimer

    基于dispatch_after封装YXTimer 本人根据dispatch_after封装了一个定时器,支持block以及代理的方式来激活定时器,适用于对精度要求低,耗时短的地方,高端大气上档次,低 ...

  3. 制作 OS X El Capitan 启动盘

    制作 OS X El Capitan 启动盘 1. 下载系统盘的dmg格式 2. 直到出现了 3. 在命令行中找到 Install OS X El Capitan.app 4. 格式化你的U盘(U盘名 ...

  4. Numpy 的常用操作

    1.创建数组array # 创建数组array import numpy as np a = np.array([1,2,3]) #创建数组 b = np.array([(1.5,2,3), (4,5 ...

  5. 使用concurrent.futures模块并发,实现进程池、线程池

    Python标准库为我们提供了threading和multiprocessing模块编写相应的异步多线程/多进程代码 从Python3.2开始,标准库为我们提供了concurrent.futures模 ...

  6. CentOS7 防火墙(firewall)的操作命令

    CentOS7 防火墙(firewall)的操作命令 安装:yum install firewalld 1.firewalld的基本使用 启动: systemctl start firewalld 查 ...

  7. Java基础面试题(Hibernate)

    Hibernate是一个什么样的框架? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hi ...

  8. java内部类案例

    实现键值对的存储输出 import java.util.Arrays; public class EntryDemoTest { //实现键值对的存储 public static void main( ...

  9. css3画图那些事(三角形、圆形、梯形等)

    闲来无事,写写图形.当时巩固一下css3吧..前端小白,写的不好还请前辈多指教. 三角形 { width:; height:; border-bottom: 140px solid red ; bor ...

  10. R语言常用语法和用法

    数据准备 height <- c(6.00, 5.92, 5.58, 5.92) 1 计算均值 mean(height) [1] 5.855 2 计算中位数 median(height) [1] ...