题意

题目链接

Sol

首先把第一个人能吃掉的食物删掉

然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了

判断一下最后的最大流是否等于重量和

注意一个非常恶心的地方是需要把除1外所有人都吃不到的食物删掉

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10, INF = 1e9 + 10;
int sqr(int x) {return x * x;}
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, S, T, deep[MAXN], cur[MAXN], vis[MAXN];
struct Edge {
int u, v, f, nxt;
}E[MAXN];
int head[MAXN], num;
void add_edge(int x, int y, int f) {E[num] = (Edge) {x, y, f, head[x]}; head[x] = num++;}
inline void AddEdge(int x, int y, int f) {add_edge(x, y, f); add_edge(y, x, 0);}
int x[MAXN], y[MAXN], w[MAXN], r[MAXN], fx[MAXN], fy[MAXN], fw[MAXN], flag[MAXN];
void init() {
S = 0; T = 233333; num = 0;
memset(vis, 0, sizeof(vis));
memset(head, -1, sizeof(head));
memset(flag, 0, sizeof(flag));
}
bool check(int a, int b) {return (sqr(x[a] - fx[b]) + sqr(y[a] - fy[b]) <= sqr(r[a]));}
bool BFS() {
queue<int>q; q.push(S);
memset(deep, 0, sizeof(deep));
deep[S] = 1;
while(q.size() != 0) {
int p = q.front(); q.pop();
for(int i = head[p]; i != -1; i = E[i].nxt) {
if(E[i].f && !deep[E[i].v]) {
deep[E[i].v] = deep[p] + 1;
if(E[i].v == T) return deep[T];
q.push(E[i].v);
}
}
}
return deep[T];
}
int DFS(int x, int flow) {
if(x == T) return flow;
int ansflow = 0;
for(int &i = cur[x]; i != -1; i = E[i].nxt) {
if(deep[E[i].v] == deep[x] + 1 && E[i].f) {
int canflow = DFS(E[i].v, min(E[i].f, flow));
flow -= canflow;
E[i].f -= canflow; E[i ^ 1].f += canflow;
ansflow += canflow;
if(flow <= 0) break;
}
}
return ansflow;
}
int Dinic() {
int ans = 0;
while(BFS()) {
memcpy(cur, head, sizeof(head));
ans += DFS(S, INF);
}
return ans;
}
void solve() {
init();
N = read(); M = read();
for(int i = 1; i <= N; i++) x[i] = read(), y[i] = read(), w[i] = read(), r[i] = read();
for(int i = 1; i <= M; i++) fx[i] = read(), fy[i] = read(), fw[i] = read();
int Lim = w[1], ned = 0;
for(int i = 1; i <= M; i++)
if(check(1, i)) Lim += fw[i], flag[i] = 1;
else ned += fw[i];
for(int i = 2; i <= N; i++) {
AddEdge(S, i, Lim - w[i]);///还能再吃这些食物
if(Lim - w[i] <= 0) {puts("qaq"); return ;}
for(int j = 1; j <= M; j++)
if(!flag[j] && check(i, j)) AddEdge(i, j + N, INF), vis[j] = 1;
}
for(int i = 1; i <= M; i++) {
if(!flag[i]) AddEdge(i + N, T, fw[i]);
if(!vis[i]) ned -= fw[i];//谁都吃不到
}
puts(Dinic() >= ned ? "ZQC! ZQC!" : "qaq");
}
signed main() {
for(int T = read(); T; T--, solve());
return 0;
}
/*
2
3 2
0 0 1 10
10 0 1 10
20 0 1 10
5 0 2
15 0 4
3 2
0 0 1 10
10 0 1 10
20 0 1 10
5 0 2
15 0 5
*/

LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)的更多相关文章

  1. #505. 「LibreOJ β Round」ZQC 的游戏

    题目描述 首先一定是让ZQC吃掉他能吃到的所有的球,这样才能尽可能的满足ZQC的质量是所有玩家中最大的. 在满足某一个玩家的质量不会超过ZQC的情况下,让这个玩家吃掉尽可能多的球,让其他玩家吃掉的尽可 ...

  2. LOJ#503. 「LibreOJ β Round」ZQC 的课堂(容斥+FHQTreap)

    题面 传送门 题解 首先\(x\)和\(y\)两维互相独立,可以分开考虑,我们以\(x\)为例 我们把\(x\)做个前缀和,那么就是问有多少\(i\)满足\(s_is_{i-1}<0\),其中\ ...

  3. loj#501 「LibreOJ β Round」ZQC 的树列

    分析 代码(我的代码是瞎jb水过去的) #include<bits/stdc++.h> using namespace std; #define li long long li a[]; ...

  4. loj#500 「LibreOJ β Round」ZQC 的拼图

    分析 二分倍数 然后考虑dp[i][j]表示选到第i个x轴覆盖到j的情况y轴最多覆盖多少 贡献柿子可以画图然后相似三角形得到 代码 #include<bits/stdc++.h> usin ...

  5. [LOJ#500]「LibreOJ β Round」ZQC的拼图

    题目   点这里看题目. 分析   首先不难发现答案具有单调性,因此可以二分答案.答案上限为\(V=2m\times \max\{a_i, b_i\}\).   考虑如何去判断当前的答案.设这个答案为 ...

  6. LOJ504「LibreOJ β Round」ZQC 的手办

    https://loj.ac/problem/504 题解 对于区间取\(\max\),这个比较好办,直接在线段树上打标记就行了. 如果让我们弹出前\(n\)个数,我们可以用类似超级钢琴的思想,队列中 ...

  7. 「LibreOJ β Round」ZQC 的手办

    https://loj.ac/problem/504 一类套路题. 首先这个玩意可以两个logn树套树做.... naive地,把区间内的所有数拿出来放进堆里.不断取出. 太多了. 所以开始只保留那初 ...

  8. #503. 「LibreOJ β Round」ZQC 的课堂 容斥原理+Treap

    题目: 题解: 比较容易发现 : \(x,y\) 的贡献是独立的. 所以可以分开考虑. 假设我们考虑 \(x\).向量在 \(x\) 方向的投影依次是 : \(\{a_1,a_2, ... ,a_n\ ...

  9. [LOJ#531]「LibreOJ β Round #5」游戏

    [LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...

随机推荐

  1. [转]php实时输出内容

    b开发中有没有碰到需要适时的将结果输出到浏览器页面而不刷新整个页面的需求呢?当你在处理一个过程需要耗时很长,但你又需要适时的知道程序当前的处理状况的时候,该怎么办呢?下面就分享一下如何使用php及时的 ...

  2. 关于配置 TeamCity 清理历史 artifacts 问题

    使用 CI 一段时间后,artifacts 占用的磁盘会很大,可以配置保留多少天的 artifacts,具体如下: Administration Click the Edit link for any ...

  3. StreamSets学习系列之StreamSets的集群安装(图文详解)

    不多说,直接上干货! 若是集群安装 需要在对应节点执行相同的操作. 见 StreamSets学习系列之StreamSets支持多种安装方式[Core Tarball.Cloudera Parcel . ...

  4. Git笔记:Git介绍和常用命令汇总

    Git 是一个开源的分布式版本控制系统,与 CVS, Subversion 等不同,它采用了分布式版本库的方式,不需要服务器端软件支持. 工作流程 Git 的工作流程大致如下: 克隆 Git 资源作为 ...

  5. java学习--高效的除模取余运算(n-1)&hash

    没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存中进行计算,然后 ...

  6. mysql delimiter的说明

    默认情况下,mysql解释器一遇到分号(;),它就要自动执行. 不会等到用户把这些语句全部输入完之后,再执行整段语句. 而自定义函数和存储过程的SQL语句有好多行,且语句中包含有分号,为了保证整段语句 ...

  7. Solidity的自定义结构体深入详解

    一.结构体定义 结构体,Solidity中的自定义类型.我们可以使用Solidity的关键字struct来进行自定义.结构体内可以包含字符串,整型等基本数据类型,以及数组,映射,结构体等复杂类型.数组 ...

  8. 【详解】JNI (Java Native Interface) (三)

    案例三:C代码访问Java对象的实例变量   获取对象的实例变量的步骤: 1. 通过GetObjectClass()方法获得此对象的类引用 2. 通过类引用的GetFieldID()方法获得实例变量的 ...

  9. new Thread与线程创建

    概要:new Thread 并不意味着已经创建了一个线程,只能说明创建一个类的对象实例而已.而真正创建线程的是start()方法,此方法将调用本地方法start0()创建本地线程,而Thread的ru ...

  10. TDSQL“相似查询工具MSQL+”入选VLDB论文

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 作者介绍:王晓宇,腾讯数据库TDSQL团队成员,目前参与TDSQL数据库内核研发工 ...