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. iperf 测试工具

    Iperf是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量.Iperf可以测量最大TCP带宽,具有多种参数和UDP特性. Iperf可以报告带宽,延迟抖动和数据包丢失.利用Iperf这 ...

  2. 非常全的VsCode快捷键

    按 Press 功能 Function Ctrl + Shift + P,F1 显示命令面板 Show Command Palette Ctrl + P 快速打开 Quick Open Ctrl + ...

  3. 自动化工具-ansible服务部署与使用

    1.前言 1.1ansible软件介绍 python 语言是运维人员必须会的语言 ansible 是一个基于python 开发的自动化运维工具 其功能实现基于ssh远程连接服务 ansible 可以实 ...

  4. 复旦大学2018--2019学年第一学期高等代数I期末考试情况分析

    一.期末考试成绩90分以上的同学(共21人) 周烁星(99).封清(99).叶雨阳(97).周子翔(96).王捷翔(96).张思哲(95).丁思成(94).陈宇杰(94).谢永乐(93).张哲维(93 ...

  5. objectarx 读取外部DWG图到当前图形

    void CTrimeDraw::MyReadDwgFile(CString str){ AcDbDatabase pExternalDb(Adesk::kFalse); // 外部图形数据库 if ...

  6. Java 问题定位工具 -- jps

    概览 最近老大布置的任务就是质量加固,偶然看到了一些对于 Java 性能分析的介绍,因此,有了此篇学习笔记. JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jCons ...

  7. unittest用例执行的顺序

    unittest在执行用例(test_xxx)时,并不是按从上到下的顺序执行,有特定的顺序. 示例: import unittest class TestBdd(unittest.TestCase): ...

  8. 封装json输出

    /** * 输出json * @param $msg * @param int $errno */ protected function printOutError($msg,$errno = 100 ...

  9. vim 复制粘贴

    首先进入块模式 Ctrl+ v 使用按键j/k/h/l进行选中多列 使用按键y进行复制 在insert模式下:使用按键p进行粘贴

  10. .net core创建控制台应用程序和mvc程序

    一.创建控制台应用程序 1.查看支持哪些类型:dotnet new --help 2.创建项目(先定位到需要创建的目录) dotnet new console -o ./myconsole 3.查看目 ...