首页 > 其他分享 >Solution - Codeforces 2031F Penchick and Even Medians

Solution - Codeforces 2031F Penchick and Even Medians

时间:2024-11-15 23:41:09浏览次数:1  
标签:Even std Penchick frac 二元 eng int Medians 中位数

飞快秒掉了,没报名痛失首杀,痛苦。

简略题解:

考虑先随机二元下标 \((x_0, y_0)\) 满足删去 \((x_0, y_0)\) 后查询的中位数还是 \(\frac{n}{2}, \frac{n}{2} + 1\),那么这就说明 \(p_{x_0}, p_{y_0}\) 一定在中位数的两边。

那么还剩下的 \(n - 2\) 个下标两两配对成 \(\frac{n - 2}{2}\) 组。
然后每一组与 \((x_0, y_0)\) 一起问,注意到只要二元组里有中位数那么问出来的就必定带中位数(\(p_{x_0}, p_{y_0}\) 一定在中位数的两边,那么加入中位数肯定被夹在中间,不管另一个在哪都肯定还在)。

于是规模就缩小到的 \(2\) 个二元组了,每个二元组各存在一个中位数(可能只有 \(1\) 个二元组,但这个答案更简单,就是这个二元组。)
那么就只有 \(2\times 2 = 4\) 种情况,可以问出 \(3\) 种,都不是就是另一种(只是减掉了一次询问,看起来不是很必要(?))。

于是后面部分的询问次数就是 \(\frac{n - 3}{2} + 3 = \frac{n}{2} + 2\) 次,那么就留下了 \(78 - \frac{n}{2}\) 次操作。

注意到随机成功的概率就是 \(\frac{2(\frac{n}{2} - 1)^2}{n(n - 1)}\),越小其实概率越低,但是越小的次数越多,算一下看起来就很能过.jpg。

跑了下 desmos,挂掉的概率 \(\le 8\times 10^{-9}\),应该没啥问题。

#include<bits/stdc++.h>
std::mt19937_64 eng(std::chrono::steady_clock::now().time_since_epoch().count());
constexpr int maxn = 1e2 + 10;
std::pair<int, int> query(std::vector<int> a) {
   std::cout << "? " << a.size();
   for (int x : a) std::cout << ' ' << x;
   std::cout << std::endl;
   int x, y;
   std::cin >> x >> y;
   return std::make_pair(x, y);
}
inline void solve() {
   int n;
   std::cin >> n;
   int x0 = 0, y0 = 0;
   do {
      int x = eng() % n + 1, y;
      do {
         y = eng() % n + 1;
      } while (y == x);
      std::vector<int> vec;
      for (int i = 1; i <= n; i++) {
         if (i == x || i == y) continue;
         vec.push_back(i);
      }
      if (query(vec) == std::make_pair(n / 2, n / 2 + 1)) {
         x0 = x, y0 = y;
      }
   } while (! x0);
   std::pair<int, int> c[2] = {{0, 0}, {0, 0}};
   for (int i = 1, j = 0, k = 0; i <= n; i++) {
      if (i == x0 || i == y0) continue;
      if (j) {
         auto [x, y] = query({i, j, x0, y0});
         if (x == n / 2 || x == n / 2 + 1 || y == n / 2 || y == n / 2 + 1) {
            c[k++] = {i, j};
         }
         j = 0;
      } else {
         j = i;
      }
   }
   if (! c[1].first) {
      std::cout << "! " << c[0].first << ' ' << c[0].second << std::endl;
   } else if (query({c[0].first, c[1].first, x0, y0}) == std::make_pair(n / 2, n / 2 + 1)) {
      std::cout << "! " << c[0].first << ' ' << c[1].first << std::endl;
   } else if (query({c[0].first, c[1].second, x0, y0}) == std::make_pair(n / 2, n / 2 + 1)) {
      std::cout << "! " << c[0].first << ' ' << c[1].second << std::endl;
   } else if (query({c[0].second, c[1].first, x0, y0}) == std::make_pair(n / 2, n / 2 + 1)) {
      std::cout << "! " << c[0].second << ' ' << c[1].first << std::endl;
   } else {
      std::cout << "! " << c[0].second << ' ' << c[1].second << std::endl;
   }
}
int main() {
   int T;
   for (std::cin >> T; T--; ) {
      solve();
   }
   return 0;
}

标签:Even,std,Penchick,frac,二元,eng,int,Medians,中位数
From: https://www.cnblogs.com/rizynvu/p/18548707

相关文章

  • MIGO DUMP LCX_RAP_EVENT_RUNTIME CL_RAP_EVENT_MANAGER==========CP
    MIGO收货时发生DUMP运行事务代码:SBGRFCCONF创建入站目标输入目标BGPF 保存即可 TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplifiedHungarianRussianChineseTraditi......
  • Spring-Event入门实践及执行原理
    一、入门案例1.添加依赖首先,在pom.xml文件中添加SpringBoot和SpringEvent的依赖:<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></depende......
  • 中间件全球数据实时同步利器,EventGrid事件流重磅发布
    EventGrid事件流(简称EG)作为易用、稳定、高效的数据同步管道连接不同的系统与服务,支持中间件在线同步和实时同步。事件流围绕云中间件,降低了中间件之间数据流通的复杂性,有效地帮助您减少数据传输的成本。适用于上云、跨云数据搬迁和跨云、跨地域备份容灾等场景,为企业上云和容灾业务......
  • FreeRTOS 24:事件组EventGroup等待、清零、获取操作
    等待事件标志位xEventGroupWaitBits()既然标记了事件的发生,那么我怎么知道他到底有没有发生,这也是需要一个函数来获取事件是否已经发生,FreeRTOS提供了一个等待指定事件的函数——xEventGroupWaitBits(),通过这个函数,任务可以知道事件标志组中的哪......
  • Spring带泛型的ApplicationEvent无法监听问题分析(转载)
    1背景在开发过程中,经常遇到发送事件来通知其他模块进行相应的业务处理;笔者实用的是spring自带的ApplicationEventPublisher和EventListener进行事件的发收;但是开发时遇到一个问题:如果事件很多,但是事件模式都差不多,就需要定义很多事件类来分别表示各种事件,例如,我们进行数据同步......
  • 事件循环(Event loop)
    一、什么叫事件循环事件循环也就是Eventloop,是JavaScript或Node为解决单线程代码执行不阻塞主进程一种机制,也就是我们所说的异步原理。事件循环负责执行代码、收集和处理事件以及执行队列中的子任务。二、什么是进程与线程?进程是计算机中正在运行的程序的一个实例;每个进程......
  • gem5 学习三 —— gem5 Event
    在本文中,我将探讨在gem5模拟器中如何创建、调度事件,并深入理解背后的原理。Eventgem5是一个事件驱动(Event-driven)的模拟器。在事件驱动模型中,每个事件(Event)都有一个回调函数用于处理事件。官方教程是基于HelloObject开始,创建和调度事件。下面我们也以HelloObject类代码为......
  • knative eventing 体验
    ......
  • scroll-view 滚动时报错Ignored attempt to cancel a touchmove event with cancelabl
    场景描述:在uniapp中的弹窗pop中使用scroll-view频繁滚动出现报错[Intervention]Ignoredattempttocancelatouchmoveeventwithcancelable=false,forexamplebecausescrollingisinprogressandcannotbeinterrupted解决报错 解决办法:因为事件冒泡,scroll-v......
  • Qt Event事件系统小探1
    目录QtEventSystemFromqt.doc如何传递事件事件类型事件处理程序事件过滤器发送事件事件的产生和派发处理我们的事件来一段好玩的代码扩展:QWidget如何处理我们的事件?扩展2:实现一个变色的LabelQtEventSystemFromqt.doc在Qt中,事件是从抽象QEvent类派......