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

原文地址:https://www.cnblogs.com/suncongbo/p/11994646.html

时间: 2024-10-13 21:45:51

Codeforces 1254C/1255F Point Ordering (交互题)的相关文章

Codeforces 1137D - Cooperative Game - [交互题+思维题]

题目链接:https://codeforces.com/contest/1137/problem/D 题意: 交互题. 给定如下一个有向图: 现在十个人各有一枚棋子(编号 $0 \sim 9$),在不知道 $t,c$ 的值的情况下,他们同时从home出发,要最终到达flag处. 你只能选择移动哪几个人的棋子,但棋子移动到哪里由程序确定并给出. 题解: 看网上大佬一个神仙解法……看得我一愣一愣的…… 选定两颗棋子,第一颗每次都移动,第二颗隔一次移动一次.所以,进行了 $2t$ 次之后第二颗棋子刚好

Codeforces Round #504 E - Down or Right 交互题

1023E 题意: 交互题.在一个有障碍地图中,问如何走才能从(1,1)走到(n,n),只能向右或者向左走.每次询问两个点,回复你这两个点能不能走通. 思路: 只用最多2*n-2次询问.从(1,1),能向右走就向右走,不能就向下走,直到走到斜对角线上.从(n,n)出发,能向上走就向上走,不能就向左走,直到走到斜对角线上. 因为保证有路,所以最后输出(1,1)出发的正向路径,加上从(n,n)出发的反向路径. #include <algorithm> #include <iterator&g

E. XOR Guessing 交互题 Educational Codeforces Round 71 (Rated for Div. 2)

E. XOR Guessing 交互题. 因为这个数最多只有14位 0~13,所以我们可以先处理后面7位,然后再处理后面7位. 因为异或的性质,如果一个数和0异或,那么就等于本身. 所以我们第一次异或1~100 所以 后面从7到13位就都是0,所以结果的后面的7位就可以算出来. 然后同理可以把前面七位找到. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm>

Codeforces Round #257 (Div. 2) E题:Jzzhu and Apples 模拟

E. Jzzhu and Apples time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Jzzhu has picked n apples from his big apple tree. All the apples are numbered from 1 to n. Now he wants to sell them to

CF 714D Searching Rectangles 交互题 二分

题意:交互题,已知一个n*n的地图,电脑藏了两个不相交的矩形(矩形的边和坐标轴平行).每次向电脑询问左下[x1,y1]右上[x2,y2]的矩形内完全包含多少个藏着的矩形.n<=2^16.请在200次内猜出两个矩形左下,右上坐标. 先二分出两个不相交矩形的分界线,要么横着要么竖着.接在在每一快中二分出矩形的四条边即可(最左,右,上,下边界) #include <bits/stdc++.h> using namespace std; int n,ans[20],cnt=0; inline i

Moscow Subregional 2010 Problem K. KMC Attacks 交互题、队列优化、枚举

ACM ICPC 2010-2011 NEERC Moscow Subregional Contest Moscow, October 24, 2010 Problem K. KMC Attacks Time limit: 2 seconds Memory limit: 256 megabytes Warrant VI is a remote planet located in the Koprulu Sector. Warrant VI features a strange huge fiel

CodeForces 707A Brain&#39;s Photos (水题)

题意:给一张照片的像素,让你来确定是黑白的还是彩色的. 析:很简单么,如果有一种颜色不是黑白灰,那么就一定是彩色的. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #i

Codeforces 828B Black Square(简单题)

Codeforces 828B Black Square(简单题) Description Polycarp has a checkered sheet of paper of size n?×?m. Polycarp painted some of cells with black, the others remained white. Inspired by Malevich's "Black Square", Polycarp wants to paint minimum pos

Codeforces Round #243 (Div. 1) A题

http://codeforces.com/contest/425/problem/A 题目链接: 然后拿出这道题目是很多人不会分析题目,被题目吓坏了,其中包括我自己,想出复杂度,一下就出了啊!真是弱! 直接暴力求出矩阵数值,然后枚举每一个[I,J];再O[N]判断,分配好在[I,J]区间的数和之内的数,再排序下SOLO了 CODE:#include <cstdio> #include <cstring>#include <queue>#include <vect