【CF1045A】A Last chance【贪心】【线段树优化建图】【网络流构造方案】

题意:有nnn个武器和mmm个飞船,武器有下面三种

  1. 从给定的集合SSS中击破一个。
  2. 在给定的区间[L,R][L,R][L,R]中击破一个。
  3. 对于给定的a,b,ca,b,ca,b,c,选择000个或222个击破。特殊地,每个飞船最多被该操作的a,b,ca,b,ca,b,c指定一次。

求最多能击破的飞船数量,并输出一种方案。

n,m≤5×103,∑∣S∣≤105n,m\leq 5\times10^3,\sum|S|\leq10^5n,m5×103,S105

网络流大杂烩

操作333似乎是个经典的不可做问题。但注意到指定的三个飞船不会重复,且只有333能选222个,可以贪心地把所有333都覆盖(也可以通过后面的建图理解为什么贪心是正确的)

1、31、313操作直接建,222操作建个线段树优化建图

具体而言,先整一棵线段树,树上的父结点向儿子连容量为 INF 的边,叶子结点表示飞船,向TTT连容量为111。另开nnn个点,表示武器,111操作流111的流量直接连,222操作拆成log⁡\loglog个区间连,333操作流222的流量先记下来最后连上去,这样333操作会最先增广,然后后面无论怎么增广流量都是222(这也是为什么贪心是对的)

方案可以从TTT往回dfs,走有流的边。因为已经有流了,所以往这条边走一定有合法方案,走到武器点的时候立刻返回,并顺便退掉111的流量。

谁能告诉我怎么算数组大小啊

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <queue>
#define MAXN 1000005
#define MAXM 10000005
using namespace std;
const int INF=0x7fffffff;
struct edge{int u,v,c;}e[MAXN];
int head[MAXN],cur[MAXN],nxt[MAXM],cnt=1;
void insert(int u,int v,int c)
{e[++cnt]=(edge){u,v,c};nxt[cnt]=head[u];head[u]=cnt;
}
void addnode(int u,int v,int c){insert(u,v,c),insert(v,u,0);}
int dis[MAXN],S,T;
bool bfs()
{queue<int> q;q.push(S);memset(dis,-1,(T+5)*sizeof(int));dis[S]=0;while (!q.empty()){int u=q.front();q.pop();for (int i=head[u];i;i=nxt[i])if (e[i].c&&dis[e[i].v]==-1){dis[e[i].v]=dis[u]+1;q.push(e[i].v);if (e[i].v==T) return true;}}return false;
}
int dfs(int u,int f)
{if (u==T||!f) return f;int used=0;for (int &i=cur[u];i;i=nxt[i])if (e[i].c&&dis[e[i].v]==dis[u]+1){int w=dfs(e[i].v,min(f,e[i].c));if (!w) continue;used+=w,f-=w;e[i].c-=w,e[i^1].c+=w;if (!f) break;}if (!used) dis[u]=-1;return used;
}
inline int dinic()
{int mflow=0;while (bfs()) memcpy(cur,head,(T+5)*sizeof(int)),mflow+=dfs(S,INF);return mflow;
}
int pos[MAXN],sop[MAXN],mx;
#define lc p<<1
#define rc p<<1|1
void build(int p,int l,int r)
{mx=max(mx,p);if (l==r) return (void)(pos[l]=p,sop[p]=l);int mid=(l+r)>>1;build(lc,l,mid);build(rc,mid+1,r);addnode(p,lc,INF),addnode(p,rc,INF);
}
void query(int p,int l,int r,int ql,int qr,int u)
{if (ql<=l&&r<=qr) return (void)addnode(u,p,1);if (qr<l||r<ql) return;int mid=(l+r)>>1;query(lc,l,mid,ql,qr,u),query(rc,mid+1,r,ql,qr,u);
}
int x[MAXN],a[MAXN],b[MAXN],c[MAXN],tot,n,m;
int ans[MAXN];
int find(int u,int f)
{if (mx+1<=u&&u<=mx+n) return u;for (int i=head[u];i;i=nxt[i])if (e[i].c&&e[i].v!=f){--e[i].c;++e[i^1].c;return find(e[i].v,u);}return 0;
}
int main()
{scanf("%d%d",&n,&m);build(1,1,m);S=mx+n+1,T=S+1;for (int i=1;i<=n;i++){int type;scanf("%d",&type);if (type==0){addnode(S,mx+i,1);int k;scanf("%d",&k);while (k--){int x;scanf("%d",&x);addnode(mx+i,pos[x],1);}}if (type==1){addnode(S,mx+i,1);int l,r;scanf("%d%d",&l,&r);query(1,1,m,l,r,mx+i);}if (type==2){++tot;x[tot]=i;scanf("%d%d%d",&a[tot],&b[tot],&c[tot]);}}for (int i=1;i<=tot;i++){addnode(S,mx+x[i],2);addnode(mx+x[i],pos[a[i]],1);addnode(mx+x[i],pos[b[i]],1);addnode(mx+x[i],pos[c[i]],1);}for (int i=1;i<=m;i++) addnode(pos[i],T,1);printf("%d\n",dinic());for (int i=head[T];i;i=nxt[i])if (e[i].c){int t=find(e[i].v,T);if (t) printf("%d %d\n",t-mx,sop[e[i].v]);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P4127 [AHOI2009]同类分布 数位dp + 对状态剪枝

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 比较套路的题&#xff0c;首先也有个明显的状态f[pos][num][sum]f[pos][num][sum]f[pos][num][sum]表示到了pospospos位&#xff0c;当前数为numnumnum&#xff0c;各位数字之和为sumsumsu…

.NET开发框架(六)-架构设计之IIS负载均衡(视频)

前面有关注我们公众号文章的朋友应该都知道&#xff0c;我们的分布式应用服务可以通过Ocelot网关进行负载均衡&#xff0c;这种方式属于应用级别的实现。而今天我们给大家介绍的是平台级别的实现&#xff0c;并且我们首次使用视频方式进行讲解。本文通过视频方式为大家演示&…

【NOI2019】斗主地【期望】【组合数学】【下降幂】【插值】

题意&#xff1a; 有nnn张牌&#xff0c;从上往下的第iii张牌权值是f(i)itypef(i)i^{type}f(i)itype。 进行mmm次洗牌操作&#xff0c;每次操作给定aia_iai​&#xff0c;将从上往下的前aia_iai​张牌分成一堆&#xff0c;后面bib_ibi​张牌分成第二堆。如果两堆的牌数分别为…

架构杂谈《二》

服务化到微服务1、微服务的产生随着互联网企业的不断发展&#xff0c;海量用户发起的大规模、高并发请求是企业不得不面对的&#xff0c;上一篇 架构杂谈《一》杂谈的SOA服务化系统能够分解任务&#xff0c;让每个服务更简单、职责单一、更易于扩展。但无论是Web Service 还是E…

Good Bye 2017 G. New Year and Original Order 数位dp + 按数贡献

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 定义S(k)S(k)S(k)为将kkk的每一位拿出来从小到大排序后构成的数&#xff0c;比如S(3421)1234S(3421)1234S(3421)1234&#xff0c;求S(k)1≤k≤nS(k)_{1\le k\le n }S(k)1≤k≤n​。 1≤n≤107001\le n\le 10…

【NOI2019】 机器人 【区间dp】【插值】【下降幂多项式】【分段函数】

题意&#xff1a;有个长度为nnn的序列aaa&#xff0c;ai∈[Li,Ri]a_i\in [L_i,R_i]ai​∈[Li​,Ri​]。从一个位置sss可以往左直到≥as\geq a_s≥as​,往右直到>as> a_s>as​。求有多少种可能的序列满足从任意位置向左或向右的最大步数的差的绝对值不超过222。 n≤300…

上海理工大学第二届“联想杯”全国程序设计邀请赛 Identical Day 思维 + 暴力

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个010101序列&#xff0c;假设有一段长为lll连续的全111子串&#xff0c;定义这段字串不高兴值为l∗(l1)2\frac{l*(l1)}{2}2l∗(l1)​&#xff0c;整个串的所有不高兴值相加为总的不高兴值。现在你可以…

简化 Pod 故障诊断:kubectl-debug 介绍

背景容器技术的一个最佳实践是构建尽可能精简的容器镜像。但这一实践却会给排查问题带来麻烦&#xff1a;精简后的容器中普遍缺失常用的排障工具&#xff0c;部分容器里甚至没有 shell (比如 FROM scratch &#xff09;。在这种状况下&#xff0c;我们只能通过日志或者到宿主机…

dotnet 新项目格式与对应框架预定义的宏

在 sdk style 的项目格式支持使用多框架开发&#xff0c;此时需要在代码里面通过宏判断&#xff0c;在编译的时候执行不同的代码。本文告诉大家在框架里面对应的预定义的条件编译符有哪些在让一个 csproj 项目指定多个开发框架 - walterlv告诉大家如何在 sdk style 项目格式如何…

【UOJ549】序列妙妙值【异或】【根号分治】

题意&#xff1a;给一个长度为nnn的序列aaa&#xff0c;将其分成kkk段&#xff0c;不能为空&#xff0c;求所有段的异或和之和的最小值。 n≤6104,ai<216,k≤8n\leq 6\times 10^4,a_i <2^{16},k\leq 8n≤6104,ai​<216,k≤8 先求个前缀异或和&#xff0c;显然有个 dp…

Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest 思维 + 差分

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你三个长度分别为k1,k2,k3k1,k2,k3k1,k2,k3的数组a,b,ca,b,ca,b,c&#xff0c;其中k1k2k3nk1k2k3nk1k2k3n&#xff0c;这三个数组中的元素拼接起来是一个nnn的排列&#xff0c;每次可以将某个数组中的某个…

TPL Dataflow .Net 数据流组件,了解一下?

作为单体程序&#xff0c;依赖的第三方服务虽不多&#xff0c;但是2C的程序还是有不少内容可讲&#xff1b;作为一个常规互联网系统&#xff0c;无外乎就是接受请求、处理请求&#xff0c;输出响应。由于业务渐渐增长&#xff0c;数据处理的过程会越来越复杂和冗长&#xff0c;…

【CF1394B】Boboniu Walks on Graph【图论】【集合哈希】

题意&#xff1a;给定nnn个点mmm张图的有向图&#xff0c;有1∼m1\sim m1∼m互不相同每个点出度不超过kkk。对于一个 kkk元组cic_ici​&#xff0c;图中的每个点uuu只保留第cdeguc_{deg_u}cdegu​​小的边。求有多少种ccc使得在保留下来的图中每个点沿着出边一直往下走可以走回…

Educational Codeforces Round 76 (Rated for Div. 2) F. Make Them Similar 折半搜索

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 一个显然的思路就是2302^{30}230枚举所有的xxx&#xff0c;让后再检查&#xff0c;这个复杂度显然不能接受。 又发现对于每个位置它取多少不受其他位置限制&#xff0c;满足可拼接性&#…

windows container 踩坑记

windows container 踩坑记Intro我们有一些服务是 dotnet framework 的&#xff0c;不能直接跑在 docker linux container 下面&#xff0c;最近一直在折腾把它部署在 windows container 下&#xff0c;折腾的有点恶心&#xff0c;记录一下。Windows Container 介绍Windows Cont…

生成函数Euler变换学习笔记(无标号有根树计数)

众所周知&#xff0c;对于有标号计数的指数型生成函数 f(x)f(x)f(x)&#xff0c;将其任意地进行无顺序的组合&#xff0c;得到的生成函数是exp(f(x))exp(f(x))exp(f(x))。 而对于无标号计数的这样的组合&#xff0c;我们就需要引入一个叫 Eular\text{Eular}Eular 变换的东西 E…

Codeforces Round #602 (Div. 2) D2. Optimal Subsequences stl 黑科技

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 比较明显的是我们需要将序列从大到小排序&#xff0c;让后取前kkk个数&#xff0c;再从中选择第pospospos小的位置输出当前位置的数即可。 一开始想用setsetset维护&#xff0c;但是setse…

小白开学Asp.Net Core 《七》

小白开学Asp.Net Core 《七》— — 探究中间件&#xff08;MiddleWare&#xff09;1、何为中间件&#xff1f;中间件是组装到应用程序管道中以处理请求和响应的家伙&#xff0c;管道中的每个组件都要满足以下两个条件选择是否将请求传递给管道中的下一个组件可以在调用管道中的…

【SHOI2017】相逢是问候【扩展欧拉定理】【复杂度分析】【线段树】

题意&#xff1a;给定一个长度为 nnn 的序列 aia_iai​&#xff0c;维护 mmm 次操作&#xff1a; 区间执行 ai←caia_i \leftarrow c^{a_i}ai​←cai​&#xff1b;区间求和 模 ppp。 其中 p,cp,cp,c 对所有操作相同。 n,m≤5104,p≤108n,m\leq 5\times 10^4,p\leq 10^8n,m≤…

aspnetcore 实现简单的伪静态化

aspnetcore 实现简单的伪静态化Intro在我的活动室预约项目中&#xff0c;有一个公告模块&#xff0c;类似于新闻发布&#xff0c;个人感觉像新闻这种网页基本就是发布的时候编辑一次之后就再也不会改了&#xff0c;最适合静态化了&#xff0c; 静态化之后用户请求的就是静态文件…