Codeforces 1254C/1255F Point Ordering (交互题)
题目链接
http://codeforces.com/contest/1254/problem/C
题解
sb题。
第一次,通过\((n-2)\)次询问2确定\(p[2]\),也就是从\(1\)来看“最逆时针”的点。
第二次,通过\((n-2)\)次询问1确定每个点与\(a_1a_{p_2}\)这条直线的距离,并将所有点按该值排序。设排序后的数组是\(s_3,s_4,...\).
第三次,通过\((n-3)\)次询问2将所有点定序。我们实际上就是要将\((n-2)\)个点分成两组,一组从前往后,一组从后往前。每次询问2 1 s[i] s[i+1], 若答案为\(1\), 说明\(s_i\)是在第一组,否则在第二组。
时间复杂度\(O(n\log n)\), 总询问次数\((3n-7)\).
代码
#include<bits/stdc++.h>
#define pli pair<llong,int>
#define llong long long
using namespace std;
const int N = 1000;
int p[N+3]; pli s[N+3];
int n;
int main()
{
scanf("%d",&n);
p[1] = 1; p[2] = 2;
for(int i=3; i<=n; i++)
{
printf("2 %d %d %d\n",1,i,p[2]); fflush(stdout);
int x; scanf("%d",&x); if(x==1) {p[2] = i;}
}
for(int i=2; i<=n; i++)
{
if(i==p[2]) continue;
printf("1 %d %d %d\n",1,p[2],i); fflush(stdout);
scanf("%I64d",&s[i].first); s[i].second = i;
}
sort(s+2,s+n+1);
int tp1 = 2,tp2 = n+1;
for(int i=3; i<n; i++)
{
int u = s[i].second;
printf("2 %d %d %d\n",1,s[i].second,s[i+1].second); fflush(stdout);
int x; scanf("%d",&x);
if(x==-1) {p[--tp2] = s[i].second;}
else {p[++tp1] = s[i].second;}
}
p[++tp1] = s[n].second;
for(int i=0; i<=n; i++) printf("%d ",p[i]); fflush(stdout);
return 0;
}
Codeforces 1254C/1255F Point Ordering (交互题)的更多相关文章
- codeforces 1019B The hat 【交互题+二分搜索】
题目链接:戳这里 学习题解:戳这里
- Codeforces 1137D - Cooperative Game - [交互题+思维题]
题目链接:https://codeforces.com/contest/1137/problem/D 题意: 交互题. 给定如下一个有向图: 现在十个人各有一枚棋子(编号 $0 \sim 9$),在不 ...
- Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)
https://codeforces.com/contest/1061/problem/F 题意 假设存在一颗完全k叉树(n<=1e5),允许你进行最多(n*60)次询问,然后输出这棵树的根,每 ...
- Codeforces Round #371 (Div. 2) D. Searching Rectangles 交互题 二分
D. Searching Rectangles 题目连接: http://codeforces.com/contest/714/problem/D Description Filya just lea ...
- Codeforces Round #499 (Div. 2) D. Rocket_交互题_二分
第一次作交互题,有点不习惯. 由于序列是循环的,我们可以将一半的机会用于判断当前是否是在说谎,另一半的机会用于二分的判断. 对于判断是否实在说谎,用1判断即可.因为不可能有比1还小的数. 本题虽然非常 ...
- Codeforces Round #504 E - Down or Right 交互题
1023E 题意: 交互题.在一个有障碍地图中,问如何走才能从(1,1)走到(n,n),只能向右或者向左走.每次询问两个点,回复你这两个点能不能走通. 思路: 只用最多2*n-2次询问.从(1,1), ...
- Codeforces Round #525 (Div. 2) D. Ehab and another another xor problem(交互题 异或)
题目 题意: 0≤a,b<2^30, 最多猜62次. 交互题,题目设定好a,b的值,要你去猜.要你通过输入 c d : 如果 a^c < b^d ,会反馈 -1 : 如果 a^c = b^ ...
- Codeforces Round #551 (Div. 2) E. Serval and Snake (交互题)
人生第一次交互题ac! 其实比较水 容易发现如果查询的矩阵里面包含一个端点,得到的值是奇数:否则是偶数. 所以只要花2*n次查询每一行和每一列,找出其中查询答案为奇数的行和列,就表示这一行有一个端点. ...
- E. XOR Guessing 交互题 Educational Codeforces Round 71 (Rated for Div. 2)
E. XOR Guessing 交互题. 因为这个数最多只有14位 0~13,所以我们可以先处理后面7位,然后再处理后面7位. 因为异或的性质,如果一个数和0异或,那么就等于本身. 所以我们第一次异或 ...
随机推荐
- StoneTab标签页CAD插件 3.2.6
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- 初学java4 循环的使用
for循环 for(初始条件;循环终止条件;循环结束后所执行代码){ 循环体 } while循环 while(循环终止条件){ 循环体 } do while循环 do{ }while(循环终止条件);
- android-studio-ide 安装到运行第一个helloword,坑记录
1: 安装是提示 机器虚拟化问题,系统如开启了Hyper-V,必须关闭服务 2:安装完后,建立第一个项目,gradle build 一直转圈,最后报错 Gradle project sync fai ...
- css 对div用hover设置border,出现抖动和div走位问题,解决方法
样式设置 : div:hover { border:1px solid red;} 当鼠标移动到div时,产生抖动和偏移. 产生的原因: 是因为设置border时设置了1px边框,多出的这1px,与其 ...
- ES6入门六:class的基本语法、继承、私有与静态属性、修饰器
基本语法 继承 私有属性与方法.静态属性与方法 修饰器(Decorator) 一.基本语法 class Grammar{ constructor(name,age){ //定义对象自身的方法和属性 t ...
- js中的函数提升和变量提升
变量提升和函数提升: 就是将变量声明或者函数全部代码提升到当前作用域(全局作用域或函数作用域)最开始的部分. JavaScript中函数域为最小域范围:for循环.while循环.if语句.switc ...
- 关于dataset
举个栗子: <div id="cost" data-drink="coffee" data-food="sushi" data-mea ...
- LeetCode 滑动窗口题型整理
一.滑动窗口题型模板 /* * 滑动窗口类型: 模板 */ public List<Integer> slideWindowMode(String s, String t) { // 1 ...
- 将windows当做linux/Mac来用 scoop强大的包管理工具
在Linux中有apt-get.yum这些包安装管理 安装相当方便:如ubuntu安装一个mysql5.7,只需要一个简单的命令: apt-get 而在windows中需要在MySQL官网下载对应版本 ...
- unomp 矿池运行问题随记
经过大量的实践,遇到的问题或经验如下: 1.单机运行多矿池时,单机CPU核心数 成为性能瓶颈,运行两个月后,有部分用户反映 矿机速率只有以前的一半. 2.Dash 等可以自行报块的矿池,每个块的股份比 ...