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. Ubuntu查看crontab运行日志

    Ubuntu服务器/var/log下没有cron日志,这里记录一下如何ubuntu server如何查看crontab日志 crontab记录日志修改rsyslogsudo vim /etc/rsys ...

  2. 2019-泰迪杯c题数据处理,WGS-84(世界标准地理坐标系) 转为 BD-09(百度地理坐标系)

    2019-泰迪杯c题数据处理,WGS-84(世界标准地理坐标系) 转为 BD-09(百度地理坐标系) 本次泰迪杯的数据为经纬度数据,并且题目给的是WGS-84(世界标准地理坐标系)格式的,所有如果调用 ...

  3. 关于C#的Main(String[] args)参数输入问题

    关于C#的Main(String[] args)参数输入问题 指定相关的测试代码 首先,写一个用于测试的关于Main(String[] args)参数输入有关的代码类,如下: using System ...

  4. server.Transfer不工作

    https://www.codeproject.com/Questions/56736/How-to-use-Server-Transfer-from-Ajax-UpdatePanel For Ser ...

  5. 何给域名配置https证书

    原文链接:https://www.cnblogs.com/ymwang/p/6893105.html http和https的区别就是,后者在网络传输过程中会很安全,原因就是给http安装了SSL证书. ...

  6. visual编译通过后,debug报错找不到*.dll

    解决: 在debug目录下放入*.dll

  7. MySQL卸载安装8.0.*

    一.卸载 1. 本人安装目录在C盘Program Files文件中(删除MySQL文件夹) 2. 找到C盘Program Data隐藏文件夹中的MySQL并删除(删除提示MySQL在运行的话可以去任务 ...

  8. shell 获得后台进程返回值

    获得后台进程返回值我们用“&”把进程放入后台以后,如果需要了解进程的执行情况,可以使用wait函数.默认情况下wait会等待任意子进程结束但是不会返回子进程的返回值.而以子进程的pid作为参数 ...

  9. git pull 撤销误操作

    本来想把github上的release合并到本地的release分支上,由于没有查看当前分支,直接运用git pull origin v2.8.1,结果将release合并到了v2.8.1分支中. 解 ...

  10. ps使用经验