AtCoder Beginner Contest 341-F

F - Breakdown

Problem

给你一个由 \(N\) 个顶点和 \(M\) 条边组成的简单无向图。每个顶点拥有权重\(W_i\),并且被放置了\(A_i\)个棋子。

只要图形上还有棋子,就重复下面的操作:

  • 首先,从图形中选择一个(有棋子的)顶点\(x\)并移除一个棋子。
  • 从\(x\)相邻点中选择出一些点组成集合\(S\)(可以不选),要保证这个集合内的所有点的权重之和小于顶点\(x\),即\(\sum_{y \in S} W_y \lt W_x\),并在\(S\)中的每个顶点上放置一个棋子。

请求出最多最多能进行多少次这样的操作。

可以证明,无论如何操作,在有限次迭代后,图形上将没有棋子。

Constraints

  • \(2 \leq N \leq 5000\)
  • \(1 \leq M \leq \min \lbrace N(N-1)/2, 5000 \rbrace\)
  • \(1 \leq u_i, v_i \leq N\)
  • \(u_i \neq v_i\)
  • \(i \neq j \implies \lbrace u_i, v_i \rbrace \neq \lbrace u_j, v_j \rbrace\)
  • \(1 \leq W_i \leq 5000\)
  • \(0 \leq A_i \leq 10^9\)

Solution

首先再此解释一下题目中的操作:

假设现在图是这样的:

(为了方便,图中的数字既表示顶点,同时也表示该点的权重\(W_i\))

其中顶点5上有一颗棋子,并且现在选择\(x=5\),开始操作。

首先取下5上的棋子,接下来选择5的相邻点的一个集合(比如1,3),且保证集合内点的权重之和小于\(W_x\)。因此我们可以选1,3,可以选1,可以选3,也可以不选,但是不能选6

此时可以发现,我们始终只能选择比点\(x\)要小的点,也就是说棋子的扩散方向永远是单向的(3永远不可能给5棋子,5也永远不能给6棋子)

所以题目中说的简单无向图其实是个幌子,这其实是一个DAG

那么我们先将原图化为DAG,再按照权重升序来看各个顶点(小权重顶点不会对大权重顶点有干扰,棋子之间也不会有相互作用),进行DAG上的dp。

具体的,设X[i]表示若顶点i有一枚棋子,可以操作的次数

当轮到点x的时候,权重比其小的出点都已经计算好了X[i],现在需要抉择出如何选择他的出点集合,使得在权重之和不超过\(W_x\)的情况下,尽力包含更多的X[i]——相当于做个背包问题了。

Code

#define N 5020

int n,m;
vector<pair<int,int>>edge;
int W[N],A[N];
pair<int,int>ww[N];
vector<int>e[N];
int order[N]; bool cmp(int x,int y)
{
return W[x]<W[y];
} LL dp[N];
LL X[N]; int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
edge.push_back(make_pair(x,y));
}
for(int i=1;i<=n;i++)
{
cin>>W[i];
}
for(int i=1;i<=n;i++)
{
cin>>A[i];
}
for(int i=0;i<m;i++)
{
if(W[edge[i].first]>W[edge[i].second]) e[edge[i].first].push_back(edge[i].second);
if(W[edge[i].first]<W[edge[i].second]) e[edge[i].second].push_back(edge[i].first);
}
for(int i=1;i<=n;i++) order[i]=i;
sort(order+1,order+n+1,cmp);
for(int i=1;i<=n;i++) X[i]=1;
for(int i=1,x;i<=n;i++)
{
x=order[i];
memset(dp,0,sizeof(dp));
dp[0]=1;
for(unsigned int j=0;j<e[x].size();j++)
{
int y=e[x][j];
for(int k=W[x]-1;k-W[y]>=0;k--)
{
dp[k]=max(dp[k],dp[k-W[y]]+X[y]);
}
}
for(int k=0;k<=5000;k++) X[x]=max(X[x],dp[k]);
}
LL ans=0;
for(int i=1;i<=n;i++) ans+=X[i]*A[i];
cout<<ans; return 0;
}

Attention

记得开long long

注意背包dp[i]X[i]的初值

Reference

A-F in 4 minutes

AtCoder Beginner Contest 341-F的更多相关文章

  1. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  2. AtCoder Beginner Contest 261 F // 树状数组

    题目链接:F - Sorting Color Balls (atcoder.jp) 题意: 有n个球,球有颜色和数字.对相邻的两球进行交换时,若颜色不同,需要花费1的代价.求将球排成数字不降的顺序,所 ...

  3. AtCoder Beginner Contest 260 F - Find 4-cycle

    题目传送门:F - Find 4-cycle (atcoder.jp) 题意: 给定一个无向图,其包含了S.T两个独立点集(即S.T内部间的任意两点之间不存在边),再给出图中的M条边(S中的点与T中的 ...

  4. AtCoder Beginner Contest 253 F - Operations on a Matrix // 树状数组

    题目传送门:F - Operations on a Matrix (atcoder.jp) 题意: 给一个N*M大小的零矩阵,以及Q次操作.操作1(l,r,x):对于 [l,r] 区间内的每列都加上x ...

  5. AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆

    传送门:F - Keep Connect (atcoder.jp) 题意: 给定长度为N的操作(ti,yi). 给定初值为0的x,对其进行操作:当t为1时,将x替换为y:当t为2时,将x加上y. 最多 ...

  6. AtCoder Beginner Contest 247 F - Cards // dp + 并查集

    原题链接:F - Cards (atcoder.jp) 题意: 给定N张牌,每张牌正反面各有一个数,所有牌的正面.反面分别构成大小为N的排列P,Q. 求有多少种摆放方式,使得N张牌朝上的数字构成一个1 ...

  7. AtCoder Beginner Contest 133 F Colorful Tree

    Colorful Tree 思路: 如果强制在线的化可以用树链剖分. 但这道题不强制在线,那么就可以将询问进行差分,最后dfs时再计算每个答案的修改值, 只要维护两个数组就可以了,分别表示根节点到当前 ...

  8. AtCoder Beginner Contest 171-175 F

    171 F - Strivore 直接把初始字符当成隔板,统计的方案数会有重复 为了避免重复情况,规定隔板字母尽可能最后出现,即在隔板字母后面不能插入含隔板字母的字符串 所以在隔板字母后插入的字符只有 ...

  9. AtCoder Beginner Contest 182 F

    F - Valid payments 简化题意:有\(n\)种面值的货币,保证\(a[1]=1,且a[i+1]是a[i]的倍数\). 有一个价格为\(x\)元的商品,付款\(y\)元,找零\(y-x\ ...

  10. AtCoder Beginner Contest 215 F题题解

    F - Dist Max 2 什么时候我才能突破\(F\)题的大关... 算了,不说了,看题. 简化题意:给定\(n\)个点的坐标,定义没两个点的距离为\(min(|x_i-x_j|,|y_i-y_j ...

随机推荐

  1. Windows 提权-内核利用_2

    本文通过 Google 翻译 Kernel Exploits Part 2 – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...

  2. Kubernetes v1.16.3版本开启 Job ttlSecondsAfterFinished 自动清理机制

    前言 Kubernetes v1.23 之前,Job 在处于 Completed 后,默认是不会被清理的. 完成的 Job 通常不需要留存在系统中.在系统中一直保留它们会给 API 服务器带来额外的压 ...

  3. Nginx 之fastcgi常用配置项说明

    在LNMP环境中,我们都知道nginx如果要解析php脚本语言,就必须通过配置fastcgi模块来提供对php支持,那么在配置fastcgi的时候,关于fastcgi配置项的值应该怎么设置才能让其发挥 ...

  4. jquery submit 解决多次提交

    jquery submit 解决多次提交 web应用中常见的问题就是多次提交,由于表单提交的延迟,有时几秒或者更长,让用户有机会多次点击提交按钮,从而导致服务器端代码的种种麻烦. 为了解决这个问题,我 ...

  5. Linux下安装node及npm

    Linux下安装node 1.解压 $ tar zxf node-v8.9.0-linux-x64.tar.gz 2.移动到指定目录 $ mv node-v8.9.0-linux-x64 /usr/l ...

  6. 使用Python可视化莫比乌斯带

    引言 莫比乌斯带,这个名字或许大家都听过,但你知道它是什么吗?它是一种非常神奇的几何物体,只有一个面和一个边,乍一看,似乎是个不可思议的存在.今天,我们就来用 Python 轻松地可视化莫比乌斯带,一 ...

  7. BI工具革命派vs传统强者:DataFocus.ai与Tableau的终极对决

    1. 摘要 DataFocus.ai 作为新一代商业智能工具,强调基于搜索的分析方式,旨在让业务用户能够轻松进行数据探索.该平台集成了数据仓库,并侧重于赋能非技术人员进行自助式分析.其核心理念是通过自 ...

  8. jmeter性能测试案例:电商系统并发订单测试

    场景描述:本案例主要实现多用户同时提交订单,以检测系统对瞬时压力的响应情况.具体流程包括用户登录-添加商品-提交订单.涉及多个接口联动和参数处理,步骤如下: 第一步,登录用户 1.新建"下订 ...

  9. 超实用!用FunctionCall实现快递AI助手

    昨天晚上直播,我们用 RAG(Retrieval-Augmented Generation,检索增强生成)实现了数据库 AI 助手,今天我们准备换一个技术使用 function call 来实现快递 ...

  10. 快速开始 Mybatis TypeHandler

    theme: orange MyBatis TypeHandler是MyBatis框架中的举足轻重的组件之一,用于处理Java对象和数据库中的数据类型之间的转换. MyBatis TypeHandle ...