51nod 1336 RMQ逆问题
多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5
之后有T组结构相同的数据:
每组数据的第一行有两个整数n与M,其中1<=n<=10^9(即1,000,000,000),1<=M<=50
之后会有M行,每行表示一个三元组Li,Ri,Qi,其中1<=Li<=Ri<=n,1<=Qi<=n
每组数据输出一行,即“Possible”或“Impossible”不含引号
对于一个询问(L,R,Q),能得到的信息是(Q,n]中的数只能在[1,L)或(R,n],Q只能在[L,R]
因此离散化之后可以转化为最大流,左边的点代表每个数值/数值区间,右边的点代表每个区间,之间连边inf代表此数值可以在此区间内,源点到左边的点连边限制每个数值/数值区间中数值的个数,右边的点连边到汇点限制每个区间内数值的个数,当且仅当最大流为n时有解
#include<cstdio>
#include<algorithm>
const int N=,inf=0x3f3f3f3f;
int es[N],enx[N],ev[N],e0[N],ep;
int h[N],q[N],S,T;
inline void adde(int a,int b,int c){
es[ep]=b;enx[ep]=e0[a];ev[ep]=c;e0[a]=ep++;
es[ep]=a;enx[ep]=e0[b];ev[ep]=;e0[b]=ep++;
}
bool bfs(){
int ql=,qr=;
for(int i=;i<=T;i++)h[i]=;
h[S]=;q[qr++]=S;
while(ql!=qr){
int w=q[ql++];
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(!h[u]&&ev[i]){
h[u]=h[w]+;
q[qr++]=u;
}
}
}
return h[T];
}
int dfs(int w,int f){
if(w==T)return f;
int c,u,used=;
for(int i=e0[w];i;i=enx[i]){
u=es[i];
if(h[u]!=h[w]+||!ev[i])continue;
c=f-used;
if(c>ev[i])c=ev[i];
c=dfs(u,c);
used+=c;
ev[i]-=c;
ev[i^]+=c;
if(used==f)return f;
}
if(!used)h[w]=;
return used;
}
int qs[][],xs[],ps[],xp,pp;
bool d[][];
int main(){
int _T,n,q;
for(scanf("%d",&_T);_T;_T--){
scanf("%d%d",&n,&q);
for(int i=;i<q;i++)scanf("%d%d%d",qs[i],qs[i]+,qs[i]+);
xp=pp=;
xs[xp++]=;
xs[xp++]=n+;
ps[pp++]=;
ps[pp++]=n+;
for(int i=;i<q;i++){
xs[xp++]=qs[i][];
xs[xp++]=qs[i][]+;
ps[pp++]=qs[i][];
ps[pp++]=qs[i][]+;
}
std::sort(xs,xs+xp);
xp=std::unique(xs,xs+xp)-xs;
std::sort(ps,ps+pp);
pp=std::unique(ps,ps+pp)-ps;
for(int i=;i<xp;i++)for(int j=;j<pp;j++)d[i][j]=;
for(int i=;i<q;i++){
for(int j=;j<xp-;j++){
if(xs[j]>qs[i][]){
for(int k=;k<pp-;k++)if(qs[i][]<=ps[k]&&ps[k]<=qs[i][]){
d[j][k]=;
}
}else if(xs[j]==qs[i][]){
for(int k=;k<pp-;k++)if(qs[i][]>ps[k]||ps[k]>qs[i][]){
d[j][k]=;
}
}
}
}
S=xp+pp+;T=S+;
for(int i=;i<=T;i++)e0[i]=;
ep=;
for(int i=;i<xp-;i++)adde(S,i+,xs[i+]-xs[i]);
for(int i=;i<pp-;i++)adde(xp+i+,T,ps[i+]-ps[i]);
for(int i=;i<xp-;i++)for(int j=;j<pp-;j++)if(d[i][j])adde(i+,xp+j+,n);
int ans=;
while(bfs())ans+=dfs(S,inf);
puts(ans==n?"Possible":"Impossible");
}
return ;
}
51nod 1336 RMQ逆问题的更多相关文章
- 51Nod1336 RMQ逆问题 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1336.html 题目传送门 - 51Nod1336 题意 题解 我们将输入的一个区间的答案称为 V ...
- 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...
- 51nod 1272【二分+RMQ】
思路: 这题不能说是长见识,倒是第一次写这么富有套路的题,倒着来,二分区间嘛,这个很简单啊,二分的条件查询一个当前区间的最小值是不是比那个特定的值小,一步步缩小,这就是二分嘛,然后查询用线段树的RMQ ...
- 51Nod 1174 区间中最大的数(RMQ)
#include <iostream> #include <algorithm> #include <cstring> using namespace std; + ...
- 51nod1174(RMQ)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1174 题意:中文题诶- 思路:RMQ模板题 关于RMQ: h ...
- 51nod 1050 循环数组最大子段和 单调队列优化DP
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 这个呢,这个题之前 求一遍最大值 然后求一遍最小值 ...
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- 51Nod 1268 和为K的组合
51Nod 1268 和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...
- 51Nod 1428 活动安排问题
51Nod 1428 活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...
随机推荐
- C# 网络通信基础 总结
1.WebClient类 如果只是想从特定的URI(统一资源标识符)请求文件,则可以使用最简单的.NET类,System.Net.WebClient.支持http:.https:和file:标识符开头 ...
- PotPlayer播放器——最强大的播放器 - imsoft.cnblogs
PotPlayer下载:链接 http://pan.baidu.com/s/17vgMM 密码: 8buc PotPlayer关联图标修改方法:打开安装目录替换目录下的PotIcons.dll文件即可 ...
- Matlab 2012a 下载和安装教程
迅雷下载地址 http://bbs.pinggu.org/thread-1426998-1-1.html(下载速度比较快) 1 Setup.exe 2. 不使用 internet 安装 then ...
- Java-->多线程断点续传
--> 在多线程复制的基础上加入断点续传的功能 -->Test 测试类 package com.dragon.java.multithreaddownload; import java.i ...
- c# ICSharpCode.SharpZipLib.Zip实现文件的压缩
首先了解ZipOutPutStream和ZipEntry对象 ZipOutPutStream对象 如果要完成一个文件或文件夹的压缩,则要使用ZipOutputStream类.ZipOutputStre ...
- numpy之sum
Definition : sum(a, axis=None, dtype=None, out=None, keepdims=False) axis: None or int or tuple of i ...
- new总结
基础:c++中,什么时候用 A a;和什么时候用A a=new A; new是在堆上分配内存,它需要用delete释放,否则会造成内存泄漏(使用的内存没有即时释放,造成内存的浪费) int main( ...
- Linux内核编译和运行(转-段玉磊)
内核获取网站:https://www.kernel.org/pub/linux/kernel/ 步骤如下: 1.打开终端,更改用户权限为root.具体做法是在终端输入sudo su,然后按提示输入密码 ...
- nginx绑定多个域名
nginx绑定多个域名涉及到的技术为url rewrite,可以先了解下知识背景再过来学习. 这里以域名:www.sample.com为例 1.在/usr/local/nginx/conf文件夹中创建 ...
- Android—进度条
layout文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...