NEERC 17 I Interactive Sort (交互题)

交互题 codeforces C. Bear and Prime 100 To flush you can use (just after printing an integer and end-of-line): fflush(stdout) in C++; System.out.flush() in Java; stdout.flush() in Python; flush(output) in Pascal; 阅读详情

题意:

       给出1到n这n个数的任意一个排列,然后奇数按顺序分到o数组,偶数按顺序分到e数组,你每次可以询问e数组中第i个和o数组中第j个的大小情况,查询结束后输出结果,查询次数最多30 000次,n≥1000n≥1000

思路:

       我们先想,如果e是有序的,那么我们就可以枚举奇数组中每个数字,然后每次都二分,次数为O(nlogn)O(nlogn)。但是此时e是无序的,所以我们要想办法让e变得有序来减少询问次数。
        我们先用o数组中的数xx,和e数组中每个数字比较关系,查询n/2次,会发现,我们不仅确定了这个数字的大小,也将e数组切成了两块(一块里面的数字都比x小,一块里面数字都比x大,块内数字无序)。
        按照这个方法接着向下做,我们会发现,对于每个奇数,我们能利用这个奇数把某一个偶数块切成两块,这样我们最后会把偶数切成n/2块,也就确定了每个偶数的大小。这样我们就能O(n2)O(n2)枚举得到结果。
       可是询问次数不允许,我们不能O(n2)O(n2)枚举。我们发现偶数块其实也是具有一定的单调性的(虽然内部无序),我们可以用偶数块中某一个数字代表这个块,每次奇数查询的时候利用这个数字进行二分,二分就可以找到第一个代表值大于当前奇数的偶数块,这块以及前面一块都是有可能的(因为块内部是无序的),然后遍历两个块才能判断出到底需要的是哪一块。
       这种做法最差情况下询问次数是O(n2)O(n2)的,但是题目保证数据是随机的,所以可以当作是O(nlogn)O(nlogn)的,而且因为n才1000,时间却有10秒,所以怎么随意暴力都是可以的

错误及反思:

       边界处理需要特判

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 11000;
int ans1[N],ans2[N],n,tot=1;
vector<int> v[N];

int change(int p,int x){
    int ans=0;

    for(int i=1;i<p;i++)
        ans+=v[i].size();

    vector<int> vv[2];

    for(int i=0;i<v[p].size();i++){
        printf("? %d %d\n",v[p][i],x);
        fflush(stdout);
        char t[10]; scanf("%s",t);
        if(t[0]=='<'){
            ans++;
            vv[0].push_back(v[p][i]);
        }
        else vv[1].push_back(v[p][i]);
    }

    if(vv[0].size()&&vv[1].size()){
        tot++;
        for(int i=tot;i>p;i--) v[i]=v[i-1];
        v[p]=vv[0];
        v[p+1]=vv[1];
    }
    else if(vv[1].size()==0){
        return n%2?n:n-1;
    }
    else if(p==1){
        return 1;
    }
    else{
        p--;

        ans=0;
        vv[0].clear(); vv[1].clear();
        for(int i=1;i<p;i++)
            ans+=v[i].size();

        for(int i=0;i<v[p].size();i++){
            printf("? %d %d\n",v[p][i],x);
            fflush(stdout);
            char t[10]; scanf("%s",t);
            if(t[0]=='<'){
                ans++;
                vv[0].push_back(v[p][i]);
            }
            else vv[1].push_back(v[p][i]);
        }

        tot++;
        for(int i=tot;i>p;i--) v[i]=v[i-1];
        v[p]=vv[0];
        v[p+1]=vv[1];
    }
    return ans*2+1;
}

int main(){
    scanf("%d",&n);
    if(n==1){
        puts("! 1\n");
        fflush(stdout);
        return 0;
    }
    if(n==2){
        puts("! 2 1\n");
        fflush(stdout);
        return 0;
    }
    for(int i=1;i<=n/2;i++) v[1].push_back(i);

    for(int i=1;i<=(n+1)/2;i++)
    {
        int l=0,r=tot;
        while(l+1<r){
            int m=(l+r)/2;
            printf("? %d %d\n",v[m][0],i);
            fflush(stdout);
            char t[10]; scanf("%s",t);
            if(t[0]=='<') l=m;
            else r=m;
        }
        ans1[i]=change(r,i);
    }
    for(int i=1;i<=n/2;i++)
        ans2[v[i][0]]=i*2;
    printf("!");
    for(int i=1;i<=n/2;i++) printf(" %d",ans2[i]);
    for(int i=1;i<=(n+1)/2;i++) printf(" %d",ans1[i]);
    puts("");
    fflush(stdout);
}
用yolov8训练自己的模型并调取摄像头实时检测,新手小白超友好教程!逻辑梳理,从0开始逐步实操❤ 帮新手小白学会用yolov8,包含多篇高质量博客整理 阅读详情

相关推荐

ubuntu20.04下dsp-slam的运行配置

DSP-SLAM:具有深度形状先验的面向对象的 SLAM

baidu_38431960的博客 3159

(交互题)Searching Local Minimum

题: This is an interactive problem. Homer likes arrays a lot and he wants to play a game with you. Homer has hidden from you a permutation a1,a2,…,an of integers 1 to n. You are asked to find any index k (1≤k≤n) which is a local minimum. For an array a1,a2,

qq_52317884的博客 554

5、OpenClaw(龙虾助手)飞书机器人完整对接指南(2026最新版)

OpenClaw v2026.2.2+ 版本,防火墙内也能正常工作,是目前最稳定、最简单的企业内部AI助手部署方案。

欢迎光临~知1而N的博客 457

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次操作。 而正解则是上一

xmr_pursue_dreams的博客 267

纽马克-贝塔法(Newmark-Beta Method)在结构动力学中的应用与实现

本文深入解析了纽马克-贝塔法(Newmark-Beta Method)在结构动力学数值计算中的核心原理与应用。作为经典的时间积分算法,它通过调节γ和β参数,在计算精度、稳定性与效率间取得平衡,尤其适用于地震响应、风振分析等工程场景。文章详细阐述了其数学内核、在有限元分析中的实现步骤,并对比了隐式与显式方案的适用场景,为工程师提供了关键的方法选择与参数调优指导。

weixin_29232121的博客 148

Keil开发中CMSIS Driver API缺失问题的排查与解决

本文详细解析Keil开发中CMSIS Driver API缺失问题的根源与解决方案。针对版本不匹配、安装不完整等常见原因,提供在线与离线安装的对比及详细排查步骤,重点涵盖版本兼容性分析与项目配置验证,帮助开发者彻底解决API缺失错误并预防问题复发。

rust6ferris的博客 551

交互题入门

纪念一下第一次A掉交互题。 インタラクティブ練習 (Interactive Sorting) B - インタラクティブ練習 (Interactive Sorting) Time Limit: 2 sec / Memory Limit: 256 MB Score : 300 points Problem Statement This is an interactive task. ...

yali_hzy的博客 2865

Figure 03人形机器人与Helix端到端控制系统:具身智能突破深度解析

2026年5月,Figure AI的Figure 03人形机器人在一场震撼业界的直播中完成了长达200小时的连续全自动作业,分拣近25万个包裹,零故障。这一里程碑式的成就标志着人形机器人正式从「实验室展示」迈入「规模化商用」阶段。本文深入剖析Figure 03的核心技术——Helix端到端神经网络控制系统,包括System 0/1/2三层架构、视觉运动策略、全身协同控制等关键技术,并提供完整的Python/Go代码示例,帮助开发者理解具身智能的核心原理与实现路径。关键词。

shao.bing的专栏 998

Atcoder练习场インタラクティブ練習 (Interactive Sorting)

题目链接 第一个点        冒泡排序解决 第二个点        插入排序+二分优化+预处理球之间关系 第三个点        思维???        不太好讲,模拟一下比较好想,        构造一个s[0]&lt;s[1]&lt;s[3]&lt;s[4],然后对于s[2](构造过程中保证了s[2]小于s[4]),插入合适的位置        容易看出四个位置,两次判...

这里RevolIA,_(:з」∠)_ 1514

基于多智能体架构的AI模拟法庭系统:律师案件预演的革命性工具

多智能体系统(Multi-Agent System)是人工智能领域的重要分支,它通过多个自主或半自主的智能体协同工作,模拟复杂的社会交互与决策过程。其核心原理在于分布式问题求解,每个智能体具备感知、推理和行动能力,通过通信与协作实现整体目标。在工程实践中,多智能体架构的价值在于能够模拟真实世界中的信息不对称与策略独立性,从而在复杂决策场景中提供更贴近现实的推演。这一技术正被应用于法律科技领域,通过构建物理隔离的智能体环境,模拟法庭对抗中的信息屏障与策略博弈。例如,在AI模拟法庭系统中,原告、被告、法官等角色

weixin_42561249的博客 394

PCL 基于超体素的点云分割【2024最新版】

点云超体素分割原理介绍、代码实现以及如何做到将每一个超体素内的点进行单独保存而不造成点云缺失的方法。博客长期更新,本文最近一次更新时间为:2024年12月29日。

点云侠的博客 36万+

AtCoder Tasks B インタラクティブ練習 (Interactive Sorting)

优化插入法解决交互排序问题

m0_37711725的博客 3420

华为OD机考双机位C卷 - 信道分配(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 信道分配

算法大师! 453

赛肯德 | 2017NEERC某题

我们枚举每一条边的流量x,将它作为底流(也就是比它大的的流量变成差值,比它小的流量为0),然后我们设x就是路径上第K大的那个边的流量。然后跑最短路,加上dis[n]就是当前的答案。然后取min即可。 算法时间复杂度\(O(n^2logn)\) 为什么这样子就是最小的呢?????我也很懵逼啊 因为你考虑ans_x是第K大的流量,设当前处理的为x。 如果按照上述规定来跑最短路,显然上述所...

weixin_30468137的博客 171

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Full_of_Boys训练1总结

题目来源:2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17) A. Archery Tournament 每次查询,找这个位置前面的15个圆,后边15个圆来更新答案。set维护一下圆就行。为什么对,官方题解:可以证明经过某一条竖线的圆不超过logC个(C=1e9) ...

weixin_30243533的博客 120

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

非传统题初探——AtCoder Practice Contest #B - インタラクティブ練習 (Interactive Sorting)...

原题: Time limit: 2sec /Memory limit: 256MB Score :300points Problem Statement This is an interactive task. There areNballs labeled with the firstNuppercase letters. The balls hav...

dav74739的博客 673

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

2017 NEERC

2017 NEERC Problem A. Archery Tournament 题目描述:在二维平面上,会陆续出现一些圆,以及一些询问,询问点是否在圆内,如果是,则输出那个圆,并把那个圆删掉,否则输出\(-1\)。注意:这些圆均与\(x\)轴相切,并且这些圆不会相交。 solution 因为这些圆都与\(x\)轴相切,所以经过直线\(x=x'\)的圆不会超过\(log\)个。所以只要找...

diebenger6280的博客 326

2017-2018 ACM-ICPC, NEERC解题报告

A. Union of Doubly Linked Lists   模拟链表的合并,注意收尾相接的问题,不少队都A了 B. Preparing for Merge Sort   动态规划,优化才能水过,否则会无情TLE C. Sum of Nestings   dfs递归搜索,字符串操作 D. Dog Show   贪心&&模拟 E. Packmen   二

Welcome to yjjr's blog! 3489

NEERC2017:L - Laminar Family

传送门 很容易想到,离线按路径长度从大到小排个序,用树链剖分加颗支持区间cover的线段树就好了 代码: #include<cstdio> #include<iostream> #include<algorithm> using namespace std; void read(int &x){ char ch; bool ok; for...

weixin_30485799的博客 304

特殊排序(二分+交互题)

题意:有N个元素,编号1.2…N,每一对元素之间的大小关系是确定的,关系不具有传递性。 也就是说,元素的大小关系是N个点与N*(N-1)/2条有向边构成的任意有向图。然而,这是一道交互式试题,这些关系不能一次性得知,你必须通过不超过10000次提问来获取信息,每次提问只能了解某两个元素之间的关系。现在请你把这N个元素排成一行,使得每个元素都小于右边与它相邻的元素。你可以通过我们预设的bool函数c...

肘子的博客 380

Interactive Problems(交互式问题) 2016.6.9

1、CodeForces_101021A Guess the Number #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned

追风蹑影 1616

(交互题)CF1282D. Enchanted Artifact

CF1282D. Enchanted Artifact 题意&思路: 一个只包含a,b的字符串长度n不超过300,删除,添加,改变字符都算一次操作。现在有一个字符串s,你去猜。你每次输给测评姬一个字符串,测评姬返回给你需要多少次操作可以得到s。你有n+2次机会(你不知道n是多少)。 第一次做交互题,格式都不知道怎么写,QAQ。 一开始看到2300难度的题目,我是拒绝的。 一开始想由于不知道...

Z7784562的博客 1052

数字序列问题

解题思路: 这个序列的结构如上图所示,很明显求解第k个数字是什么需要分两步走,第一步求解所在的行,第二部求解所在的列即该行中的什么位置。首先看怎么求解第k个数字所在的行,我们发现当某一行的最后一个数的位数为w时,这一行的数字个数与相邻行的数字个数的差为w,即局部范围内成等差数列(具有相同位数的最后一个数的行)。我们就按照每行的最后一个数的位数来划分所有的这些行使得它们组成一个个的等差数列。根据等...

Tony Yang的博客 953

2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17) A

传送门 训练时候没有考虑到这样一个性质,得到栗子大佬的点拨才看出来:打到的圆一定是左边或右边第一个直径高出射击高度的圆。 如上图,如果点A不落在圆C内却落在圆D内,显然线段AB在圆D内且线段AB与圆C相交,则圆D与圆C相交,不符合题意描述。 再用线段树维护一下即可。#include <bits/stdc++.h> using namespace std; const int maxn=20

ACM, deep love 900

【交互】CF1081F Tricky Interactor

【题目】 原题地址 有一个长度为nnn的010101串,初始告诉你串中111的个数,你可以进行不超过10410^4104次操作,每次操作形如(l,r)(l,r)(l,r),将会随机使区间[1,r][1,r][1,r]或[l,n][l,n][l,n]其中一段全部取反,并返回现在串中111的个数,求原串。n≤300n\leq 300n≤300 【解题思路】 首先我们知道一个结论:翻转一个区间,则这个全...

MEET YOU FIRST TIME 558

NEERC 17 H. Palindromic Cut 暴力(回文)

Problem H 题意:给出n个字符.问把n个字符分成k个字符串 要求:这k个字符串的长度都相同,这k个字符串都为回文. n k组字符串 每组中最多只能有一个出现奇数次的字符. 如何输出方案:先把g个奇数字符仍到每组中间,剩下的2个相同的一对,有c对 如果能平均分给每组 即c为g的倍数 则退出.否则拆掉一个偶数 增加组数后继续判定.O(127*|S|) #include us

noone0的博客 510
上一篇: NEERC 17 L Laminar Family (树链剖分)
下一篇: NEERC 17 G The Great Wall (treap)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值