首页 > 其他分享 >2024/10/07 模拟赛总结

2024/10/07 模拟赛总结

时间:2024-10-07 20:45:31浏览次数:7  
标签:10 07 int LL kMaxN 2024 ull using ly

\(20+55+25+0=100\),压线拿到小饼干!

#A. A

可以发现 \(u_i=A,v_i=B,w_i=C\) 至少有一个成立,将这些点抽象到三位空间中。则原长方体一定被一个从 \((1,1,1)\) 出发的长方体打穿,但是似乎重叠部分比较难实现

对于从底打到顶的长方体,可以用后缀 \(\max\) 解决,然后原长方体就变成了阶梯状棱柱。然后横竖的操作就可以简化成一条线了,那么每一层剩下的数量可以直接计算

// BLuemoon_
#include <bits/stdc++.h>

using namespace std;
using ull = unsigned long long;

const int kMaxN = 3e7 + 5;

int n, mx[kMaxN], mn[kMaxN], e[kMaxN], u[kMaxN], v[kMaxN], w[kMaxN], k[kMaxN], A, B, C;
__int128 p = 1, ans, cnt;

ull Rand(ull &k1, ull &k2) {
  ull k3 = k1, k4 = k2;
  k1 = k4;
  k3 ^= (k3 << 23);
  k2 = k3 ^ k4 ^ (k3 >> 17) ^ (k4 >> 26);
  return k2 + k4;
}
void GetData() {
  ull x, y;
  cin >> n >> A >> B >> C >> x >> y;
  for (int i = 1; i <= n; i++) {
    u[i] = Rand(x, y) % A + 1;
    v[i] = Rand(x, y) % B + 1;
    w[i] = Rand(x, y) % C + 1;
    if (Rand(x, y) % 3 == 0) u[i] = A;
    if (Rand(x, y) % 3 == 0) v[i] = B;
    if ((u[i] != A) && (v[i] != B)) w[i] = C;
  }
}
void print(__int128 pr) {
  (pr < 10) ? putchar(pr + '0') : (print(pr / 10), putchar((pr % 10) + '0'));
}

int main() {
  freopen("A.in", "r", stdin), freopen("A.out", "w", stdout);
  GetData();
  for (int i = 1; i <= n; i++) {
    if (w[i] == C) {
      e[u[i]] = max(e[u[i]], v[i]);
    } else if (u[i] == A) {
      mn[w[i]] = max(mn[w[i]], v[i]);
    } else if (v[i] == B) {
      mx[w[i]] = max(mx[w[i]], u[i]);
    }
  }
  for (int i = A; i; i--) {
    e[i] = max(e[i], e[i + 1]);
  }
  for (int i = C; i; i--) {
    mx[i] = max(mx[i], mx[i + 1]), mn[i] = max(mn[i], mn[i + 1]);
  }
  for (int i = 1, cur = A; i <= B; i++) {
    for (; cur && e[cur] < i; cur--) {
    }
    k[i] = cur;
  }
  for (int i = 1, lx = A, ly = B; i <= C; i++) {
    for (; lx > mx[i]; cnt += B - ly - max(0, e[lx] - ly), lx--) {
    }
    for (; ly > mn[i]; cnt += A - lx - max(0, k[ly] - lx), ly--) {
    }
    ans += cnt;
  }
  print(p * A * B * C - ans), cout << '\n';
  return 0;
}

#B. B

令 \(dp_{i,j}\) 为前 \(i\) 道工序有 \(j\) 个物品优于当前物品,由于每次只会删掉一个值,\(dp_{i,j}\) 只会更新到 \(dp_{i+1,j},dp_{i+1,j-1}\),所以可以直接美剧当前物品大力转移即可

// BLuemoon_
#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int kMaxN = 3e2 + 5;
const LL kP = 1e9 + 7;

int n;
LL p[kMaxN], ans, l[kMaxN][kMaxN], r[kMaxN][kMaxN], dp[kMaxN][kMaxN];

LL P(LL x, LL y, LL ret = 1) {
  for (; y; (y & 1) && ((ret *= x) %= kP), (x *= x) %= kP, y >>= 1) {
  }
  return ret;
}

int main() {
  freopen("B.in", "r", stdin), freopen("B.out", "w", stdout);
  cin >> n;
  for (int i = 1; i < n; i++) {
    cin >> p[i];
  }
  for (int i = 1; i < n; i++) {
    l[i][0] = 1;
    for (int j = 1; j <= n - i + 1; j++) {
      r[i][j] = l[i][j - 1] * (j == n - i + 1 ? 1 : p[i]) % kP;
      l[i][j] = l[i][j - 1] * (kP + 1 - p[i]) % kP;
    }
    for (int j = 2; j <= n - i + 1; j++) {
      (r[i][j] += r[i][j - 1]) %= kP;
    }
  }
  for (int i = 1; i <= n; i++) {
    fill(dp[0], dp[n + 2], 0), dp[1][i] = 1;
    for (int j = 1; j < n; j++) {
      for (int k = 1; k <= i; k++) {
        if (dp[j][k]) {
          (dp[j + 1][k - 1] += dp[j][k] * r[j][k - 1] % kP) %= kP;
          (dp[j + 1][k] += dp[j][k] * (kP + 1 - r[j][k]) % kP) %= kP;
        }
      }
    }
    (ans += i * dp[n][1] % kP) %= kP;
  }
  cout << ans << '\n';
  return 0;
}

#C. C

由于 \(b\) 单调不升,如果 \([l,r]\) 内 \(k\) 的出现次数小于 \(b_{r-l+1}\),则 \([l,r]\) 的多有包含 \(k\) 的子区间一定不合法

所以我们可以对于每一个出现次数不够的数直接割开进行分治,但是这样复杂度可能会被卡

我们尽量让割开的点靠近中点就可以将复杂度降成 \(O(n\log n)\) 所以我们枚举所有要断开的点,只断开最靠近中点的一个即可

// BLuemoon_
#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 1e6 + 5;

int n, a[kMaxN], b[kMaxN], ans;
unordered_map<int, int> mp;

void Calc(int l, int r) {
  if (r < l || r - l + 1 <= ans) {
    for (int i = l; i <= r; i++) {
      mp[a[i]]--;
    }
    return;
  }
  if (r == l) {
    return mp[a[l]]--, (b[1] == 1) && (ans = max(ans, 1)), void();
  }
  int *p = &a[l], *q = &a[r], e = -1;
  for (; p <= q; p++, q--) {
    if (mp[*p] < b[r - l + 1]) {
      e = p - a;
      break;
    }
    if (mp[*q] < b[r - l + 1]) {
      e = q - a;
      break;
    }
  }
  if (!~e) {
    ans = max(ans, r - l + 1);
    for (int i = l; i <= r; i++) {
      mp[a[i]]--;
    }
    return;
  }
  if (e <= (l + r) / 2) {
    for (int i = l; i <= e; i++) {
      mp[a[i]]--;
    }
    Calc(e + 1, r);
    for (int i = l; i < e; i++) {
      mp[a[i]]++;
    }
    Calc(l, e - 1);
  } else {
    for (int i = e; i <= r; i++) {
      mp[a[i]]--;
    }
    Calc(l, e - 1);
    for (int i = e + 1; i <= r; i++) {
      mp[a[i]]++;
    }
    Calc(e + 1, r);
  }
}

int main() {
  freopen("C.in", "r", stdin), freopen("C.out", "w", stdout);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i], mp[a[i]]++;
  }
  for (int i = 1; i <= n; i++) {
    cin >> b[i];
  }
  Calc(1, n);
  cout << ans << '\n';
  return 0;
}

#D. D

人机线段树合并区间,题解和 std 都没看懂,先咕咕咕

标签:10,07,int,LL,kMaxN,2024,ull,using,ly
From: https://www.cnblogs.com/bluemoon-blog/p/18450429

相关文章

  • 10月日记
    十月日记10.4今天进校门并没有遇到问题也是回到了\(505\)机房老位置有点困,所以模拟赛打的跟⑩一样\(awa\)\(T1\)想到可以二进制拆开,然后把平方转换后直接做就行,但突然一瞬,想法没了(调了半天\(20\)暴力,最后才想起来异或不能取模\(T2\)突然想到可以可以转成\(\sum_{i=1}^......
  • CSP2024 前集训:csp-s模拟9
    前言T1状压挂了\(10pts\),貌似做法是假的,但是一下午也没调出来哪儿假了,但是错误率很低,几百组能有一组错的。T2赛时数据锅了赛后重测了,赛时想到线段树但是没能具体实现,最后无奈写暴力。T3、T4没看。T1邻面合并\(m\le8\)所以考虑状压表示每一行哪些地方被覆盖,对与相邻两......
  • [42] (多校联训) A层冲刺NOIP2024模拟赛03
    今天的乐子今天的乐子2昨天晚上做梦梦见自己被关进戒网瘾学校里面的老师全和疯子一样然后我和这帮疯子老师比疯疯子老师发现他们没我疯所以就把我放了今天的乐子3lhx罗曼蒂克的辟谷A.五彩斑斓赛时的想法\(n^4\)的做法,设\(f_{i,j,k,l}\)表示以\((i,j)......
  • PR剪辑IPhone视频素材,色彩空间Rec.2100的导出问题
    本人使用PR多年,第一次剪辑苹果手机拍的素材,结果导出之后发现出现了过度曝光的情况(PR里面预览是好的)。根据之前学习图形学的经验,应该是HDR视频按照普通视频输出了。更大的亮度范围被截断到上限,出现了这种结果。 查看素材的色彩空间,发现是Rec.2100HLG,这里可以参考PR对于HDR视......
  • 多校A层冲刺NOIP2024模拟赛03 -- T4 量子隧穿问题
    多校A层冲刺NOIP2024模拟赛03--T4量子隧穿问题$$HZOI$$感觉是这两天最有意义的题吧。\(n\)句话题意我是巴甫洛夫的狗,我又重生了,重生在薛定谔的家里。薛定谔是抖S,于是给我铃声。我开始狂跑不止。为什么没流口水没删除我给定\(n\)个点,对于\(i\)存在一条外向连的单向......
  • 题解 QOJ1869【Power Station of Art】/ SS241006B【结论题】
    题解QOJ1869【PowerStationofArt】/SS241006B【结论题】PetrozavodskSummer2021.Day6.XJTUContest,GPofXJTUXXIIOpenCupnamedafterE.V.Pankratiev,GrandPrixofXi'an题目描述给出一个无向图,每个点有点权\(a\)和颜色\(c\),其中颜色只会有红蓝两种。......
  • 『模拟赛』多校A层冲刺NOIP2024模拟赛03
    Rank炸了,触底反弹A.五彩斑斓(colorful)签,又没签上。考虑如何一步步优化暴力。最暴力的思想\(\mathcal{O(n^4)}\)枚举每个矩形,判断四个顶点颜色。稍微优化些,两次\(\mathcal{O(n^2)}\)跑出对于行/列每个点下一个与之颜色相同的坐标,利用容斥全部减去不合法的方案数,然后再枚......
  • 题解 QOJ2559【Endless Road】/ SS241006D【套路题】
    PetrozavodskWinter2022.Day2.KAISTContest+KOITST2021XXIIOpenCupnamedafterE.V.Pankratiev,GrandPrixofDaejeon题目描述现在有\(10^9\)个花盆,依次编号为\(1,2,\dots,10^{9}\)。给定\(n\)个二元组\(L_i,R_i(L_i<R_i)\),我们将进行\(n\)次以下操......
  • 2024初秋集训——提高组 #32
    B.序列删除题目描述有一个长度为\(2N\)的序列\(A\),其中\(1\)到\(N\)恰好出现两次。你每次可以选择两个相同的数\(A_l,A_r(l<r)\)并花费\(r-l\)的代价将其删除。求将整个序列删空的最小代价。思路有一个很显然的贪心就是:每次取代价最小的两个数删除。所以我们按照......
  • CSP2024 前集训:多校A层冲刺NOIP2024模拟赛03
    前言T1没想到正难则反,脑瘫了没敢用bitset(复杂度擦边但卡常能过),T2空间开大了挂了\(100pts\),\(T3\)是原。T1五彩斑斓部分分\(20pts\):\(O(n^4)\)暴力。部分分\(20+?pts\):进行一些优化,极限数据下仍是\(O(n^4)\)。部分分\(60\sim100pts\):bitset优化一下,\(O(\f......