首页 > 其他分享 >CF2031F Penchick and Even Medians

CF2031F Penchick and Even Medians

时间:2024-11-24 21:45:04浏览次数:6  
标签:Even f1 f2 Penchick frac int Medians second rep

赛时坠机了,赛后把 F 做出来了。。

刚开始做不出来,后来注意到样例输出了长度为 \(n-2\) 的询问,启发我对于每个相邻数对 \((i,i+1)\),将其删去再进行询问,其中 \(i\) 为奇数,共消耗 \(50\) 次。然后我们对输出的两个数 \(x,y\) 进行讨论:

  1. 如果 \(x,y\) 满足 \(x=\frac n 2,y=\frac n 2 +1\),则说明删去的两个数其中一个数小于 \(\frac n 2\),一个数大于 \(\frac n 2 +1\)。这种情况貌似对答案并不影响。

  2. 如果 \(x,y\) 满足 \(x<\frac n 2,y > \frac n 2 + 1\),则说明删除的数正是 \(\frac n 2\) 和 \(\frac n 2 +1\),这种情况是好处理的。

  3. 如果 \(x,y\) 满足 \(x=\frac n 2,y> \frac n 2+1\),则说明 \(\frac n 2+1\) 正好在这个数对里面,将其记录下来。

  4. 如果 \(x,y\) 满足 \(x<\frac n 2,y=\frac n 2+1\),跟上面的情况类似。

  5. 如果 \(x,y\) 满足 \(x<\frac n 2,y=\frac n 2\),这种情况有些复杂,也是本题的重点,数对中的数都大于等于 \(\frac n 2+1\)。

  6. 如果 \(x,y\) 满足 \(x=\frac n 2+1,y>\frac n 2+1\),跟上面情况类似。

发现最麻烦的是第 \(5,6\) 类点对,我们把第 \(5\) 类点对存入一个数组,第 \(6\) 类存入另一个数组,现在考虑找到包含 \(\frac n 2\) 的点对和 \(\frac n 2 +1\) 的点对,怎么找呢?其实也是简单的,直接询问第一个数组的第一个点对与第二个数组的第一个点对,第一个数组的第二个点对与第二个数组的第二个点对......这样子只要结果输出了 \(\frac n 2\) 或 \(\frac n 2+1\),我们就能够确定包含这两个数的两个点对了。

找到点对后怎么处理都行,算一下操作次数,首先要花 \(50\) 次枚举点对,然后再最多花 \(25\) 次找两个点对,最后花 \(4\) 次确定位置,总共 \(79\) 次,可以通过。

代码很丑,仅供参考:

#include <bits/stdc++.h>
#define rep(i, l, r) for (int i (l); i <= r; ++ i)
#define rrp(i, l, r) for (int i (r); i >= l; -- i)
#define pii pair <int, int>
#define eb emplace_back
#define inf 1000000000000
using namespace std;
constexpr int N = 100 + 5, K = 10;
typedef unsigned long long ull;
typedef long long ll;
inline int rd () {
  int x = 0, f = 1;
  char ch = getchar ();
  while (! isdigit (ch)) {
    if (ch == '-') f = -1;
    ch = getchar ();
  }
  while (isdigit (ch)) {
    x = (x << 1) + (x << 3) + ch - 48;
    ch = getchar ();
  }
  return x * f;
}
int n;
pii ask1 (int x, int y) {
  cout << "? " << n - 2 << " ";
  rep (i, 1, n) {
    if (i != x && i != y) cout << i << " ";
  }
  cout << endl;
  cin >> x >> y;
  return pii (x, y);
}
pii ask2 (int a, int b, int c, int d) {
  cout << "? 4 " << a << " " << b << " " << c << " " << d << endl; 
  int x, y;
  cin >> x >> y;
  return pii (x, y);
}
int a1[N], n1, a2[N], n2, tt;
void motherfucker () {
  ++ tt;
  cin >> n; n1 = n2 = 0;
  int f1 = 0, f2 = 0;
  int x = 0, y = 0, z = 0;
  rep (i, 1, n) {
    pii t = ask1 (i, i + 1);
    if (t.first == n / 2 && t.second == n / 2 + 1) {
      if (! f1) f1 = i; else f2 = i;
    } else {
      if (t.first == n / 2 && t.second > n / 2 + 1) {
        y = i;
      } else 
      if (t.first < n / 2 && t.second == n / 2 + 1) {
        x = i;
      } else {
        if (t.first < n / 2 && t.second > n / 2 + 1) {
          z = i; ++ i; continue;
        }
        if (t.first < n / 2 && t.second == n / 2) a2[++ n2] = i;
        else a1[++ n1] = i;
      }
    }
    ++ i;
  }
  if (z) {
    if (! f1) {
      rep (i, 1, n1) f1 = a1[i];
      rep (i, 1, n2) f2 = a2[i];
    } else {
      if (! f2) {
        rep (i, 1, n1) f2 = a1[i];
        rep (i, 1, n2) f2 = a2[i];
      }
    }
    pii t = ask2 (f1, f1 + 1, f2, z);
    if (t.first == n / 2 || t.second == n / 2) {
      cout << "! " << z << " " << z + 1 << endl; 
    } else cout << "! " << z + 1 << " " << z << endl;
    return ;
  } else {
    int mn = min (n1, n2);
    int l = 0, r = 0;
    rep (i, 1, mn) {
      pii t = ask2 (a1[i], a1[i] + 1, a2[i], a2[i] + 1);
      if (t.first == n / 2 || t.second == n / 2) x = a1[i];
      else l = a1[i];
      if (t.first == n / 2 + 1 || t.second == n / 2 + 1) y = a2[i];
      else r = a2[i];
    }
    if (n2)
    rep (i, n2 + 1, n1) {
      pii t = ask2 (a1[i], a1[i] + 1, a2[1], a2[1] + 1);
      if (t.first == n / 2 || t.second == n / 2) x = a1[i];
      else l = a1[i];
      if (t.first == n / 2 + 1 || t.second == n / 2 + 1) y = a2[1];
      else r = a2[1];
    }
    if (n1)
    rep (i, n1 + 1, n2) {
      pii t = ask2 (a1[1], a1[1] + 1, a2[i], a2[i] + 1);
      if (t.first == n / 2 || t.second == n / 2) x = a1[1];
      else l = a1[1];
      if (t.first == n / 2 + 1 || t.second == n / 2 + 1) y = a2[i];
      else r = a2[i];
    }
    if (f1) l = f1, r = f1 + 1;
    if (! l) l = r + 1; if (! r) r = l + 1;
    pii t = ask2 (l, r, x, y);
    int ans1 = 0, ans2 = 0;
    if (t.first == n / 2 || t.second == n / 2) {
      ans1 = x;
    }
    if (t.first == n / 2 + 1 || t.second == n / 2 + 1) {
      ans2 = y;
    }
    t = ask2 (l, r, x + 1, y);
    if (t.first == n / 2 || t.second == n / 2) {
      ans1 = x + 1;
    }
    if (t.first == n / 2 + 1 || t.second == n / 2 + 1) {
      ans2 = y;
    }
    t = ask2 (l, r, x, y + 1);
    if (t.first == n / 2 || t.second == n / 2) {
      ans1 = x;
    }
    if (t.first == n / 2 + 1 || t.second == n / 2 + 1) {
      ans2 = y + 1;
    }
    t = ask2 (l, r, x + 1, y + 1);
    if (t.first == n / 2 || t.second == n / 2) {
      ans1 = x + 1;
    }
    if (t.first == n / 2 + 1 || t.second == n / 2 + 1) {
      ans2 = y + 1;
    }
    cout << "! " << ans1 << " " << ans2 << endl;
  }
}
int main () {
  // freopen ("1.in", "r", stdin);
  int T; cin >> T;
  for (; T; -- T) motherfucker ();
}

标签:Even,f1,f2,Penchick,frac,int,Medians,second,rep
From: https://www.cnblogs.com/lalaouyehome/p/18566460

相关文章

  • Qt关于窗口一直调用paintEvent的踩坑实录
    首先看以下代码:voidItemBlockWidget::paintEvent(QPaintEvent*ev){//先调用父类的paintEvent以执行默认绘制行为QWidget::paintEvent(ev);qDebug()<<"ItemBlockWidget重绘";QStyleOptionopt;opt.initFrom(this);QPainterp(this);s......
  • Spring Events在大型项目中的最佳实践
    在大型项目中,SpringEvents提供了一种有效的方式来解耦不同的模块,使得系统更加灵活和可扩展。SpringEvents基于发布/订阅模式,允许应用的不同部分之间进行通信,而无需直接调用对方的代码。这种方式特别适合于处理那些不需要即时反馈的业务场景。实际业务场景假设我们正在开发......
  • NGINX 的 Event Loop
    NGINX的EventLoop讲解NGINX的事件驱动架构基于EventLoop,它使得NGINX能够高效地处理大量并发连接,而不必为每个请求启动一个独立的线程或进程。通过EventLoop,NGINX采用非阻塞I/O模型,这样即使处理大量连接,也能保持较低的资源消耗。为什么NGINX使用EventLoo......
  • uvm_event的变量传递+查看软链接的指向+grep只打印匹配的数据+并行进程的串行化--构建
    uvm_event的变量传递uvm_event可以传递变量,但是变量需要为uvm_object类型,对于package,建议类型向下转换,直接传递uvm_object,并在另一端解析https://www.edaplayground.com/x/RhYcmoduletestbench;classclass1extendsuvm_object;`uvm_object_utils(class1)inta......
  • LeetCode 1371. Find the Longest Substring Containing Vowels in Even Counts
    原题链接在这里:https://leetcode.com/problems/find-the-longest-substring-containing-vowels-in-even-counts/description/题目:Giventhestring s,returnthesizeofthelongestsubstringcontainingeachvowelanevennumberoftimes.Thatis,'a','e&......
  • SOMEIP_ETS_164: SD_SubscribeEventgroup_with_unallowed_option_ip_2
    测试目的:验证DUT能够拒绝一个在请求中包含错误参数(端点选项中包含无效IPv4地址,即111.111.111.111)的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。描述本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个在端点选项中包含无效IPv4地址(111.111.111.111)的S......
  • C# 事件(Event)应用说明一
    一.C# 事件(Event)定义说明:C#事件(Event)是一种成员,用于将特定的事件通知发送给订阅者。事件通常用于实现观察者模式,它允许一个对象将状态的变化通知给其他对象,而不需要知道这些对象的具体细节。事件(Event) 基本上说是一个用户操作,或者是一些提示信息,如系统生成的通知、按键输......
  • Event和Activity
    在JAINSLEE中,Event(事件)和Activity(活动)是两个核心概念,它们共同作用于系统的执行过程,但它们代表不同的含义和职责。让我们从最基础的层面来讲解它们的区别、联系,以及它们在JAINSLEE框架中的角色。1.Event(事件)1.1概念事件(Event)是JAINSLEE中的一个基本单元,用来......
  • 易优CMS致命错误,联系技术支持:Call to undefined function eyPreventShell()-eyoucms
    当你遇到 core/helper.php 第146行左右出现致命错误,并且提示 CalltoundefinedfunctioneyPreventShell() 时,通常是因为某个自定义函数未被定义或未被正确引入。以下是一些具体的解决步骤:步骤1:检查函数定义定位 eyPreventShell 函数查找 eyPreventShell 函数的......
  • QtWidgetsApplication中的EventDispatcher的创建
    #include"QtWidgetsApplication1.h"#include<QtWidgets/QApplication>classGlobalEventFilter:publicQObject{public:virtualbooleventFilter(QObject*watched,QEvent*event)override{qDebug()<<"watched......