题意简述

给你一个三维的坐标系,坐标系上 \((x_i+y_i+z_i)\bmod 3 = 0\) 的点内有能量源。给定 \(n\) 个点含有能量值为 \(c_i\) 的水晶,如果一个水晶位于能量源上,这个水晶的能量值将会提高 \(10\%\)。

水晶有两种共振情况,一是相邻的三个水晶共振,二是两个水晶在一条长度为 \(2\) 的线段两端,且线段中点是能量源。

你可以炸掉一些水晶,请问没有共振之后剩余水晶的最大能量值。

做法

对于 \((x_i+y_i+z_i)\bmod 3 \not = 0\) 的点黑白染色,如果一个能量源的周围同时存在黑白两种颜色的点,那么必定构成共振,如图所示

于是我们可以把 \(\bmod 3\) 意义下的三种点分别拆点。考虑对于每个共振,要用最小代价破坏,显然是一个最小割的模型。把每个点拆点,边权为水晶的能量值 \(c_i\) 。然后源点连 \(1\) 的点,\(1\) 连 \(0\),\(0\) 连 \(2\),\(2\) 连 汇点,答案为水晶的总能量 \(\sum c_i\) 减最大流。这里给出代码实现:

const int inf=1e9;
inline void link(int a,int b,int c)
{
add_edge(S,a<<1,inf);add_edge(a<<1|1,b<<1,inf);
add_edge(b<<1|1,c<<1,inf);add_edge(c<<1|1,T,inf);
}

然后我们用一个结构体来表示每一个点,将\((x_i,y_i,z_i)\)转换为\((x_i-z_i,y_i-z_i)\),用一个向量的结构体来封存,重载<+预算符,用一个map来对向量进行操作,本题就结束了。

代码实现

map常数大跑不快,但是很好写。

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
#define ak *
#define in inline
#define db double
in char getch()
{
static char buf[1<<12],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<12,stdin),p1==p2)?EOF:*p1++;
}
char qwq;
#define gc() getchar()
in int read()
{
re cz=0,ioi=1;qwq=gc();
while(qwq<'0'||qwq>'9') ioi=qwq=='-'?~ioi+1:1,qwq=gc();
while(qwq>='0'&&qwq<='9') cz=(cz<<3)+(cz<<1)+(qwq^48),qwq=gc();
return cz ak ioi;
}
const int N=5e4+5,inf=1e9;
int n,m,h[N<<1],cnt=1,dis[N<<1],s,t,q[N<<1],l,r,cur[N<<1],tot,sum;
struct did{int next,to,f;}e[N*20];
in void add(re x,re y,re z)
{
e[++cnt]=(did){h[x],y,z},h[x]=cnt;
e[++cnt]=(did){h[y],x,0},h[y]=cnt;
}
const db eps=1e-9;
inline int bfs(re u)
{
memset(dis,-1,sizeof(dis));dis[u]=0;
l=r=0;q[++r]=u;
while(l<r)
{
re i=q[++l]; if(i==t) return 1;
for(re j=h[i],k;k=e[j].to,j;j=e[j].next)
if(dis[k]<0&&e[j].f) dis[k]=dis[i]+1,q[++r]=k;
}
return 0;
}
in int dfs(re u,re maxf)
{
re res=0;
if(u==t||!maxf) return maxf;
for(re &i=cur[u],v;v=e[i].to,i;i=e[i].next)
if(e[i].f&&dis[v]==dis[u]+1)
{
re delta=dfs(v,min(maxf,e[i].f));
e[i].f-=delta;e[i^1].f+=delta;
res+=delta;maxf-=delta;
if(!maxf) return res;
}
if (fabs(maxf-res)<eps) dis[u]=-2;
return res;
}
inline int dinic()
{
re ans=0;
while(bfs(s)) memcpy(cur,h,sizeof(h)),ans+=dfs(s,inf);
return ans;
}
struct poi //poipoi qwq~
{
int x,y;
poi (re a=0,re b=0) {x=a,y=b;}
in bool operator < (poi a) const {return x==a.x?y<a.y:x<a.x;}
in poi operator + (poi a) const {return poi(x+a.x,y+a.y);}
}p[N];
map<poi,int>mp,ext,f,book;
in void link(re a,re b,re c)
{
if(!book[poi(s,a)]) add(s,a<<1,inf),book[poi(1,a)]=1;
if(!book[poi(a,b)]) add(a<<1|1,b<<1,inf),book[poi(a,b)]=1;
if(!book[poi(b,c)]) add(b<<1|1,c<<1,inf),book[poi(b,c)]=1;
if(!book[poi(c,t)]) add(c<<1|1,t,inf),book[poi(c,a)]=1;
}
int main()
{
n=read();
for(re i=1;i<=n;i++)
{
re x=read(),y=read(),z=read(),c=read();
p[i]=poi(x-z,y-z);if(!ext[p[i]]) ext[p[i]]=++tot;
mp[p[i]]+=c;f[p[i]]=((x+y+z)%3==0);
}
s=1,t=tot+1<<1;
for(re i=1;i<=n;i++) if(f[p[i]]<2)
{
re pt=ext[p[i]],ene=mp[p[i]]*(10+f[p[i]]);sum+=ene;
add(2*pt,2*pt+1,ene);if(!f[p[i]]) {f[p[i]]=2;continue;}
static int a[N],b[N];re na=0,nb=0;f[p[i]]=2;
if(!(a[++na]=ext[p[i]+poi(0,1)])) na--;
if(!(a[++na]=ext[p[i]+poi(1,0)])) na--;
if(!(a[++na]=ext[p[i]+poi(-1,-1)])) na--;
if(!(b[++nb]=ext[p[i]+poi(0,-1)])) nb--;
if(!(b[++nb]=ext[p[i]+poi(-1,0)])) nb--;
if(!(b[++nb]=ext[p[i]+poi(1,1)])) nb--;
for(re x=1;x<=na;x++)
for(re y=1;y<=nb;y++)
link(a[x],pt,b[y]);
}
printf("%.1lf",(db)(sum-dinic())/10);
return 0;
}

BZOJ4625 [BJOI2016]水晶 最小割的更多相关文章

  1. 【BZOJ-1976】能量魔方Cube 最小割 + 黑白染色

    1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 884  Solved: 307[Submi ...

  2. Bzoj 1976: [BeiJing2010组队]能量魔方 Cube 最小割,最大流

    1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 879  Solved: 304[Submi ...

  3. [bzoj4625][BeiJing2016]水晶

    来自FallDream的博客,未经允许,请勿转载,谢谢. 不用惊慌,今天的题都不是小强出的.——融入了无数心血的作品,现在却不得不亲手毁掉,难以体会他的心情啊 .——那也是没有办法的事情,能量共振不消 ...

  4. 【BZOJ1976】能量魔方 [最小割]

    能量魔方 Time Limit: 10 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description 小C 有一个能量魔方,这个魔方可神奇 ...

  5. 【BZOJ1976】[BeiJing2010组队]能量魔方 Cube 最小割

    [BZOJ1976][BeiJing2010组队]能量魔方 Cube Description 小C 有一个能量魔方,这个魔方可神奇了,只要按照特定方式,放入不同的 能量水晶,就可以产生巨大的能量. 能 ...

  6. 【bzoj1976】[BeiJing2010组队]能量魔方 Cube 网络流最小割

    题目描述 一个n*n*n的立方体,每个位置为0或1.有些位置已经确定,还有一些需要待填入.问最后可以得到的 相邻且填入的数不同的点对 的数目最大. 输入 第一行包含一个数N,表示魔方的大小. 接下来 ...

  7. BZOJ 1391: [Ceoi2008]order [最小割]

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1509  Solved: 460[Submit][Statu ...

  8. BZOJ-2127-happiness(最小割)

    2127: happiness(题解) Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1806  Solved: 875 Description 高一 ...

  9. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

随机推荐

  1. loj#6034 「雅礼集训 2017 Day2」线段游戏

    分析 区间李超树板子题 代码 #include<bits/stdc++.h> using namespace std; #define db double const int inf = ...

  2. (C++C#类型互转工具)使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明

    在网上看到很多网友在.NET程序中调用Win32 API,或者调用自己的VC DLL里面提供的函数的时候,总是被生成正确的C函数在C#中的正确声明而困扰,而生成C++中结构体在C#中的声明 - 天,没 ...

  3. RabbitMQ安装及其中遇到的问题解决方案

    参考官方文档:https://www.rabbitmq.com/install-debian.html#apt 第一步: # import PackageCloud signing key wget ...

  4. Apache hadoop namenode ha和yarn ha ---HDFS高可用性

    HDFS高可用性Hadoop HDFS 的两大问题:NameNode单点:虽然有StandbyNameNode,但是冷备方案,达不到高可用--阶段性的合并edits和fsimage,以缩短集群启动的时 ...

  5. Spring MVC对日期处理的不友好问题

    一.后台日期类型解析到前端 1.在springmvc的配置文件中添加这个.annotation-driven在配置文件中只配置一次     (此方法全局作用)<mvc:annotation-dr ...

  6. python 爬虫入门1 爬取代理服务器网址

    刚学,只会一点正则,还只能爬1页..以后还会加入测试 #coding:utf-8 import urllib import urllib2 import re #抓取代理服务器地址 Key = 1 u ...

  7. codeforces 1186C Vus the Cossack and Strings

    题目链接:https://codeforc.es/contest/1186/problem/C 题目大意:xxxxx(自认为讲不清.for instance) 例如:a="01100010& ...

  8. tensorflow2.0 numpy.ndarray 与tenor直接互转

    1.代码参考 import numpy as npimport tensorflow as tf a = np.random.random((5,3)) b = np.random.randint(0 ...

  9. Java中字母大小写的转换

    例:String str = "AbC"; 把字符串所有字母变成小写: System.out.println(str.toLowerCase()); 把字符串所有字母大写: Sys ...

  10. C#方法名前的方括号

    1.序列化:[Serializable]public void 方法名(){...} 2.WebServices方法:[WebMethod]public void 方法名(){...} 3.Ajax( ...