首页 > 其他分享 >Luogu P6104 [EER2] 相同的数字

Luogu P6104 [EER2] 相同的数字

时间:2024-07-03 19:08:59浏览次数:16  
标签:nxt le int Luogu ll EER2 gc P6104 operatorname

令 \(\text{nxt}_i\) 为 \(i\) 之后的第一个质数。

考虑最后 \(a_i\) 会变成什么。
首先第一种就是直接变为 \(\max a_i\)。
其次还发现可能变为 \(\operatorname{nxt}_{\max a_i}\)。
对于其他的,可以证明一定不优于这两种,因为其他的情况无非就是在这基础上继续跳 \(\operatorname{nxt}\) 或 \(+1\),并没有更快的“捷径”能够跳到这些地方,要到达这个状态肯定要通过上述说过的两种状态。

于是就只需要解决目标是其中之一的最小值,最后取 \(\min\) 即可。

接下来就考虑怎么求最小值。
不难发现对于其中一个 \(a_i\) 的路径,可以拆为,先跳若干次 \(\operatorname{nxt}\),最后再一直 \(+1\)(因为 \(\operatorname{nxt}\) 已经大于了目标)。
对于后面 \(+1\) 的明显只能用 \(c1\) 处理。
但对于前面跳 \(\operatorname{nxt}\),可以记录下跳的距离 \(d\),当 \(c_1 d\le c_2\) 即 \(d\le \frac{c_1}{c_2}\),用 \(c_1\) 去替代更优。
上述提到的过程都可以用前缀和来优化。

时间复杂度 \(\mathcal{O}(V\log \log V + n + q)\),\(V\) 为值域。
用欧拉筛即可以使 \(V\) 部分的复杂度变为线性。

#include<bits/stdc++.h>
using ll = long long;
#define gc getchar_unlocked
inline int read() {
   int x = 0, c = gc();
   while (! isdigit(c)) c = gc();
   while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48), c = gc();
   return x;
}
const int maxn = 1e5 + 10, limm = (int)1e7 + 19, limcnt = 664580, limd = 154;
const ll lim = (1 << 17) - 1;
std::bitset<limm + 2> vis;
int pr[limcnt + 2], cnt, nxt[limm + 2];
std::unordered_map<int, int> id;
int a[maxn];
int to[2];
ll c1[2], c2[2][limd + 2], s2[2][limd + 2]; int sum[limcnt + 2];
int main() {
   for (int i = 2; i * i <= limm; i++)
      if (! vis[i]) {
         for (int j = i * i; j < limm; j += i)
            vis[j] = 1;
      }
   for (int i = 2; i <= limm; i++)
      ! vis[i] && (pr[++cnt] = i, id[i] = cnt);
   for (int i = limm, w = -1; i; i--)
      nxt[i] = w, ! vis[i] && (w = i);
   int n = read(), m = read(), T = read();
   for (int i = 1; i <= n; i++) a[i] = read();
   int mx = a[1];
   for (int i = 2; i <= n; i++) mx = std::max(mx, a[i]);
   to[0] = mx, to[1] = nxt[mx];
   for (int op : {0, 1}) {
      int ed = to[op], pre = 0;
      for (int i = cnt; i; i--)
         if (pr[i] <= ed) {pre = i; break;}
      memset(sum, 0, sizeof(sum));
      for (int i = 1, x; i <= n; i++) {
         x = a[i];
         if (nxt[x] <= ed) {
            c2[op][nxt[x] - x]++, s2[op][nxt[x] - x] += nxt[x] - x;
            x = nxt[x];
            sum[id[x]]++;
            x = pr[pre];
         }
         c1[op] += ed - x;
      }
      for (int i = 1; i < pre; i++) {
         sum[i] += sum[i - 1];
         c2[op][pr[i + 1] - pr[i]] += sum[i], s2[op][pr[i + 1] - pr[i]] += 1ll * sum[i] * (pr[i + 1] - pr[i]);
      }
      for (int i = 1; i <= limd; i++)
         c2[op][i] += c2[op][i - 1], s2[op][i] += s2[op][i - 1]; 
   }
   for (ll w1, w2, ans = 0; m--; ) {
      w1 = read() ^ (T ? (ans & lim) : 0), w2 = read() ^ (T ? (ans & lim) : 0);
      ans = 1e18;
      for (int op : {0, 1})
         ans = std::min(ans, w1 * (c1[op] + s2[op][std::min((int)(w2 / w1), limd)]) + w2 * (c2[op][limd] - c2[op][std::min((int)(w2 / w1), limd)]));
      printf("%lld\n", ans);
   }
   return 0;
}

标签:nxt,le,int,Luogu,ll,EER2,gc,P6104,operatorname
From: https://www.cnblogs.com/rizynvu/p/18282367

相关文章

  • Luogu P10674 【MX-S1-T3】电动力学
    首先考虑这个\(S,T\)肯定需要固定一个算另一个的方案数。如果固定\(S\),会发现非常不好给\(T\)下限制。于是考虑固定\(T\),对\(S\)计数。首先考虑如果\(T\)只有\(2\)个点\(x,y\),该怎么对\(S\)计数。考虑到这个简单路径的定义是不经过重点,考虑找到点双。然后能......
  • Luogu P9542 [湖北省选模拟 2023] 棋圣 alphago
    2023.08.19:修改了一处笔误。手玩发现对于一颗生成树,如果存在至少一个点的度数\(>2\)(即不为链),那么肯定能使得所有棋子都在一条边的两个端点上。因为有度数\(>2\)的点的存在,这里就可以合并与其相连的点的棋子。先考虑非链的情况的答案,记两部分棋子黑白棋子颜色分别为\(c(a/......
  • Luogu P6864 [RC-03] 记忆
    先考虑没有\(3\)操作该怎么做。对于当前字符串把其分成多组互不包含的括号的形式,即\((\cdots)()()\)这样,考虑经过\(1/2\)操作后对互不包含的括号组数\(b\)和答案\(v\)会产生什么影响。\(1\)操作,加上过后便会多上一组互不包含的括号,\(b\leftarrowb'+1\),同时这个......
  • [刷题笔记] Luogu P1612 [yLOI2018] 树上的链
    ProblemDescriptionDescription给定一棵有\(n\)个节点的树。每个节点有一个点权和一个参数。节点\(i\)的权值为\(w_i\),参数为\(c_i\)。\(1\)是这棵树的根。现在,对每个节点\(u\)(\(1\lequ\leqn\)),请在树上你找到最长的一条链\(v_1,v_2,\dotsv_m\),满足如下条件:......
  • [luoguP10608]双人游戏
    题目信息原题链接来源:[LGR-190]2024洛谷6月月赛IIDiv1T1/Div2T3题意长度为\(n\)的序列\(s\),其中只包含B,W和\(m\)个_。给定长度为\(m\)的序列\(O=[\langc_1,x_1\rang,\langc_2,x_2\rang,\cdots,\langc_m,x_m\rang](c_i\in\{\mathtt{R},\mathtt{M}\},s_{x_i}=\text{'_'......
  • [lnsyoj166/luoguP2822/NOIP2016提高组] 组合数问题
    题意原题链接给定\(n,m,k\),对于所有的\(0\lei\len,0\lej\lemin\{i,m\}\),有多少对\((i,j)\)满足\(k|(^i_j)\)sol在解决组合数问题时,若遇到\(n,m\le2000\)的情况,可以使用递推法(杨辉三角)来进行\(O(n^2)\)的预处理,再\(O(1)\)直接调用递推法求组合数\[(^n_m)=(^{n-1}_m)+(......
  • [lnsyoj284/luoguP2286/HNOI2004]宠物收养场
    题意原题链接每个宠物和领养人有一个对应的特点值\(a\),当领养人过多时,若添加一个特点值为\(a_p\)的宠物,则查询收养店中特点值最接近\(a_p\),为\(a_q\)的领养人(\(<a_p\)的值优先),将答案累加\(|a_q-a_p|\),然后删除该领养人,否则在收养店中添加一个领养人。反之亦然。求最终的答案\(......
  • [lnsyoj98/luoguP1403]约数研究
    题意原题链接求\(1\simn\)的约数个数和sol直接算很困难,考虑换一个角度求\(1\simn\)的约数个数和,等价于求\(1\simn\)分别是范围内几个数的约数对于第\(i\)个值,在\(1\simn\)中,存在\(i,2\cdoti,3\cdoti,\cdots,k\cdoti\),共\(\lfloor\frac{n}{i}\rfloor\)因此,最终......
  • [lnsyoj118/luoguP3369]普通平衡树
    题意维护一个数据结构,要求支持插入,删除,根据排名查数,根据数查排名,查询前驱,查询后继\(6\)个操作sol考虑到后四个查询的操作,会发现使用二叉搜索树(BST)完全可以实现为了完成这四个操作,需要在每个节点记录\(3\)个值:\(key\)表示当前节点的数\(cnt\)表示当前节点的数的个数(为了......
  • [DP] [倍增优化] Luogu P1081 [NOIP2012 提高组] 开车旅行
    [NOIP2012提高组]开车旅行题目描述小\(\text{A}\)和小\(\text{B}\)决定利用假期外出旅行,他们将想去的城市从$1$到\(n\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为\(h_i\),城市\(i\)和城市\(j\)之间的距......