博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51Nod1336 RMQ逆问题 其他
阅读量:4338 次
发布时间:2019-06-07

本文共 2035 字,大约阅读时间需要 6 分钟。

原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1336.html

题意

 

题解

  我们将输入的一个区间的答案称为 V 。

  我们考虑存在排列的两个充分必要条件:

  1. 一个值 V 只会出现在 询问结果为 V 的区间 中。

  2. 对于任意一个 V ,所有询问结果不大于 V 的区间的并中,只可能出现不大于 V 的值。

  于是我们只需要按照询问区间的 V 从小到达排序,然后依次处理即可。

代码

#include 
using namespace std;const int N=205;int read(){ int x=0; char ch=getchar(); while (!isdigit(ch)) ch=getchar(); while (isdigit(ch)) x=(x<<1)+(x<<3)+ch-48,ch=getchar(); return x;}struct HashTable{ int v[N],n; void clear(){n=0;} void push(int x){v[++n]=x;} void Hash(){sort(v+1,v+n+1);n=unique(v+1,v+n+1)-v-1;} int find(int x){return lower_bound(v+1,v+n+1,x)-v;}}p,v;int T,n,m;vector
vs[N];struct Seg{ int L,R,v; Seg(){} Seg(int _L,int _R,int _v){ L=_L,R=_R,v=_v; }}s[N],t[N];bool Getline(){ for (int i=1;i<=m;i++){ s[i].L=read(); s[i].R=read(); s[i].v=read(); p.push(s[i].L),p.push(s[i].L+1); p.push(s[i].R),p.push(s[i].R+1); v.push(s[i].v); } p.Hash(); v.Hash(); for (int i=1;i<=v.n;i++) vs[i].clear(); for (int i=1;i<=m;i++){ s[i].L=p.find(s[i].L); s[i].R=p.find(s[i].R); s[i].v=v.find(s[i].v); vs[s[i].v].push_back(i); } for (int i=1;i<=v.n;i++){ int L=-1,R=p.n+1; for (vector
:: iterator p=vs[i].begin();p!=vs[i].end();p++){ L=max(L,s[*p].L); R=min(R,s[*p].R); } if (L>R) return 0; t[i]=Seg(L,R,v.v[i]); } return 1;}int cover[N];void solve(){ p.clear(),v.clear(); n=read(),m=read(); if (!Getline()){ puts("Impossible"); return; } memset(cover,0,sizeof cover); for (int i=1;i<=v.n;i++){ int cnt=0,L=t[i].L,R=t[i].R,val=v.v[i]; for (int j=L;j<=R;j++) if (!cover[j]) cnt+=p.v[j+1]-p.v[j]; for (vector
:: iterator P=vs[i].begin();P!=vs[i].end();P++) for (int j=s[*P].L;j<=s[*P].R;j++) cover[j]=1; int tot=0; for (int j=1;j<=p.n;j++) if (cover[j]) tot+=p.v[j+1]-p.v[j]; if (cnt==0||tot>v.v[i]){ puts("Impossible"); return; } } puts("Possible");}int main(){ T=read(); while (T--) solve(); return 0;}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/51Nod1336.html

你可能感兴趣的文章
su 与 su - 区别
查看>>
C语言编程-9_4 字符统计
查看>>
在webconfig中写好连接后,在程序中如何调用?
查看>>
限制用户不能删除SharePoint列表中的条目(项目)
查看>>
feign调用spring clound eureka 注册中心服务
查看>>
ZT:Linux上安装JDK,最准确
查看>>
LimeJS指南3
查看>>
关于C++ const成员的一些细节
查看>>
《代码大全》学习摘要(五)软件构建中的设计(下)
查看>>
C#检测驱动是否安装的问题
查看>>
web-4. 装饰页面的图像
查看>>
微信测试账户
查看>>
Android ListView上拉获取下一页
查看>>
算法练习题
查看>>
学习使用Django一 安装虚拟环境
查看>>
Hibernate视频学习笔记(8)Lazy策略
查看>>
CSS3 结构性伪类选择器(1)
查看>>
IOS 杂笔-14(被人遗忘的owner)
查看>>
自动测试用工具
查看>>
前端基础之BOM和DOM
查看>>