[Luogu 3701] 「伪模板」主席树

<题目链接>


这是一道网络流,不是主席树,不是什么数据结构,而是网络流。

题目背景及描述都非常的暴力,以至于 Capella 在做此题的过程中不禁感到生命流逝。

S 向 byx 的树中的每一个人连有向边,手气君的树中的每一个人向 T 连有向边,边权为这个人的寿命。统计同一棵树中的膜法师数量 x。如果一个人是主席,那么边权要加上 x。(续得好啊)

然后,如果 byx 树中的一个点 i 能赢手气君树中的点 j,那么连 i->j,边权为 1。

跑最大流,最终答案为 min(m,ans)。

PS:指针邻接表写网络流真有意思,我再也不用写什么 ((i-1)^1)+1 蛇皮操作了!开心!

以及悄悄在代码里表白一下 Procyon。qwqqwqqwq

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
using std::min;
using std::queue;
const int MAXN=210,INF=0x3f3f3f3f;
int n,m,S,T,win[5][5]={ {0 ,1 ,1 ,-1 ,-1 },
{-1 ,0 ,1 ,1 ,-1 },
{-1 ,-1 ,0 ,1 ,1 },
{1 ,-1 ,-1 ,0 ,1 },
{1 ,1 ,-1 ,-1 ,0 }};
struct Edge
{
int to,w;
Edge *nxt,*back;
Edge(int to=0,int w=0,Edge* nxt=nullptr):to(to),w(w),nxt(nxt),back(nullptr){}
~Edge(void)
{
if(nxt!=nullptr)
delete nxt;
}
}*head[MAXN];
void AddEdges(int u,int v,int w)
{
head[u]=new Edge(v,w,head[u]);
head[v]=new Edge(u,0,head[v]);
head[u]->back=head[v];
head[v]->back=head[u];
}
int Number(char *s)
{
if(s[0]=='J')
return 0;
else if(s[0]=='H')
return 1;
else if(s[0]=='W')
return 2;
else if(s[0]=='E')
return 3;
else if(s[0]=='Y')
return 4;
}
void InitTree(int *a)
{
char s[5];
for(int i=1;i<=n;++i)
{
scanf(" %s",s);
a[i]=Number(s);
if(a[i]==4)
++a[0];
}
}
void Init(void)
{
static int a[MAXN],b[MAXN];
T=(n<<1)+1;
InitTree(a);
InitTree(b);
for(int i=1;i<=n;++i)
head[i]=nullptr;
for(int i=1,x;i<=n;++i)
{
scanf("%d",&x);
AddEdges(S,i,!a[i] ? x+a[0] : x);
}
for(int i=1,x;i<=n;++i)
{
scanf("%d",&x);
AddEdges(i+n,T,!b[i] ? x+b[0] : x);
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(win[a[i]][b[j]]==1)
AddEdges(i,j+n,1);
}
void Destroy(void)
{
for(int i=S;i^T;++i)
delete head[i];
}
namespace Procyon
{
int dis[MAXN];
Edge *cur[MAXN];
bool BFS(int S,int T)
{
queue<int> q;
memset(dis,0,sizeof dis);
q.push(S);
dis[S]=1;
while(!q.empty())
{
int u=q.front(),v;
q.pop();
for(Edge *i=head[u];i!=nullptr;i=i->nxt)
if(i->w && !dis[v=i->to])
{
q.push(v);
dis[v]=dis[u]+1;
}
}
return dis[T];
}
int DFS(int u,int k)
{
if(u==T || !k)
return k;
int v,f,sum=0;
for(Edge *&i=cur[u];i!=nullptr;i=i->nxt)
if(i->w && dis[v=i->to]==dis[u]+1 && (f=DFS(v,min(k,i->w))))
{
k-=f;
sum+=f;
i->w-=f;
i->back->w+=f;
}
if(!sum)
dis[u]=1;
return sum;
}
void Dinic(int S,int T)
{
int ans=0;
while(BFS(S,T))
{
memcpy(cur,head,sizeof head);
ans+=DFS(S,INF);
}
printf("%d\n",min(m,ans));
}
}
int main(int argc,char** argv)
{
scanf("%d %d",&n,&m);
Init();
Procyon::Dinic(S,T);
Destroy();
return 0;
}

谢谢阅读。

[Luogu 3701] 「伪模板」主席树的更多相关文章

  1. [Luogu] P3701 「伪模板」主席树

    题目背景 byx和手气君都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x. 题目描述 很快,这棵树就开花结果了.byx和手气君惊 ...

  2. P3701 「伪模板」主席树

    题目背景 byx和手气君都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x. 题目描述 很快,这棵树就开花结果了.byx和手气君惊 ...

  3. 【luoguP3701】「伪模板」主席树

    description byx和诗乃酱都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x. 很快,这棵树就开花结果了.byx和诗乃 ...

  4. LuoguP3701 「伪模板」主席树

    题面 这个题很有意思啊... 其实是道最大流板子题,只连byx会赢的边,S向byx连,另一个连T... 注意有长者时连的边加上同方mogician的个数... 还要注意mogician可以无限续命,也 ...

  5. [洛谷P3701]「伪模板」主席树

    题目大意:太暴力了,就不写了,看这儿 题解:对于每个$byx$的人,从源点向人连边,容量为此人的寿命. 对于每个手气君的人,从人向汇点连边,容量为此人的寿命. 对于每个$byx$的人与手气君的人,如果 ...

  6. 「模板」 线段树——区间乘 && 区间加 && 区间求和

    「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...

  7. 「WC 2019」数树

    「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...

  8. 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)

    [题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...

  9. 【Luogu】P3384主席树模板(主席树查询K小数)

    YEAH!我也是一个AC主席树模板的人了! 其实是个半吊子 我将尽量详细的讲出我的想法. 主席树太难,我们先搞普通线段树好了 普通线段树怎么做?我的想法是查询K次最小值,每次查完把查的数改成INF,查 ...

随机推荐

  1. 进程间通信:命名管道FIFO(2)

    一.命名管道 如果我们想在不相关的进程之间交换数据,可以用FIFO文件来完成这项工作,它通常也被称为命名管道.命名管道是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和我们已经见 ...

  2. EasyJSWebView原理分析

    概述 在iOS6之前,native只能调用webiew里的js代码,官方没有提供js调用native方法的接口.到了iOS7,官方提供了JSContext用来与js交互,native和js可以双向调用 ...

  3. 链表相加(Add Two Numbers)

    描述: 给定两个非空的链表,表示两个非负整数.数字以相反的顺序存储,每个节点包含一个数字.添加两个数字并将其作为链表返回. 您可以假设两个数字不包含任何前导零,除了数字0本身. 输入:(2 - > ...

  4. 活学活用wxPython

    http://www.czug.org/python/wxpythoninaction/

  5. AppScan工作原理&操作教程

    一.AppScan的工作原理 对一个综合性的大型网站来说,可能存在成千上万的页面.以登录界面为例,至少要输入用户名和密码,即该页面存在两个字段,当提交了用户名和密码等登录信息,网站需要检查是否正确,这 ...

  6. phpcms v9 thumb(缩略图) 函数说明

    打开phcmsc/libs/functions/global.func.php文件,找到如下代码:/** * 生成缩略图函数 * @param  $imgurl 图片路径 * @param  $wid ...

  7. 【Python】ORM框架SQLAlchemy的使用

    ORM和SQLAlchemy简介 对象关系映射(Object Relational Mapping,简称ORM),简单的来说,ORM是将数据库中的表与面向对象语言中的类建立了一种对应的关系.然后我们操 ...

  8. 《转》vue-cli的webpack模板项目配置文件注释

    一.文件结构 本文主要分析开发(dev)和构建(build)两个过程涉及到的文件,故下面文件结构仅列出相应的内容. ├─build │ ├─build.js │ ├─check-versions.js ...

  9. 923c C. Perfect Security

    Trie树. 要求字典序最小,所以由前到后贪心的选择.建一个trie树维护b数列. #include<cstdio> #include<algorithm> #include& ...

  10. BZOJ1010:[HNOI2008]玩具装箱——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1010 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行 ...