2018.09.27 codeforces1045A. Last chance(线段树优化建图+最大流)

博客介绍了如何使用线段树优化方法来解决Codeforces上的一个问题,该问题涉及网络流。通过建立线段树并进行特定的边连接,可以高效地处理问题中的操作。博主提供了具体的建图策略和贪心算法来处理第三种操作,实现最大流的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门
看完题应该都知道是网络流了吧。
但是第二种武器直接建图会gg。
因此我们用线段树优化建图。
具体操作就是,对于这m个人先建一棵线段树,父亲向儿子连容量为inf的边,最后叶子结点向对应的人连容量为1的边。
这样给第二种武器对应连边的时候直接给区间连边就行了。
对于操作三,我们直接贪心流掉两个人,剩下的一个人不流就行了。
代码:

#include<bits/stdc++.h>
#define N 200005
#define inf 0x3f3f3f3f 
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (l+r>>1)
using namespace std;
inline int read(){
    
    
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
bool vis[N];
int n,m,id[N],q[N],hd,tl,tot,Begin,ans,d[N],first[N],cnt,s,t;
struct edge{
    
    int v,c,next;};
map<int,int>mp[N];
edge e[N];
inline void add(int u,int v,int c){
    
    
	e[++cnt].v=v,e[cnt].c=c,e[cnt].next=first[u],first[u]=cnt;
	e[++cnt].v=u,e[cnt].c=0,e[cnt].next=first[v],first[v]=cnt;
}
inline bool bfs(){
    
    
	queue<int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值