首页 > 其他分享 >CF 2008 H

CF 2008 H

时间:2024-09-08 11:46:26浏览次数:10  
标签:return int 复杂度 CF mid MAXN 2008 sum

题目描述

给定一个长度为 \(N\) 的序列 \(A\),以及 \(Q\) 次询问,每次询问给定一个 \(x\)。

你可以执行以下操作任意次:

  • 选择一个 \(1\le i \le N\) 使得 \(A_i \ge x\)。
  • 令 \(A_i \leftarrow A_i - x\)。

求 \(A\) 的最小中位数。

这里中位数是 \(A\) 排序后的第 \(\lfloor \frac{n}{2}\rfloor+1\) 个元素。

思路

很显然,令一个 \(A_i-x\) 一定不会使答案更劣,所以肯定会把所有操作进行到底,也就是 \(A_i\leftarrow A_i \bmod x\)。然后让你求这种情况下的中位数。

首先对 \(A_i\) 的值做一个前缀和。对于每个 \(x\),二分其中位数。

二分的 check 也很简单,直接枚举 \(x\) 的倍数 \(y\),求 \(y\) 到 \(y+mid\) 有多少个数,如果总数 \(\ge \lfloor \frac{n}{2}\rfloor+1\) 则合法,否则不合法。

这样的时间复杂度是 \(O(N\log^2 N)\),因为这里面是一个调和级数,所以时间不会炸。

空间复杂度 \(O(N)\),时间复杂度 \(O(N \log^2 N + Q)\)。

代码

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 100005;

int T, n, q, a[MAXN], sum[MAXN], ans[MAXN];

bool check(int x, int y) {
  int res = 0;
  for(int i = 0; i * x <= n; ++i) {
    res += sum[min(n, i * x + y)] - (i * x - 1 >= 0 ? sum[i * x - 1] : 0);
  }
  return res >= n / 2 + 1;
}

int Binary_Search(int x) {
  int l = 0, r = x - 1;
  for(; l < r; ) {
    int mid = (l + r) >> 1;
    (check(x, mid) ? r = mid : l = mid + 1);
  }
  return l;
}

void Solve() {
  cin >> n >> q;
  for(int i = 1; i <= n; ++i) {
    sum[i] = 0;
  }
  for(int i = 1; i <= n; ++i) {
    cin >> a[i];
    sum[a[i]]++;
  }
  for(int i = 1; i <= n; ++i) {
    sum[i] += sum[i - 1];
  }
  for(int i = 1; i <= n; ++i) {
    ans[i] = Binary_Search(i);
  }
  for(int i = 1, x; i <= q; ++i) {
    cin >> x;
    cout << ans[x] << " \n"[i == q];
  }
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  for(cin >> T; T--; Solve()) {
  }
  return 0;
}

标签:return,int,复杂度,CF,mid,MAXN,2008,sum
From: https://www.cnblogs.com/yaosicheng124/p/18402722

相关文章

  • CF1926G Vlad and Trouble at MIT
    题意有一棵树,树上每个节点有\(C\),\(S\),\(P\)三种,现在可以选择一些边断掉,使得每个连通块内没有同时出现\(S\),\(P\)的情况,问最少断多少条思路板子树形\(DP\)考虑\(dp_{i,0/1,0/1}\)表示以\(i\)为子树,是否有跟\(i\)联通的\(S\)和\(P\)转移dp[x][0][0]+=......
  • 【题解】CF1955E
    CF1955E翻译思路代码翻译原题链接CF1955E思路  由于每次操作区间长度是定值,所以我们可以说,如果最前面的数已经是1了,那它再也不会被进入操作。因为如果把它变回0,那想再变成1只能以它为起点再操作一次,前后两次操作抵消。  所以思路很简单,直接......
  • CF2002D2 DFS Checker (Hard Version) 题解
    https://codeforces.com/problemset/problem/2002/D2考虑找一个容易维护的必要条件,再证明充分性。最容易想到的是每个子树对应一个区间,子树根位于左端点sol1相邻的结点\(p_{i-1},p_i\)有两种情况:\(fa[p_i]=p_{i-1}\);叶子\(p_{i-1}\)在子树\(fa[p_i]\)中,回溯到\(fa[......
  • CF1991F Triangle Formation 题解
    Description你有\(n\)根棍子,从\(1\)到\(n\)编号。第\(i\)根棍子的长度是\(a_i\)。你需要回答\(q\)个问题。在每个查询中,你会得到两个整数\(l\)和\(r\)(\(1\lel<r\len,r−l+1\ge6\))。确定是否可以从编号为\(l\)到\(r\)的棒中选择\(6\)个不同的棒,形......
  • CF1991E Coloring Game 题解
    Description有一个由\(n\)个顶点和\(m\)条边组成的无向图。每个顶点可以用三种颜色之一着色:\(1\)、\(2\)或\(3\)。初始时,所有顶点都未着色。Alice和Bob正在玩一个包含\(n\)轮的游戏。在每一轮中,都会发生以下两个步骤:Alice选择两种不同的颜色。Bob选择一个未......
  • CF2009G. Yunli's Subarray Queries 题解
    G1题目要求,对于一个子区间$a_{l\siml+k-1}$,最少要进行多少次单点修改,才能使$\forall\l<i\leql+k-1,a_i=a_{i-1}+1$,其中$k$是固定的。对于这种问题,我们通常有一个trick:将$a_i$变为$a_i-i$。这样的话,我们要求的答案就变为了$k$减去变化后的$a_{l\siml+k-1}$......
  • CF1945F Kirill and Mushrooms
    题意营地里的人一睡着,基里尔就偷偷溜出帐篷,去智者橡树那里采蘑菇。众所周知,橡树下生长着\(n\)种蘑菇,每种蘑菇都有\(v_i\)的魔力。基里尔非常想用这些蘑菇制作一种魔力最大的灵药。灵药的强度等于其中蘑菇的数量与这些蘑菇中最小魔力的乘积。为了配制灵药,基里尔将依次采摘......
  • CF1715E. Long Way Home -决策单调性、图
    link:https://codeforces.com/contest/1715/problem/E有\(n\)座城市,城市间有\(m\)条双向道路,通过第\(i\)条道路需要花费\(w_i\)的时间,任意两个城市之间都有航班,乘坐城市\(u\)和\(v\)之间的航班需要花费\((u-v)^2\)的时间。现在请对于任意城市\(i(1\lei\len)\)......
  • CF1307(模拟赛记录)
    比赛页面偶然发现一道做过的G;C的罚时:没开longlong,谨记。然后一个小时没想出E……E题面:在一年成功的牛奶生产后,FarmerJohn奖励他的奶牛们它们最喜欢的美味的草。在田里有\(n\)个单位的排成一行的草,每个单位的草有甜味\(s_i\)。FarmerJohn有\(m\)头奶牛,每只都......
  • CF1534(模拟赛记录)
    比赛页面ABCD都打的可以,然而E的+10直接葬送了大概率过的F1……先猜了个\(n-k+1\)的结论,但是没有写搜索查正确性(事实上确实不正确),于是两次罚时,第一次是交互格式错了。然后又猜了个\(\min(n-k+1,(n-1)/(k-1))\)的结论,过了几个小的搜索数据(\(n\le6\))的,大一点的没跑,于......