NEERC 17 Problem I. Interactive Sort

NEERC 17 Problem I. Interactive Sort

Solution

当写了两倍正解的代码使用了两倍于正解的操作步数……

刚开始的想法是求出一个 b b b,再求出一个 a a a,依次轮换,分别维护当前知道确定值的 a , b a,b a,b的有序序列,然后求 a a a就在 b b b的有序序列里二分,确定大致范围,再暴力求出当前数的大小并更新 b b b中每个数的上下界,求 b b b同理。

这样操作次数应该是 O ( n l g n ) O(nlgn) O(nlgn)的,然而常数太大了……,需要接近 40 W 40W 40W次操作。

而正解则是上一个做法的一半。。。
我们依次用上述方法求出每一个 b b b,可以发现显然到最后 a a a中的数的上下界相等,可以唯一确定一个 a a a,所以大概只需要一半的操作步数了。

时间复杂度 O ( n 2 ) O(n^2) O(n2),代码是 O ( n 2 l g n ) O(n^2lgn) O(n2lgn)的,多一个 m a p map map也没慢多少。

Code one

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>

#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se second

using namespace std;

template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }

typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;

const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
int example_a[MAXN],example_b[MAXN];
inline int read() { int x; scanf("%d",&x); return x; }
inline char get_ch() { char c=' '; while (c!='<'&&c!='>') scanf("%c",&c); return c; }
inline char get_chxy(int x,int y) { return example_a[x]<example_b[y]?'<':'>'; }

map<PR,int> Map;
int la[MAXN],lb[MAXN],ra[MAXN],rb[MAXN],a[MAXN],b[MAXN],Ansa[MAXN],Ansb[MAXN],ida[MAXN],idb[MAXN],n,Num=0;

int get(int x,int y)
{
	if (Map.count(MP(x,y))) return Map[MP(x,y)];
	printf("? %d %d\n",x,y),fflush(stdout);
	return Map[MP(x,y)]=(get_ch()=='>');
}

PR geta(int x)
{
	int l=1,r=x,L,R;
	while (l<r)
	{
		int mid=(l+r+1)>>1;
		if (get(x,idb[mid])) l=mid;
		else r=mid-1;
	}
	if (!get(x,idb[l])) L=1,R=b[l];
	else L=b[l],R=(l+1>x?n:b[l+1]);
	return MP((L&1)?L+1:L,(R&1)?R-1:R);
}
void solvea(int t)
{
	int num=0;
	PR x=geta(t);
//	Num=0;
	for (int j=1;j<=(n+1)>>1;j++)
	{
		if (rb[j]<x.fi) num++;
		if (lb[j]<x.se&&x.fi<rb[j]) num+=get(t,j),Num++;
	}
//	cout<<"AQueryNum:"<<Num<<endl;
	Ansa[t]=a[t]=num<<1,ida[t]=t;
	for (int j=1;j<=(n+1)>>1;j++)
		if (Map.count(MP(t,j))) 
		{
			int p=Map[MP(t,j)];
			if (!p) upmax(lb[j],Ansa[t]+1);
			else upmin(rb[j],Ansa[t]-1);
		}
	while (t&&a[t]<a[t-1]) swap(a[t],a[t-1]),swap(ida[t],ida[t-1]),t--;
}

PR getb(int x)
{
	int l=1,r=x-1,L,R;
	while (l<r)
	{
		int mid=(l+r)>>1;
		if (get(ida[mid],x)) r=mid;
		else l=mid+1;
	}
	if (x==1) L=1,R=n;
	else if (!get(ida[r],x)) L=a[r],R=n;
	else L=(r==1?1:a[r-1]),R=a[r];
	return MP((!(L&1))?L+1:L,(!(R&1))?R-1:R);
}
void solveb(int t)
{
	int num=0;
	PR x=getb(t);
//	Num=0;
	for (int j=1;j<=n>>1;j++)
	{
		if (ra[j]<x.fi) num++;
		if (la[j]<x.se&&x.fi<ra[j]) num+=(!get(j,t)),Num++;
	}
//	cout<<"BQueryNum:"<<Num<<" "<<x.fi<<" "<<x.se<<endl;
	Ansb[t]=b[t]=num<<1|1,idb[t]=t;
	for (int j=1;j<=n>>1;j++)
		if (Map.count(MP(j,t))) 
		{
			int p=Map[MP(j,t)];
			if (!p) upmin(ra[j],Ansb[t]-1);
			else upmax(la[j],Ansb[t]+1);
		}
	while (t&&b[t]<b[t-1]) swap(b[t],b[t-1]),swap(idb[t],idb[t-1]),t--;
}
signed main()
{
	n=read();
	srand(time(0));
	for (int i=1;i<=n>>1;i++) example_a[i]=i*2;
	for (int i=1;i<=(n+1)>>1;i++) example_b[i]=i*2-1;
	random_shuffle(example_a+1,example_a+(n>>1)+1);
	random_shuffle(example_b+1,example_b+((n+1)>>1)+1);
	
	for (int i=1;i<=n/2;i++) la[i]=2,ra[i]=n-(n&1);
	for (int i=1;i<=(n+1)/2;i++) lb[i]=1,rb[i]=n-((n&1)^1);
	
	for (int i=1,l,r;i<=n/2;i++) solveb(i),solvea(i);
	if (n&1) solveb((n+1)>>1);
	putchar('!');
	for (int i=1;i<=n/2;i++) printf(" %d",Ansa[i]);
	for (int i=1;i<=(n+1)/2;i++) printf(" %d",Ansb[i]);
	fflush(stdout);
	return 0;
}

Code two

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>

#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se second

using namespace std;

template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }

typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;

const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
int example_a[MAXN],example_b[MAXN];
inline int read() { int x; scanf("%d",&x); return x; }
inline char get_ch() { char c=' '; while (c!='<'&&c!='>') scanf("%c",&c); return c; }
inline char get_chxy(int x,int y) { return example_a[x]<example_b[y]?'<':'>'; }

map<PR,int> Map;
int la[MAXN],ra[MAXN],a[MAXN],b[MAXN],Ansb[MAXN],ida[MAXN],f[MAXN],n,Num=0;

int get(int x,int y)
{
	if (Map.count(MP(x,y))) return Map[MP(x,y)];
	printf("? %d %d\n",x,y),fflush(stdout);
	return Map[MP(x,y)]=(get_ch()=='>');
}
PR getb(int x)
{
	int num=0;
	for (int i=1;i<=n>>1;i++) f[i]=0;
	for (int i=1;i<=n>>1;i++) f[la[i]>>1]=i;
	for (int i=1;i<=n>>1;i++) if (f[i]) ida[++num]=f[i],a[num]=la[f[i]],b[num]=ra[f[i]];
	int l=1,r=num,L,R;
	while (l<r)
	{
		Num++;
		int mid=(l+r)>>1;
		if (get(ida[mid],x)) r=mid;
		else l=mid+1;
	}
	if (!get(ida[r],x)) L=a[r],R=n;
	else L=(r==1?1:a[r-1]),R=b[r];
	return MP((!(L&1))?L+1:L,(!(R&1))?R-1:R);
}
void solveb(int t)
{
	int num=0;
	PR x=getb(t);
	for (int j=1;j<=n>>1;j++)
	{
		if (ra[j]<x.fi) num++;
		if (la[j]<x.se&&x.fi<ra[j]) num+=(!get(j,t)),Num++;
	}
	Ansb[t]=num<<1|1;
	for (int j=1;j<=n>>1;j++)
		if (Map.count(MP(j,t))) 
		{
			int p=Map[MP(j,t)];
			if (!p) upmin(ra[j],Ansb[t]-1);
			else upmax(la[j],Ansb[t]+1);
		}
}
signed main()
{
	n=read();
	if (n==1) { printf("! 1\n"); return 0; }
	for (int i=1;i<=n/2;i++) la[i]=2,ra[i]=n-(n&1);
	for (int i=1,l,r;i<=n/2;i++) solveb(i);
	if (n&1) solveb((n+1)>>1);
	putchar('!');
	for (int i=1;i<=n/2;i++) printf(" %d",la[i]);
	for (int i=1;i<=(n+1)/2;i++) printf(" %d",Ansb[i]);
	fflush(stdout);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值