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

NEERC 17 Problem I. Interactive Sort相关推荐

  1. NEERC 17 G.The Great Wall

    NEERC 17 G.The Great Wall Solution 这题的第一步tricktricktrick是:我们注意到取a,b,ca,b,ca,b,c的集合两两不交且并集为UUU,因此确定了b ...

  2. Codeforces Beta Round #17 C. Balance DP

    C. Balance 题目链接 http://codeforces.com/contest/17/problem/C 题面 Nick likes strings very much, he likes ...

  3. CodeForces - Insertion Sort(打表找规律)

    题目链接:http://codeforces.com/gym/101955/problem/C Time limit:6.0 s Memory limit:1024 MB Problem Descri ...

  4. NEERC 2012

    NEERC 2012 Problem:http://neerc.ifmo.ru/information/problems.pdf Solve:http://neerc.ifmo.ru/informat ...

  5. linux下sort详解(sort对科学记数法的排序)

    1.参数解释 -t 设置分隔符 -k 设置比较域(列) -n 按数字比较 -g 科学记数法方式比较 -o 设置输出文件,与">"相比可以设置输出到原文件,"> ...

  6. B. Shifting Sort (思维)

    思路大家都能想到,代码不是很好写 // Problem: B. Shifting Sort // Contest: Codeforces - Codeforces Round #744 (Div. 3 ...

  7. Full_of_Boys训练1总结

    题目来源: 2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17) A. Arc ...

  8. 【Codeforces #167 Div1 Div2】Solutions

    [A. Dima and Friends] http://www.codeforces.com/contest/272/problem/A 题目大意:n+1个人出手指头,加起来再做类似约瑟夫的出圈,问 ...

  9. 关于 UDP Hole Punching 的资料

    平时用两台电脑,一台 Win, 一台Mac,在这两个平台上进行文件传送非常不方便, 原因是公司不让用企鹅传公司内部文件. 于是想自己写一个传送文件的工具, 服务器使用 GAE,开发语言可以选择 Pyt ...

最新文章

  1. 抓取网络文件的URL地址作附件发送
  2. 图灵科普系列丛书封面有奖征集(贴图送书)
  3. node执行cmd命令方法
  4. 安卓程序添加指纹解锁功能
  5. docker之数据卷管理
  6. Java面典_【Java实用工具】——使用oshi获取主机信息
  7. Error loading WebappClassLoader解决方法
  8. 互联网公司面试必问的mysql题目
  9. Centos-RedHat 添加路由
  10. win32汇编 invoke 和 call区别
  11. 高通QFIL烧录错误求解
  12. Ubuntu下安装使用Monaco字体
  13. hive sql 行列转换
  14. 阿里云服务器搭建以及简易的WEB项目部署过程
  15. k8s环境之cicd部署+远程触发
  16. Spring Boot 2.5.0
  17. 集合竞价选股(股票)
  18. pcs增加mysql资源_pcs命令配置示例(详细版)
  19. 利用wxpython库来制作真心话大冒险小程序
  20. Python学习:给类或者类的对象添加打印内容 def __repr__(self)

热门文章

  1. 基于python的随机森林回归实现_随机森林理论与python代码实现
  2. 被清华免试录取的围棋天才,横扫60位围棋大师的最强AI,竟然都输给了高中生!?...
  3. 年轻人也太禁不起诱惑了吧?
  4. 知乎超高赞:都有哪些习惯值得长期坚持?
  5. 学校老师绝对不会教的方法,让你的孩子拥有一个开挂般的人生!
  6. python柱状图挨在一起_echarts多个柱状图展示问题(bar都挤到一起了)
  7. linux的自定义input,linux键值到Android键值的转换与自定义
  8. java定时器写法_java定时器的写法是什么样?
  9. 川大计算机文化基础在线作业,川大1309《计算机文化基础0008》在线作业2答案.docx...
  10. 计算数字的出现次数 java_关于Java:如何计算数字在.txt文件中出现的次数