#网络流,树状数组#JZOJ 4020 Revolution with JZOJ 4018 Magic
CF297E Mystic Carvings=JZOJ 4018 Magic
JZOJ 4020 Revolution
题目
有一个\(n*m(n,m\leq 20)\)的网格图
这格子有收益当且仅当上下左右都被投资或者自身被投资,
问最多能赚多少
分析
一看就是最小割,但是实际建图比较难搞,因为还有相邻这种建图
那可以奇偶性建图,收益\((i,j)\)连源点\((i+j=even)\),收益\((x,y)\)连汇点\(x+y=odd\)
投资\((i',j')\)连\((i,j)\),投资\((x',y')\)连\((x,y)\),相邻因为两种点都有可能,所以要交错连接一条无限大的边
代码
#include <cstdio>
#include <cctype>
#include <queue>
#define rr register
#define ide(i,j) ((i-1)*m+j)
using namespace std;
const int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
const int inf=707406378; struct node{int y,w,next;}e[10011];
int ls[821],dis[821],cost[21][21],reward[21][21],n,m,k=1,s,t,ans;
inline void add(int x,int y,int w){
e[++k]=(node){y,w,ls[x]}; ls[x]=k;
e[++k]=(node){x,0,ls[y]}; ls[y]=k;
}
inline signed bfs(int s){
for (rr int i=1;i<=t;++i) dis[i]=0;
rr queue<int>q; q.push(s); dis[s]=1;
while (q.size()){
rr int x=q.front(); q.pop();
for (rr int i=ls[x];i;i=e[i].next)
if (e[i].w>0&&!dis[e[i].y]){
dis[e[i].y]=dis[x]+1;
if (e[i].y==t) return 1;
q.push(e[i].y);
}
}
return 0;
}
inline signed dfs(int x,int now){
if (x==t||!now) return now;
rr int rest=0,f;
for (rr int i=ls[x];i;i=e[i].next)
if (e[i].w>0&&dis[e[i].y]==dis[x]+1){
rest+=(f=dfs(e[i].y,min(now-rest,e[i].w)));
e[i].w-=f; e[i^1].w+=f;
if (now==rest) return rest;
}
if (!rest) dis[x]=0;
return rest;
}
signed main(){
scanf("%d%d",&n,&m),s=n*m*2+1,t=s+1;
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=m;++j){
rr char c=getchar();
while (!isalnum(c)) c=getchar();
if (isdigit(c)) cost[i][j]=c^48;
else if (islower(c)) cost[i][j]=c-87;
else cost[i][j]=c-29;
}
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=m;++j){
rr char c=getchar();
while (!isalnum(c)) c=getchar();
if (isdigit(c)) reward[i][j]=c^48;
else if (islower(c)) reward[i][j]=c-87;
else reward[i][j]=c-29;
ans+=reward[i][j];
}
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=m;++j)
if ((i^j)&1){
add(s,ide(i,j)+n*m,cost[i][j]);
add(ide(i,j)+n*m,ide(i,j),reward[i][j]);
for (rr int k=0;k<4;++k){
rr int x=i+dx[k],y=j+dy[k];
if (x<1||x>n||y<1||y>m) continue;
add(ide(i,j),ide(x,y)+n*m,inf);
add(ide(i,j)+n*m,ide(x,y),inf);
}
}else add(ide(i,j),ide(i,j)+n*m,reward[i][j]),
add(ide(i,j)+n*m,t,cost[i][j]);
while (bfs(s)) ans-=dfs(s,inf);
return !printf("%d",ans);
}
JZOJ 4018 Magic
题目
有一个圆,圆上有\(2*n\)个点按顺序编号,圆内有\(n\)条弦,这些弦不相交于圆上,
选取三根弦,这六个点顺次连接变成一个正六边形的形状,把三条弦重新连接,
如果这个新的六边形关于正六边形外接圆的圆心中心对称,那么即为一种方案,问共有多少种方案
分析

分类讨论,
首先答案就是前两种的总和,显然不好处理
那就用总方案\(C(n,3)\)减去后三种,用树状数组求出当前边的左边的边个数\(x\),
就可以求出与该边相交的边个数\(z\),用\(n-1\)减去这两种边就是当前边右边的边\(y\)
首先第三种情况就是\(x*y\),第四五种情况都是\((x+y)*z\),因为会算重,所以要除以2
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
int n,f[200011],c[200011]; long long ans,ans1;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void update(int x){for (;x<=n;x+=-x&x) ++c[x];}
inline signed query(int x){rr int ans=0; for (;x;x-=-x&x) ans+=c[x]; return ans;}
signed main(){
n=iut();
for (rr int i=1,x;i<=n;++i)
x=iut(),f[f[x]=iut()]=x;
ans=1ll*n*(n-1)*(n-2)/6,n<<=1;
for (rr int i=1,cnt=0;i<=n;++i)
if (i>f[i]){
rr int x=cnt-query(f[i]-1),z=i-f[i]-1-x*2,y=n/2-1-x-z;
update(f[i]),++cnt,ans-=1ll*x*y,ans1+=1ll*(x+y)*z;
}
return !printf("%lld",ans-ans1/2);
}
#网络流,树状数组#JZOJ 4020 Revolution with JZOJ 4018 Magic的更多相关文章
- D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]
题目描述 Koishi喜欢线段. 她的条线段都能表示成数轴上的某个闭区间.Koishi喜欢在把所有线段都放在数轴上,然后数出某些点被多少线段覆盖了. Flandre看她和线段玩得很起开心,就抛给她一个 ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- bzoj1878--离线+树状数组
这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...
- codeforces 597C C. Subsequences(dp+树状数组)
题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
- 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组
E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
- 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 508 Solved: 158[Submit][Sta ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
随机推荐
- android 逆向笔记
壳检测工具 GDA 2. 逆向分析APP 一般流程 1. 使用自动化检测工具检测APP是否加壳,或者借助一些反编译工具依靠经验判断是否加壳 2. 如果apk加壳,则需要先对apk进行脱壳 3. 使用` ...
- 【架构师视角系列】QConfig配置中心系列之Client端(二)
目录 声明 配置中心系列文章 一.架构 一.客户端架 1.Server 职责 (1)配置管理 (2)配置发布 (3)配置读取 2.Client 职责 (1)配置拉取 (2)配置注入 (3)配置变更监听 ...
- Celery异步处理任务时遇到的错误ValueError: not enough values to unpack (expected 3, got 0)
开启celery异步,终端命令: celery -A celery_tasks.main worker -l info 如果上面运行后,发送短信码的时候没有报如下错误: ValueError: not ...
- 【LeetCode贪心#06】加油站(股票买卖变种)
加油站 力扣题目链接(opens new window) 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 ...
- ZYNQ 裸机模式下修改默认uart端口
## 背景 调试ZYNQ 裸机code, 调用 printf()后在UART端口无法看到打印信息输出,查看原理图后发现,板子用的UART 1作为默认串口调试接口,UART 0分配给了RS485使用,因 ...
- C++ 模板的笔记1
C++模板的笔记1 C++ 函数模板 函数模板的定义 函数模板是一种可以生成不同类型函数的函数声明.函数模板的参数类型不是固定的,而是在调用时由实参类型推导出来. 语法: template <t ...
- 2、dubbo原理
图例说明: 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口. 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖 ...
- GoLand打开后Project消失
一直用的好好的Goland,突然不能用了,左边栏Project"消失"了. 如下: 解决方法 遇到上面问题,一般情况是GoLand的cache问题,这个时候要将GoLand清理一下 ...
- 学习笔记-涛讲F#(基础)
目录 简介 类型推导 多个输入参数的函数 定义单位 偏函数 常量也是函数 返回值(unit与ignore) 函数串联实现"开方乘十" 使用管道符 |> 元组(参数加上括号) ...
- 个性化的单芯片的回声消除(AEC)解决方案
概述 这些年随着智能化产品的广泛应用,各种新型音频产品也层出不穷,在这个古老的领域,传统的回声消除方案一般是功耗高,成本非常高,集成性差.无法满足新产品新市场对回声消除的低成本低功耗个性化需求等特 ...