NEERC 17 Problem I. Interactive Sort

NEERC 17 Problem I. Interactive Sort

Solution

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

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

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

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

时间复杂度O(n2)O(n^2)O(n2),代码是O(n2lgn)O(n^2lgn)O(n2lgn)的,多一个mapmapmap也没慢多少。

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 secondusing 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 secondusing 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.Net Core 微服务容器系列基础目录篇

1.开场白HI&#xff0c;各位老铁&#xff0c;大家端午好&#xff0c;之前写了些关于.net core商城系列的文章&#xff0c;有点乱&#xff0c;今天心血来潮想着整理一下&#xff08;今天只是先把目录列出来&#xff0c;后面的每篇文章这两天会进行重新修改的&#xff0c;目前先将…

CF 1475 D. Cleaning the Phone 思维模型

传送门 题意&#xff1a;一个人有n个程序&#xff0c;每个程序都有占的缓存和价值。现在要释放m及以上的缓存&#xff0c;求失去的价值的最小值。 题解 首先我们知道如果所有缓存加起来 < m 的话&#xff0c;直接输出 - 1 就行啦。 其次呢&#xff0c;我们发现价值只有1和2…

NEERC 17 G.The Great Wall

NEERC 17 G.The Great Wall Solution 这题的第一步tricktricktrick是&#xff1a;我们注意到取a,b,ca,b,ca,b,c的集合两两不交且并集为UUU&#xff0c;因此确定了b,cb,cb,c之后可以简单地唯一确定aaa&#xff0c;于是我们通过让bi−ai,ci−ai,Ans∑aib_i-a_i,c_i-a_i,Ans\sum…

感谢诸君的陪伴,见证微信 SDK 的成长,内含黑科技福利

Senparc.Weixin SDK5000Stars5000 Star5005005000 Stars今天 SDK 已经超过 5000 Stars在此感谢大家的每一份支持和一直以来的关注是你们的信任和陪伴给了我们前行的力量 在未来的日子里也希望大家能够继续支持我们我们将以优秀的产品和服务来回馈你们的支持&#xff01;愿我们携…

NEERC13 Problem H.Hack Protection

NEERC13 Problem H.Hack Protection Solution 注意到题目中的区间与&#xff0c;在左端点lll确定的情况下&#xff0c;对于所有r≥lr\geq lr≥l&#xff0c;ANDl,rAND_{l,r}ANDl,r​只有logloglog种取值&#xff0c;这是一个极为常见的性质。 于是我们从大到小枚举lll&#…

ABC 189 E - Rotate and Flip 矩阵转移

传送门 题意&#xff1a;给定n个点&#xff0c;m个操作&#xff0c;n和m都是1e5级别的。让后每个操作是将这个点绕原点顺时针、逆时针转90&#xff0c;将这个点按照 x p 或着 y p 做对称。再有q个询问&#xff0c;q也是1e5级别的。让后每个询问是问B这个点在第A次操作之后在…

我,宇宙最强编辑器,支持远程开发

Visual Studio Code 五月份更新之 1.35 版本已发布。此次更新的亮点包括更新 Visual Studio Code 图标 - 新版本更新了 logo。改进“转到定义&#xff08;Go to Definition&#xff09;”行为 - 通过多个定义的显示&#xff0c;更快速进行导航&#xff08;Navigation&#xff0…

ARC068C - Snuke Line

ARC068C - Snuke Line Description 其实就是给出nnn个区间[li,ri][l_i,r_i][li​,ri​]对于每一个i∈[1,M]i\in[1,M]i∈[1,M]&#xff0c;求&#xff1a; ∑j1n[⌊rji⌋−⌊lj−1i⌋≥1]\sum_{j1}^n[\lfloor \frac{r_j}{i}\rfloor-\lfloor \frac{l_j-1}{i}\rfloor\geq 1]j1∑…

.NET Core Run On Docker By Kubernetes 系列文章汇总

前言介绍.NET Core是微软新一代主力编程平台&#xff0c;开源、免费、跨平台、轻量级、高性能&#xff0c;支持Linux、Docker、k8s等环境&#xff0c;适合开发微服务、云原生、大型互联网应用、全开源解决方案。Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们…

HDU - 1811 Rank of Tetris 并查集 + 拓扑序 +me

link 题意&#xff1a; 首先看到排名自然想到拓扑序&#xff0c;但是存在等于的情况&#xff0c;这就启发我们把等于的情况缩成一个点&#xff0c;让后在缩点后的图中进行拓扑即可。 对于不合法的情况当然是拓扑序没有遍历到应该遍历的点&#xff0c;所以只需要检查遍历了几个…

[ARC072C]Alice in linear land(dp,贪心)

[ARC072C]Alice in linear land Description 给定a1...ana_1...a_na1​...an​和DDD&#xff0c;mmm轮询问&#xff0c;每轮询问给你一个qqq&#xff0c;可以让你任意修改aqa_qaq​的值&#xff0c;然后从小到大对于每一个iii让Dmin(D,D−ai)Dmin(D,D-a_i)Dmin(D,D−ai​)&am…

.NET Core 中使用 Humanizer 显示友好时间格式

今天在将一个 .net framework 项目迁移至 .net core 的过程中&#xff0c;在迁移到显示友好时间格式&#xff08;比如“1分钟前”&#xff0c;“1小时前”&#xff09;的代码时&#xff0c;找了找看有没有对应的开源库&#xff0c;结果找到了 Humanizer &#xff0c;顺手体验了…

Codeforces Round #698 (Div. 2)

B题 题意&#xff1a;定义一个牛逼的数是这个数十进制中至少包含一个数d。 现在给定d和若干询问&#xff0c;每个询问一个x&#xff0c;问x能否分解成若干d构成的牛逼的数之和。 看起来挺难搞的&#xff0c;不能快速的判断是否是牛逼的数而且也不能很好的挑选合适的数组成x。那…

[ARC073C] Ball Coloring(贪心)

[ARC073C] Ball Coloring Solution 我们发现编号的最大值maxmaxmax必然会在Rmax,BmaxR_{max},B_{max}Rmax​,Bmax​中至少一个出现&#xff0c;最小值minminmin必然会在Rmin,BminR_{min},B_{min}Rmin​,Bmin​中至少一个出现。 因此会有四种情况&#xff1a; Rmaxmax,Rminmi…

P2831 [NOIP2016 提高组] 愤怒的小鸟 状压dp

某谷链接 题意&#xff1a;选最少的抛物线来覆盖所有点。 注意到a<0&#xff0c;所以我们可以枚举两个点来构成一条抛物线&#xff0c;让后记这两个点构成的抛物线为 cov[i][j]cov[i][j]cov[i][j]&#xff0c;让后他存的是这个抛物线能覆盖到的点的集合&#xff0c;把它存成…

Visual Studio 2019 16.1 使用 .NET Core 3.0

一.前言早在很久之前微软便公布 .NET Core 3.0 将支持开发Winform应用程序等等新特性&#xff0c;现如今 .NET Core 3.0 预览版已经出来第五个预览版了&#xff0c;从 .NET Core 2.2 到 3.0 将是一个大的跨越&#xff0c;从发布的预览版本个数来看&#xff0c;将会增加很多的功…

P4288 [SHOI2014]信号增幅仪 最小圆覆盖

传送门 题意&#xff1a;给出一些点&#xff0c;让后让你用一个ba1p\frac{b}{a}\frac{1}{p}ab​p1​的且绕x正方向逆时针转动了a的椭圆覆盖&#xff0c;求最小的b。 由于题目中椭圆是绕x正方向逆时针旋转了a&#xff0c;为了方便写出方程&#xff0c;我们可以先把它顺时针转回…

[ARC074C] RGB Sequence(dp)

[ARC074C] RGB Sequence Solution 显然是一道dpdpdp&#xff0c;我们发现直接维护当前状态有多少种颜色不好维护&#xff0c;因为颜色只有333种&#xff0c;所以可以直接记录每一种颜色最晚在哪里出现&#xff0c;令fi,j,k,lf_{i,j,k,l}fi,j,k,l​表示前iii个里RRR最晚在jjj&…

Insider Dev Tour 2019 全球巡演 苏州站

Insider Dev Tour微软&#xff0c;全球&#xff0c;巡演&#xff0c;内幕大会介绍Insider Dev Tour 是 Microsoft Build 技术大会的全球巡演活动&#xff0c;是微软面向广大开发者、技术爱好者&#xff0c;介绍其未来技术发展方向的盛会。在 Microsoft Build之后&#xff0c;会…

CERC17 Problem L - Lunar Landscape(差分,坐标系)

CERC17 Problem L - Lunar Landscape Solution 如果只有AAA&#xff0c;我们可以简单地使用差分解决。 加入了BBB之后&#xff0c;可以把单位正方形用对角线拆成四个等腰Rt&#xff0c;统计等腰Rt的个数。我们先进行坐标转换&#xff0c;把(x,y)−>(x−y,xy)(x,y)->(x-…