Problem

每个点都可以选择降落士兵,然后当一个点的子节点被攻占的数量超过读入中的限制后,这个城市也被占领。

每个点降落士兵都有一定的代价,问把这一个图全部攻占的最小代价。

Solution

这显然和儿子有关还与父亲有关

我们假设f[x]表示x在父亲之前被攻占,g[x]表示x再父亲之后被攻占

显然有f[x]>=g[x]

在x放兵时,f[x]=g[x]=p[x]+∑gv

当x不放兵时,显然是在其儿子里选c[x]个取f[x](计算g[x]时为c[x]-1),剩下的取g[x]。排序即可。

Notice

感觉不是很好理解

Code

#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define sqz main
#define ll long long
#define reg register int
#define rep(i, a, b) for (reg i = a; i <= b; i++)
#define per(i, a, b) for (reg i = a; i >= b; i--)
#define travel(i, u) for (reg i = head[u]; i; i = edge[i].next)
const int INF = 1e9, N = 5e4;
const double eps = 1e-6, phi = acos(-1);
ll mod(ll a, ll b) {if (a >= b || a < 0) a %= b; if (a < 0) a += b; return a;}
ll read(){ ll x = 0; int zf = 1; char ch; while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if (ch == '-') zf = -1, ch = getchar(); while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); return x * zf;}
void write(ll y) { if (y < 0) putchar('-'), y = -y; if (y > 9) write(y / 10); putchar(y % 10 + '0');}
vector<int> edge[N + 5];
ll Val[N + 5], f[N + 5], g[N + 5];
int Limit[N + 5];
int cmp(int x, int y)
{
return f[x] - g[x] < f[y] - g[y];
}
void dfs(int u, int fa)
{
for (auto i = edge[u].begin(); i != edge[u].end(); i++)
if (*i == fa) i = edge[u].erase(i) - 1;
else dfs(*i, u);
}
void dp(int u)
{
ll T = 0;
for (auto i : edge[u]) dp(i), T += g[i];
f[u] = g[u] = Val[u] + T;
sort(edge[u].begin(), edge[u].end(), cmp);
int p = edge[u].size();
rep(i, 0, min(p, Limit[u] - 1) - 1) T += f[edge[u][i]] - g[edge[u][i]];
if (Limit[u] - 1 <= edge[u].size()) g[u] = min(g[u], T);
if (Limit[u] <= edge[u].size()) f[u] = min(f[u], T + f[edge[u][Limit[u] - 1]] - g[edge[u][Limit[u] - 1]]);
}
int sqz()
{
int H_H = read();
while (H_H--)
{
memset(f, 0, sizeof f);
memset(g, 0, sizeof g);
int n = read();
rep(i, 1, n) edge[i].clear();
rep(i, 1, n - 1)
{
int u = read(), v = read();
edge[u].push_back(v);
edge[v].push_back(u);
}
rep(i, 1, n) Val[i] = read();
rep(i, 1, n) Limit[i] = read();
dfs(1, 0);
dp(1);
write(f[1]); puts("");
}
return 0;
}

[CodeChef-CAPTCITI]Snakes capturing the Mongoose Cities的更多相关文章

  1. CodeChef Consecutive Snakes 三分(整数)

    题意 在年度阅兵中,所有的士兵蛇都在阅兵场集合了,但这些蛇的站位不对.整场阅兵必须能从主席台看清楚,所有蛇都应该站成一排.但这些士兵非常懒惰,你必须指挥士兵重新排队,使得所有人的移动距离之和最短. 形 ...

  2. mongoose - 让node.js高效操作mongodb

    Mongoose库简而言之就是在node环境中操作MongoDB数据库的一种便捷的封装,一种对象模型工具,类似ORM,Mongoose将数据库中的数据转换为JavaScript对象以供你在应用中使用. ...

  3. 在mongoose中使用$match对id失效的解决方法

    Topic.aggregate( //{$match:{_id:"5576b59e192868d01f75486c"}}, //not work //{$match:{title: ...

  4. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1288  Solved: 490 ...

  5. Mongo基础使用,以及在Express项目中使用Mongoose

    MongoDB的基本使用 MongoDB特点: 使用BSON存储数据 支持相对丰富的查询操作(相对其他nosql数据库) 支持索引 副本集(支持多个实例/多个服务器运行同个数据库) 分片(数据库水平扩 ...

  6. mongoose数据库连接和操作

    var mongoose = require('mongoose') mongoose.connect('mongodb://localhost:27017/hometown'); var db = ...

  7. mongoose 和 mongoDB

    第三方学习地址:http://blog.csdn.net/foruok/article/details/47746057 下载mongoDB https://www.mongodb.com/downl ...

  8. Nodejs之MEAN栈开发(三)---- 使用Mongoose创建模型及API

    继续开扒我们的MEAN栈开发之路,前面两节我们学习了Express.Jade引擎并创建了几个静态页面,最后通过Heroku部署了应用. Nodejs之MEAN栈开发(一)---- 路由与控制器 Nod ...

  9. Mongoose Schemas定义中timestamps选项的妙用

    在Node.js中使用MongoDB少不了Mongoose. 假设有如下Mongoose Schemas的定义: var ItemSchema = new mongoose.Schema({ biz: ...

随机推荐

  1. CentOS 7离线安装CDH 5.16.1完全指南(含各种错误处理)

    安装包下载 1.CM软件包下载 从http://archive.cloudera.com/cm5/redhat/7/x86_64/cm/5.16.1/RPMS/x86_64/下载rpm包,如下: 其实 ...

  2. Java实训作业1

    1.编写程序:声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果 2.编写程序:从键盘输入圆的半径,计算圆的面积并输出. 3.编写程序:实现一个数字加密器.运行时输入加密 ...

  3. elasticsearch-mapping字段重要属性

    https://blog.csdn.net/gongpulin/article/details/78705205

  4. Python3 tkinter基础 Text image 文本框中插入图片

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  5. 论文笔记:DARTS: Differentiable Architecture Search

    DARTS: Differentiable Architecture Search 2019-03-19 10:04:26accepted by ICLR 2019 Paper:https://arx ...

  6. Qt如何实现不规则弹窗

    1.无边框: 2.放图: 3.重写鼠标函数(问题是:怎么确定不规则弹窗的响应范围?挖坑待填)

  7. python笔记--socket编程

    socket编程 osi七层模型 socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族 ...

  8. 必会SQL练习题

    ()表名:购物信息 购物人 商品名称 数量 A 甲 B 乙 C 丙 A 丁 B 丙 …… 给出所有购入商品为两种或两种以上的购物人记录 答:); ()表名:成绩表 姓名 课程 分数 张三 语文 张三 ...

  9. Python开发 基础篇

    2019-02-01 产生验证码: 用户输入的值和显示的值相同时显示Correct,否则继续生成随机验证码等待用户输入 def check_code(): import random checkcod ...

  10. rtf乱码解决办法

    首先,阐述下rtf,富文本格式文档,目前常用来做模板: 我遇到的问题是rtf中替换后的文本显示是正常的,rtf直接转pdf就不正常了,通过notpad++ 打开后发现rtf本身内容编码是我没有见过的( ...