题面

传送门

思路

其实就是很明显的平面图模型。

不咕咕咕的平面图学习笔记

用最左转线求出对偶图的点,以及原图中每个边两侧的点是谁

建立网络流图:

源点连接至每一个对偶图点,权值为这个区域的光明能量

每一个对偶图点连接至汇点,权值为这个区域的黑暗能量

对于每一条原图中的边,在它两侧的对偶图点之间连一条双向边,权值为这个边的代价

用所有点的光明能量和黑暗能量之和,减去最小割,得到的就是答案

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cassert>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#define next DEEP_DARK_FANTASY
#define mp make_pair
#define ll long long
using namespace std;
inline int read(){
int re=0,flag=1;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') flag=-1;
ch=getchar();
}
while(isdigit(ch)) re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return re*flag;
}
int n,m,T,x[100010],y[100010],light[100010],dark[100010],cnt;
vector<pair<int,int> >e[100010];
vector<pair<long double,int> >ee;
map<int,int>suf[100010],col[100010];
int suml[100010],sumd[100010];
namespace g{//当前弧dinic
int first[100010],cnte=-1;
struct edge{
int to,next,w;
}a[1000010];
inline void init(){memset(first,-1,sizeof(first));}
inline void add(int u,int v,int w1,int w2){
a[++cnte]=(edge){v,first[u],w1};first[u]=cnte;
a[++cnte]=(edge){u,first[v],w2};first[v]=cnte;
}
int dep[100010],cur[100010];queue<int>q;
inline bool bfs(int s,int t){
int i,u,v;
for(i=s;i<=t;i++) dep[i]=-1,cur[i]=first[i];
dep[s]=0;q.push(s);
while(!q.empty()){
u=q.front();q.pop();
for(i=first[u];~i;i=a[i].next){
v=a[i].to;if(~dep[v]||!a[i].w) continue;
dep[v]=dep[u]+1;q.push(v);
}
}
return ~dep[t];
}
inline int dfs(int u,int t,int lim){
if(u==t||!lim) return lim;
int i,v,f,flow=0;
for(i=cur[u];~i;i=a[i].next){
v=a[i].to;cur[u]=i;
if(dep[v]==dep[u]+1&&(f=dfs(v,t,min(a[i].w,lim)))){
a[i].w-=f;a[i^1].w+=f;
flow+=f;lim-=f;
if(!lim) return flow;
}
}
return flow;
}
inline int dinic(int s,int t){
int re=0;
while(bfs(s,t)) re+=dfs(s,t,1e9);
return re;
}
}
int main(){
T=read();n=read();m=read();int i,j,t1,t2,t3,tot,pos,from,next;
for(i=1;i<=n;i++){
x[i]=read();y[i]=read();
light[i]=read();dark[i]=read();
}
for(i=1;i<=m;i++){
t1=read();t2=read();t3=read();
e[t1].push_back(mp(t2,t3));
e[t2].push_back(mp(t1,t3));
}
for(i=1;i<=n;i++){
tot=e[i].size();ee.clear();
for(j=0;j<tot;j++){
ee.push_back(mp(atan2(y[e[i][j].first]-y[i],x[e[i][j].first]-x[i]),e[i][j].first));
}
sort(ee.begin(),ee.end());
for(j=0;j<tot-1;j++){//最左转线预处理:标记每一个点的后继
suf[i][ee[j].second]=ee[j+1].second;
}
if(tot) suf[i][ee[tot-1].second]=ee[0].second;
}
for(i=1;i<=n;i++){
for(j=0;j<e[i].size();j++){
pos=e[i][j].first;from=i;
if(col[i][pos]) continue;
cnt++;
col[i][pos]=cnt;
suml[cnt]+=light[pos];
sumd[cnt]+=dark[pos];
while(1){//求出一个区域
next=suf[pos][from];
if(col[pos][next]) break;
from=pos;pos=next;
col[from][pos]=cnt;
suml[cnt]+=light[pos];
sumd[cnt]+=dark[pos];
}
}
}
g::init();int ans=0;
for(i=1;i<=cnt;i++){
g::add(0,i,suml[i],0);
g::add(i,n<<1,sumd[i],0);
ans+=suml[i];ans+=sumd[i];
}
for(i=1;i<=n;i++){
for(j=0;j<e[i].size();j++){
t1=col[i][e[i][j].first];
t2=col[e[i][j].first][i];
if(i<e[i][j].first) g::add(t1,t2,e[i][j].second,e[i][j].second);
}
}
cout<<ans-g::dinic(0,n<<1)<<'\n';
}

[NOI.AC省选模拟赛3.31] 附耳而至 [平面图+最小割]的更多相关文章

  1. [NOI.AC省选模拟赛3.31] 星辰大海 [半平面交]

    题面 传送门 思路 懒得解释了......也是比较简单的结论 但是自己看到几何就退缩了...... 下周之内写一个计算几何的学习笔记! Code #include<iostream> #i ...

  2. NOI.AC省选模拟赛第一场 T1 (树上高斯消元)

    link 很容易对于每个点列出式子 \(f_{x,y}=(f_{x,y-1}+f_{x,y}+f_{x,y+1}+f_{x+1,y})/4\)(边角转移类似,略) 这个转移是相互依赖的就gg了 不过你 ...

  3. [NOI.AC省选模拟赛3.30] Mas的童年 [二进制乱搞]

    题面 传送门 思路 这题其实蛮好想的......就是我考试的时候zz了,一直没有想到标记过的可以不再标记,总复杂度是$O(n)$ 首先我们求个前缀和,那么$ans_i=max(pre[j]+pre[i ...

  4. [NOI.AC省选模拟赛3.23] 染色 [点分治+BFS序]

    题面 传送门 重要思想 真的是没想到,我很久以来一直以为总会有应用的$BFS$序,最终居然是以这种方式出现在题目中 笔记:$BFS$序可以用来处理限制点对距离的题目(综合点分树使用) 思路 本题中首先 ...

  5. [NOI.AC省选模拟赛3.23] 集合 [数学]

    题面 传送门 一句话题意: 给定$n\leq 1e9,k\leq 1e7,T\leq 1e9$ 设全集$U=\lbrace 1,2,3,...n\rbrace $,求$(min_{x\in S}\lb ...

  6. [noi.ac省选模拟赛]第12场题解集合

    题目 比赛界面. T1 数据范围明示直接\(O(n^2)\)计算,问题就在如何快速计算. 树上路径统计通常会用到差分方法.这里有两棵树,因此我们可以做"差分套差分",在 A 树上对 ...

  7. [noi.ac省选模拟赛]第10场题解集合

    题目 比赛界面. T1 不难想到,对于一个与\(k\)根棍子连接的轨道,我们可以将它拆分成\(k+1\)个点,表示这条轨道不同的\(k+1\)段. 那么,棍子就成为了点与点之间的边.可以发现,按照棍子 ...

  8. [noi.ac省选模拟赛]第11场题解集合

    题目   比赛界面. T1   比较简单.容易想到是求鱼竿的最大独立集.由于题目的鱼竿可以被分割为二分图,就可以想到最大匹配.   尝试建边之后会发现边的数量不小,但联系题目性质会发现对于一条鱼竿,它 ...

  9. [noi.ac省选模拟赛20200606]赌怪

    题目   点这里看题目. 分析   先特判掉\(K=2\)的情况.   首先可以考虑到一个简单 DP :   \(f(i)\):前\(i\)张牌的最大贡献.   转移可以\(O(n^2)\)地枚举区间 ...

随机推荐

  1. java 类装饰

    package TestIo; public class Test8 { public static void main(String[] args) { System.out.println(&qu ...

  2. 关于C++虚函数表的那些事儿

    前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛 ...

  3. 基于Docker的UI自动化初探

    本文来自网易云社区 前言 一直以来,项目迭代的时间都是比较紧张的,开发加班加点coding,测试加班加点提bug.都说"时间像海绵里的水,挤挤总会有的"(当然这里的"挤挤 ...

  4. Android 9 Pie震撼来袭 同步登陆WeTest

    WeTest 导读 2018年8月7日,Google对外发布最新 Android 9.0 正式版系统,并宣布系统版本Android P 被正式命名为代号“Pie”,最新系统已经正式推送包括谷歌Pixe ...

  5. 吴裕雄 python 机器学习——混合高斯聚类GMM模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import mixture from sklearn.metrics ...

  6. 浅谈如何提高自动化测试的稳定性和可维护性 (pytest&allure)

    装饰器与出错重试机制 谈到稳定性,不得不说的就是“出错重试”机制了,在自动化测试中,由于环境一般都是测试环境,经常会有各种各种的抽风情况影响测试结果,这样就为测试的稳定性带来了挑战,毕竟谁也不想自己的 ...

  7. Jmeter使用之:高效组织接口自动化用例技巧

    Jmeter怎么使用的文章多如牛毛,但怎么组织好测试用例,则几乎很难看到.在本文,我将把Jmeter下怎么组织测试用例的几点心得分享给大家,希望能给你一些帮助或启示. 1.善用“逻辑控制器”中的“简单 ...

  8. jmeter获取cookies

    使用场景:登录后,后续的请求操作需获取到JSESSIONID才可进行 1.将jmeter的bin目录下的jmeter.properties文件中的CookieManager.save.cookies= ...

  9. 查看python中包的文档

    核心命令:python -m pydoc 查询某包:python -m pydoc 包名 示例: C:\Users\xxx>python -m pydoc pydoc - the Python ...

  10. Dev c++ 调试步骤

    不能调试的时候,修改下列地方: 1.在“工具”->编译选项->”Add following commands when calling complier”下面的编辑框里写入:-g3 2.在 ...