LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)
题意
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 的游戏(最大流)的更多相关文章
- #505. 「LibreOJ β Round」ZQC 的游戏
题目描述 首先一定是让ZQC吃掉他能吃到的所有的球,这样才能尽可能的满足ZQC的质量是所有玩家中最大的. 在满足某一个玩家的质量不会超过ZQC的情况下,让这个玩家吃掉尽可能多的球,让其他玩家吃掉的尽可 ...
- LOJ#503. 「LibreOJ β Round」ZQC 的课堂(容斥+FHQTreap)
题面 传送门 题解 首先\(x\)和\(y\)两维互相独立,可以分开考虑,我们以\(x\)为例 我们把\(x\)做个前缀和,那么就是问有多少\(i\)满足\(s_is_{i-1}<0\),其中\ ...
- loj#501 「LibreOJ β Round」ZQC 的树列
分析 代码(我的代码是瞎jb水过去的) #include<bits/stdc++.h> using namespace std; #define li long long li a[]; ...
- loj#500 「LibreOJ β Round」ZQC 的拼图
分析 二分倍数 然后考虑dp[i][j]表示选到第i个x轴覆盖到j的情况y轴最多覆盖多少 贡献柿子可以画图然后相似三角形得到 代码 #include<bits/stdc++.h> usin ...
- [LOJ#500]「LibreOJ β Round」ZQC的拼图
题目 点这里看题目. 分析 首先不难发现答案具有单调性,因此可以二分答案.答案上限为\(V=2m\times \max\{a_i, b_i\}\). 考虑如何去判断当前的答案.设这个答案为 ...
- LOJ504「LibreOJ β Round」ZQC 的手办
https://loj.ac/problem/504 题解 对于区间取\(\max\),这个比较好办,直接在线段树上打标记就行了. 如果让我们弹出前\(n\)个数,我们可以用类似超级钢琴的思想,队列中 ...
- 「LibreOJ β Round」ZQC 的手办
https://loj.ac/problem/504 一类套路题. 首先这个玩意可以两个logn树套树做.... naive地,把区间内的所有数拿出来放进堆里.不断取出. 太多了. 所以开始只保留那初 ...
- #503. 「LibreOJ β Round」ZQC 的课堂 容斥原理+Treap
题目: 题解: 比较容易发现 : \(x,y\) 的贡献是独立的. 所以可以分开考虑. 假设我们考虑 \(x\).向量在 \(x\) 方向的投影依次是 : \(\{a_1,a_2, ... ,a_n\ ...
- [LOJ#531]「LibreOJ β Round #5」游戏
[LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...
随机推荐
- D15——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D15 20180926内容纲要: 1.CSS介绍 2.CSS的四种引入方式 3.CSS选择器 4.CSS常用属性 5.小结 6.练习 1 CSS介绍 层叠样式表 ...
- System.Threading.ThreadAbortException: 正在中止线程
症状 如果使用 Response.End.Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAbortException 异常.您可以使用 try-ca ...
- Python Web框架 tornado 异步原理
Python Web框架 tornado 异步原理 参考:http://www.jb51.net/article/64747.htm 待整理
- (转)Python3之shutil模块
原文:https://www.cnblogs.com/wang-yc/p/5625046.html 一. 简介 shutil 是高级的文件,文件夹,压缩包处理模块. 二. 使用 shutil.copy ...
- Windows 8.1 GetVersionEx返回6.2.9200 的问题!
http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx http://tunps.com/getversionex- ...
- Android:异步处理之AsyncTask的应用(二)
前言 在上一篇文章中<Android:异步处理之Handler+Thread的应用(一)>,我们知道Android的UI主线程主要负责处理用户的按键事件.用户的触屏事件以及屏幕绘图事件等: ...
- php -- 数据库信息
----- 023-dbinfo.php ----- <!DOCTYPE html> <html> <head> <meta http-equiv=" ...
- JavaScript -- Window-Interval
-----031-Window-Interval.html----- <!DOCTYPE html> <html> <head> <meta http-equ ...
- 【原创】Jquery初体验二
快速导航 一.传统方式生成Table 二.使用jquery.tmpl插件快速生成Table 三.Jquery中的操作class的几个方法 四:jq里面的克隆 五:属性过滤器 六:表单元素过滤器 一.传 ...
- spring mvc 404页面制作
1.404页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...