[CF1045A] Last chance
题目:Last chance
传送门:http://codeforces.com/contest/1045/problem/A
分析:
1)有$n$个敌方飞船,己方有$m$个武器,有三种类型。
2)$第0种$:能攻击一艘 编号属于大小为$ki$的集合的飞船。显然,这是一个二分图最大匹配,可以暴力建边。
3)$第1种$:能攻击一艘 编号在$[l_i,r_i]$区间内的飞船。显然,这还是二分图最大匹配,但是,“武器到区间所有飞船建边”这种复杂度就不可接受了。
4)点与区间所有点建边可以采用线段树优化。
5)$第2种$:能攻击三艘飞船中的0艘或者两艘,编号分别为$ai,bi,ci$。题目保证了一艘飞船至多被包括在一个这样的三元组中,也就是所有第2种武器的攻击集合互不相交。
6)贪心攻击掉两艘。对每个三元组建一个辅助点让它们的流量和小于等于$1$.
7)很明显的网络流了。
8)对于$第0种$武器:源点到武器建一条容量为1的边,武器到集合中每一个飞船建一条容量为1的边。
9)对于$第1种$武器:线段树优化点到区间建边:对于这$m$个人先建一棵线段树,父亲节点向儿子节点连容量为$INF$的边,最后叶子结点向对应的飞船连容量为$1$的边。这样给$第1种$武器对应连边的时候直接给区间连边就行了。
10)对于第2种武器:贪心掉$a_i,b_i$,$a_i,b_i$不必向汇点连边,武器节点向$a_i,b_i$连接一条反向容量为1的边,向$c_i$连一条容量为1的边,这样就保证了$a_i,b_i,c_i$要么被选到2个,要么被选到3个。
11)题目还要输出方案。可以采用类似退流的方式。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxN=,INF=1e9+;
int n,m,ans=,vis[maxN];
struct Edge{int to,f,next;};
struct NetWorkFlow{
int en,fi[maxN];
Edge e[maxN];
void addE(int v,int u,int f){
e[++en].to=u;e[en].f=f;e[en].next=fi[v];fi[v]=en;
e[++en].to=v;e[en].f=;e[en].next=fi[u];fi[u]=en;
}
int tot,S,T,cnt[maxN],dis[maxN];
int sap(int t,int delta){
if(t==T)return delta;
int sum=,mindis=tot+;
for(int i=fi[t];i;i=e[i].next){
if(e[i].f && dis[t]==dis[e[i].to]+){
int save=sap(e[i].to,std::min(e[i].f,delta-sum));
sum+=save;
e[i].f-=save;
e[i^].f+=save;
if(dis[S]>=tot+ || delta==sum)return sum;
}
if(e[i].f && dis[e[i].to]<mindis)mindis=dis[e[i].to];
}
if(!sum){
if(!--cnt[dis[t]])dis[S]=tot+;
else ++cnt[dis[t]=mindis+];
}
return sum;
}
void Sol(){
cnt[]=tot+;
while(dis[S]<tot+)
ans+=sap(S,INF);
}
}NW;
struct SegmentTree{
int id[maxN];
void Init(int v,int l,int r){
id[v]=++NW.tot;
if(l==r){NW.addE(id[v],l,);return;}
int mid=(l+r)>>;
Init(v<<,l,mid);NW.addE(id[v],id[v<<],INF);
Init(v<<|,mid+,r);NW.addE(id[v],id[v<<^],INF);
}
void addE(int v,int l,int r,const int &L,const int &R,const int& u){
if(L<=l && r<=R){NW.addE(u,id[v],);return;}
int mid=(l+r)>>;
if(L<=mid)addE(v<<,l,mid,L,R,u);
if(mid< R)addE(v<<|,mid+,r,L,R,u);
}
}ST;
int Re(){
int ch='@',x=;
for(;ch< || <ch;ch=getchar());
for(;<ch && ch<;ch=getchar())x=x*+ch-;
return x;
}
int Beg,tmp;
map<int,int>mp[maxN];
void GetAns(int v){
if(v>=Beg){tmp=v-Beg+;return;}
auto it=mp[v].begin();
GetAns(it->first);
--it->second;
if(!it->second)mp[v].erase(it);
}
int main(){
n=Re();m=Re();
NW.en=;memset(NW.fi,,sizeof NW.fi);
NW.tot=m;NW.S=++NW.tot;NW.T=++NW.tot;
ST.Init(,,m);Beg=NW.tot+;
for(int i=,op;i<=n;++i){
++NW.tot;
op=Re();
if(op==){
NW.addE(NW.S,NW.tot,);
for(int k=Re(),x;k--;){x=Re();NW.addE(NW.tot,x,);}
}else if(op==){
NW.addE(NW.S,NW.tot,);
int L=Re();int R=Re();
ST.addE(,,m,L,R,NW.tot);
}else{
int a=Re();int b=Re();int c=Re();
vis[a]=vis[b]=;ans+=;
NW.addE(NW.tot,a,);NW.e[NW.en].f=;
NW.addE(NW.tot,b,);NW.e[NW.en].f=;
NW.addE(NW.tot,c,);
}
}
for(int i=;i<=m;++i)if(!vis[i])NW.addE(i,NW.T,);
NW.Sol();
printf("%d\n",ans);
for(int i=;i<=NW.tot;++i)
for(int j=NW.fi[i];j;j=NW.e[j].next)
if((j&)&&NW.e[j].f)
mp[i][NW.e[j].to]=NW.e[j].f;
for(int i=;i<=m;++i){
bool f=true;
for(int j=NW.fi[i];j&&f;j=NW.e[j].next)if(NW.e[j].to==NW.T&&NW.e[j].f)f=false;
if(f){
GetAns(i);
printf("%d %d\n",tmp,i);
}
}
return ;
}
[CF1045A] Last chance的更多相关文章
- CF786B Legacy(线段树优化建边)
模板题CF786B Legacy 先说算法 如果需要有n个点需要建图 给m个需要建边的信息,从单点(或区间内所有点)向一区间所有点连边 如果暴力建图复杂度\(mn^2\) 以单点连向区间为例,在n个点 ...
- Chance – 功能强大的 JavaScript 随机数生成类库
Chance 是一个基于 JavaScript 的随机数工具类.可以生成随机数字,名称,地址,域名,邮箱,时间等等,几乎网站中使用的任何形式的内容都能够生成.这个随机数工具可以帮助减少单调的测试数据编 ...
- poj 1698 Alice‘s Chance
poj 1698 Alice's Chance 题目地址: http://poj.org/problem?id=1698 题意: 演员Alice ,面对n场电影,每场电影拍摄持续w周,每周特定几天拍 ...
- 【性能诊断】九、并发场景的性能分析(windbg案例,Fist Chance Exception/Crash dump)
经常会碰到这样的场景,自测及单单点的测试时没有任何问题,但在并发环境或生产环境下有时出现没规律的异常.报错等情况.在代码中增加日志是其中一种解决方式:抓取指定异常时的dump,通过wind ...
- (C# Debug)A first chance exception of type 'System.ArgumentException' occurred in System.Data.dll
Debug 模式下运行程序的时候,Output 窗口出来个错误“A first chance exception of type 'System.ArgumentException' occurred ...
- Alice's Chance POJ - 1698(按时间点建边)
Alice's Chance Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7791 Accepted: 3174 De ...
- Codeforces 1045A Last chance 网络流,线段树,线段树优化建图
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045A.html 题目传送们 - CF1045A 题意 你有 $n$ 个炮,有 $m$ 个敌人,敌人排成一 ...
- 2018.07.06 POJ1698 Alice's Chance(最大流)
Alice's Chance Time Limit: 1000MS Memory Limit: 10000K Description Alice, a charming girl, have been ...
- You can fail at what you don't want, so you might as well take a chance on doing what you love.
You can fail at what you don't want, so you might as well take a chance on doing what you love. 做不想做 ...
随机推荐
- oracle DBID,SID,DB_NAME,DB_DOMAIN,INSTANCE_NAME,DB_UNIQUE_NAME, SERVICE_NAMES 及监听参数的说明
DBID,SID,DB_NAME,DB_DOMAIN,INSTANCE_NAME,DB_UNIQUE_NAME, SERVICE_NAMES 及监听参数的说明 DB 相关的: DBID, SIDPFI ...
- C#模块初始化注入
这个功能可以实现很多很有用的功能,比如程序集加密,Hook安装等.英文转载备忘. 原地址:https://www.coengoedegebure.com/module-initializers-i ...
- layui中获取全部提交的数据
<form class="layui-form" action="">...........input textarea ......</fo ...
- 剑指offer--day07
1.1 题目:反转链表:输入一个链表,反转链表后,输出新链表的表头. 1.2 思路:这道题,我们要做到的是反转链表,我们的思路是将前一个节点与后一个节点断开,然后让后一个节点指向前一个节点,这个过程就 ...
- 信息收集【采集点OWASP CHINA】网址http://www.owasp.org.cn/
以下部分源于 安全家 http://www.anquanjia.net.cn/newsinfo/729480.html 资源虽多,优质却少.不要被信息海迷惑的心智,新人要想入门,除了优质的系统教学资源 ...
- mysql使用触发器生成唯一订单号,
需求:订单号唯一,并且期望是时间格式加其他字符串, 实现:采用触发机制,在新增时根据新增id值加1作为订单生成的随机且确定唯一的数,因为id唯一: 遇到问题:新增时不能提前知道id值, 解决:取到当前 ...
- oracle--groupby分组学习
使用group by分组 在多行函数中不能直接使用普通字段,除非group by 在多行函数中不能直接使用单行函数,除非group by group by学习: ---1.使用group by进行数据 ...
- [AHOI2013]作业 (莫队+分块)
[AHOI2013]作业 (莫队+分块) 题面 给定了一个长度为n的数列和若干个询问,每个询问是关于数列的区间[l,r],首先你要统计该区间内大于等于a,小于等于b的数的个数,其次是所有大于等于a,小 ...
- SCUT - 77 - 哈利波特与他的魔法杖
https://scut.online/p/77 METO说是单点更新线段树.要记录哪些点不用再更新,不太清楚具体是要怎么实现? 一个类似的想法是把n个点建一棵平衡树,每次节点变成0之后从树上移除,至 ...
- asp.net 获取表单中控件的值
原文:https://blog.csdn.net/happymagic/article/details/8480235 C# 后台获取前台 input 文本框值.(都是以控件的Name来获取) s ...