CF1090F - How to Learn You Score

Solution

很不戳的构造题。

首先观察数据范围:n∈[5,1000]n\in[5,1000]n∈[5,1000],这启发我们什么?n=5n=5n=5的时候解是唯一的,因此我们可以把nnn切成若干段长度为555的段,每一段分别求答案,最后拼起来。

然后我们考虑长度为555的段,显然4n4n4n的询问上界允许我们把十种三元组都询问出来。

我们先确定这些数的值,而不考虑位置,设这五个值从小到大依次为a1...a5a_1...a_5a1​...a5​,十种三元组:123,124,134,125,135,145,234,235,245,345123,124,134,125,135,145,234,235,245,345123,124,134,125,135,145,234,235,245,345。

因此十种三元组的值为13,14,14,15,15,15,24,25,25,3513,14,14,15,15,15,24,25,25,3513,14,14,15,15,15,24,25,25,35,且其中的排序关系基本可以知道了,为13<14<15?24<25<3513<14<15\;?\;24<25<3513<14<15?24<25<35,到这里我们已经可以通过询问值的加减求出每个数的值了(详见CodeCodeCode)。

接下来就是确定每个值的位置,因为我们已经证明 了555的时候解唯一,因此直接5!5!5!枚举全排列即可。

时间复杂度O(n)O(n)O(n),询问次数2n2n2n。

Code

#include <bits/stdc++.h>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; }#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 secondtypedef 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-9;
const lod pi = acos(-1);
const int oo = 1 << 30;
const ll loo = 1ll << 60;
const int mods = 998244353;
const int MAXN = 600005;
const int INF = 0x3f3f3f3f; //1061109567
/*--------------------------------------------------------------------*/#define int llstruct Anode{ int x, y, z, s; } A[20];
int Ans[MAXN], n;int min(int x, int y, int z) { return min(x, min(y, z)); }
int max(int x, int y, int z) { return max(x, max(y, z)); }
void solve(int l, int r) {int num = 0;for (int i = l; i <= r ; ++ i)for (int j = i + 1; j <= r ; ++ j)for (int k = j + 1; k <= r ; ++ k) {cout << "? " << i << " " << j << " " << k << endl;cin >> A[++ num].s;A[num].x = i, A[num].y = j, A[num].z = k;}sort(A + 1, A + num + 1, [&](Anode a, Anode b) { return a.s < b.s; });int s13 = A[1].s;int s25 = A[9].s;int s35 = A[10].s;int s15 = (A[4].s == A[5].s ? A[4].s : (A[5].s == A[6].s ? A[5].s : A[4].s));int s24 = A[4].s + A[5].s + A[6].s + A[7].s - s15 * 3;int s135 = (s13 + s15 + s35) / 2;Ans[l] = s135 - s35;Ans[l + 2] = s135 - s15;Ans[l + 4] = s135 - s13;Ans[l + 1] = s25 - Ans[l + 4];Ans[l + 3] = s24 - Ans[l + 1];sort(Ans + l, Ans + l + 5);for (;;) {int flag = 1;for (int i = 1; i <= num ; ++ i)if (min(Ans[A[i].x], Ans[A[i].y], Ans[A[i].z]) + max(Ans[A[i].x], Ans[A[i].y], Ans[A[i].z]) != A[i].s) { flag = 0; break; }if (flag) return;next_permutation(Ans + l, Ans + l + 5);}
}
signed main() {cin >> n;for (int i = 1; i + 4 < n ; i += 5) solve(i, i + 4);solve(n - 4, n);cout << "! ";for (int i = 1; i <= n ; ++ i) cout << Ans[i] << " "; cout << endl;return 0;
}

CF1090F - How to Learn You Score(构造)相关推荐

  1. 论文笔记之:Generative Adversarial Text to Image Synthesis

    Generative Adversarial Text to Image Synthesis ICML 2016  摘要:本文将文本和图像练习起来,根据文本生成图像,结合 CNN 和 GAN 来有效的 ...

  2. clojure java.jdbc_Clojure驱动的Web开发

    Clojure是运行在JVM之上的Lisp方言,提供了强大的函数式编程的支持.由于Java语言进化的缓慢,用Java编写大型应用程序时,代码往往十分臃肿,许多语言如Groovy.Scala等都把自身设 ...

  3. ORBSLAM的ORB特征到底从哪儿来?

    ORBSLAM中的主要使用了ORB特征,也就是FAST特征+BRIEF描述子的组合,具体这两种方法就不详细介绍了,这里主要说一下每个特征对应的描述子在ORBSLAM中的维护方式: 首先需要说明的是每个 ...

  4. 《Python自然语言处理-雅兰·萨纳卡(Jalaj Thanaki)》学习笔记:08 自然语言处理中的机器学习方法

    08 自然语言处理中的机器学习方法 8.1 机器学习的基本概念 8.1.1 ML类型 8.1.2 ML 监督学习 8.1.3 无监督学习 8.1.4 强化学习 8.2 自然语言处理应用的开发步骤 8. ...

  5. 解决Spark窗口统计函数rank()、row_number()、percent_rank()的OOM问题

    目录 1.    窗口函数功能介绍 一个简单的例子 一个复杂的例子 2.数据量过大时的OOM问题 问题及原因 解决方法1:用SQL处理 解决方法2:转为rdd进行处理 解决方法3:将数据量过多的分组进 ...

  6. Spring Data JPA分页查询

    使用Spring Data JPA的朋友,在实际工作中经常需要用到分页查询.下面介绍一个简单的分页查询的例子:查询学生信息,每页10行数据,并按成绩排序.先看数据表: 实现:repo需要继承Pagin ...

  7. 牛客华为题库刷题笔记

    split分隔符总结 \ split("\\\\") . split("\\.") / split("\\/") - split(" ...

  8. 【Echarts】全国大学信息可视化

    文章目录 写在前面 Stacked Area Chart(堆叠面积图) Stacked Horizontal Chart(堆叠条形图) Chinese Distribution Map(中国分布地图) ...

  9. C++:STL超全用法归纳

    前言 本文是结合黑马程序员C++教程中STL部分和笔者自身理解整理而成,增加了程序缺失的头文件,保证每个程序都可以运行.同时为方便理解,增加了引入图片和部分程序的输出结果 目录在左下角 配套视频:ht ...

最新文章

  1. unity3d Update()和FixedUpdate()的区别
  2. python第七关再来一盘_7、 Python系列,七,的,集合
  3. iOS 开发之获取时间到年底可能会踩到的坑
  4. Linux 命令之 userdel -- 用于删除给定的用户以及与用户相关的文件
  5. Java——集合(模拟斗地主洗牌和发牌进行排序)
  6. 领航机器人广告段子_医院机器人物流广告词_段子网收录最新段子
  7. python小括号( )与中括号 [ ]
  8. 语法制导的翻译是如何实现的_考研寄宿:怎样提高英语翻译的能力?
  9. 8253/8255/8259相关知识
  10. java 垃圾回收题目_我肝了万字的Java垃圾回收,看完你还敢说不会?
  11. 浅谈 malloc 函数在单片机上的应用
  12. ROC曲线的绘制过程/AUC/TPR、FPR、敏感度和特异度
  13. 网络故障排查流程及工具使用手册
  14. 手机号码是如何构成的?
  15. 这几个拍图读字软件你见过吗?附赠使用方法
  16. 山东大学软件工程应用与实践——WeaselTSF(一)
  17. acrobat如何设置可以使pdf输入页码时自动跳到正文对应的页码
  18. Unity 制作和绑定骨骼动画简要过程
  19. 我读Saliency Filters cvpr 2012
  20. EditPlus中文版+英文版+注册码下载

热门文章

  1. 全球顶级大学,在中国录取率却不足0.5%,答案一针见血!
  2. 私房钱就藏在老婆眼皮底下
  3. 我背着女朋友,用 Python 偷偷抓取了她的行踪
  4. 人生苦短,我用Python!
  5. tinyid 教程_tinyid
  6. python wx提示框字体_使用wxStyledTextCtrl实现代码提示
  7. mysql中查询出现的错误_在MySQL查询中查询语法错误
  8. 润乾报表分组求和_实现报表数据预先计算
  9. mobile.php discuz,电脑访问discuz手机版【触屏版跳转标准版的修改方法】
  10. java emoji编码转换_java转换emoji表情