首页 > 其他 > 详细

【离线】【递推】【multiset】 Codeforces Round #401 (Div. 2) C. Alyona and Spreadsheet

时间:2017-02-24 22:22:17      阅读:255      评论:0      收藏:0      [点我收藏+]

对询问按右端点排序,对每一列递推出包含当前行的单调不下降串最多向前延伸多少。

用multiset维护,取个最小值,看是否小于等于该询问的左端点。

#include<cstdio>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
multiset<int>S;
#define INF 2147483647
struct Data
{
	int l,r,p;
}b[100010];
bool cmp(const Data &a,const Data &b)
{
	return a.r<b.r;
}
int n,m,q,ls[100010];
bool anss[100010];
vector<int>a[100010];
int main()
{
//	freopen("c.in","r",stdin);
	int x;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
	  a[i].push_back(0);
	for(int i=1;i<=n;++i)
	  for(int j=1;j<=m;++j)
	    {
	      scanf("%d",&x);
	      a[i].push_back(x);
	    }
	scanf("%d",&q);
	for(int i=1;i<=m+1;++i)
	  a[0].push_back(INF);
	for(int i=1;i<=q;++i)
	  {
	  	scanf("%d%d",&b[i].l,&b[i].r);
	  	b[i].p=i;
	  }
	sort(b+1,b+1+q,cmp);
	for(int i=1;i<=q;++i)
	  {
	  	for(int j=b[i-1].r+1;j<=b[i].r;++j)
	  	  for(int k=1;k<=m;++k)
	  	    if(a[j][k]<a[j-1][k])
	  	      {
	  	      	multiset<int>::iterator it=S.find(ls[k]);
	  	      	if(it!=S.end())
	  	      	  S.erase(it);
	  	      	ls[k]=j;
	  	      	S.insert(j);
	  	      }
	  	if((*S.begin())<=b[i].l)
	  	  anss[b[i].p]=1;
	  }
	for(int i=1;i<=q;++i)
	  puts(anss[i] ? "Yes" : "No");
	return 0;
}

【离线】【递推】【multiset】 Codeforces Round #401 (Div. 2) C. Alyona and Spreadsheet

原文:http://www.cnblogs.com/autsky-jadek/p/6440265.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!