首页 > 其他分享 >《如 何 速 通 一 套 题》14.0

《如 何 速 通 一 套 题》14.0

时间:2024-10-08 15:23:12浏览次数:6  
标签:cnt return 14.0 int u64 using dp

邮寄

核爆赛,拿完暴力走人了......

A(由于题目名称为“我是 A 题”所以省略,下同)

我们处理掉整个整个的 \(A \times B\) 的面,然后从上往下倒序枚举 C。

当枚举到一个 C 时,我们把这个 C 独有的贡献加上去(这就是为什么要倒序枚举 C)。

由于本题数据太水,暴力可过。理论上可以线段树优化,但是我不会。

#include <bits/stdc++.h>
using namespace std;
using u64 = unsigned long long;
using i128 = __int128_t;

int n, a[30000030], b[30000030], c[30000030], A, B, C, hst, mh[30000030];
u64 x, y;
i128 ans;

u64 twist(u64 &x, u64 &y) {
  u64 u = x, v = y;
  x = v;
  u ^= u << 23;
  y = u ^ v ^ (u >> 17) ^ (v >> 26);
  return v + y;
}

void write(i128 x) {
  if(!x) {
    return ;
  }
  write(x / 10);
  cout.put(x % 10 + '0');
}

int main() {
  freopen("A.in", "r", stdin);
  freopen("A.out", "w", stdout);
  cin >> n >> A >> B >> C >> x >> y;
  for(int i = 1; i <= n; i++) {
    a[i] = twist(x, y) % A + 1;
    b[i] = twist(x, y) % B + 1;
    c[i] = twist(x, y) % C + 1;
    if(twist(x, y) % 3 == 0) {
      a[i] = A;
    }
    if(twist(x, y) % 3 == 0) {
      b[i] = B;
    }
    if(a[i] != A && b[i] != B) {
      c[i] = C;
    }
    if(a[i] == A && b[i] == B) {
      hst = max(hst, c[i]);
    }
  }
  ans = (i128)(A) * B * hst;
  for(int r = C; r > hst; r--) {
    for(int i = 1; i <= n; i++) {
      if(c[i] == r) {
        mh[a[i]] = max(mh[a[i]], b[i]);
      }
    }
    for(int i = A; i >= 1; i--) {
      mh[i] = max(mh[i], mh[i + 1]);
      ans += mh[i];
    }
  }
  write(ans);
  return 0;
}

B

一道智障概率 dp。

但是我没有想出来......

我们设 \(dp_{i, j}\) 为当前过了 \(i\) 道工序,目前的物品排名为 \(j\) 的概率

\(dp_{i + 1, j} \leftarrow dp_{i, j} * (1 - p_{i + 1})^j\)
\(dp_{i + 1, j - 1} \leftarrow dp_{i, j} * [1 - (1 - p_{i + 1})^{j - 1}]\)

然后就可以直接做了。

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

const int kMod = (int)(1e9) + 7;

int n, dp[330][330], p[330], ans;

int qpow(int x, int y) {
  int rs = 1;
  for(; y; y >>= 1) {
    if(y & 1) {
      rs = 1ll * rs * x % kMod;
    }
    x = 1ll * x * x % kMod;
  }
  return rs;
}

signed 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 x = 1; x <= n; x++) {
    dp[0][x] = 1;
    for(int i = 0; i < n - 1; i++) {
      for(int j = 1; j <= n; j++) {
        dp[i + 1][j] = (dp[i + 1][j] + 1ll * dp[i][j] * qpow((kMod + 1 - p[i + 1]) % kMod, j)) % kMod;
        dp[i + 1][j - 1] = (dp[i + 1][j - 1] + 1ll * dp[i][j] * (kMod + 1 - qpow((kMod + 1 - p[i + 1]) % kMod, j - 1))) % kMod;
        //cout << dp[i][j] << ' ';
      }
    }
    ans = (ans + 1ll * dp[n - 1][1] * x) % kMod;
    for(int i = 0; i < n; i++) {
      for(int j = 1; j <= n; j++) {
        dp[i][j] = 0;
      }
    }
  }
  cout << ans << '\n';
  return 0;
}

C

如果 $[l, r]$ 因为一个数导致 $[l, r]$ 不合法,那么任何包含这个数的 $[l, r]$ 的子区间都不合法

假设这个数为 \(x\),位置为 \(p\)。

\([l, r]\) 的一个子区间,长度一定 \(\le r - l + 1\),所以 \(b_{len} \le b_{len'}\)。

既然这个子区间包含 \(p\),那么 \(cnt_p \ge cnt'_p\)。

\(\therefore b_{len'} \ge b_{len} \ge cnt_p \ge cnt'_p\),这个子区间不合法。

然后就可以随便找到一个断点分治了。

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

int n, arr[1000010], brr[1000010], cnt[1000010], ans;

void solve(int l, int r) {
  if(l > r) {
    return ;
  }
  int len = r - l + 1;
  for(int i = l, j = r; i <= j; i++, j--) {
    if(cnt[arr[i]] < brr[len]) {
      for(int k = l; k <= i; k++) {
        cnt[arr[k]]--;
      }
      solve(i + 1, r);
      for(int k = l; k < i; k++) {
        cnt[arr[k]]++;
      }
      solve(l, i - 1);
      return ;
    }
    if(cnt[arr[j]] < brr[len]) {
      for(int k = j; k <= r; k++) {
        cnt[arr[k]]--;
      }
      solve(l, j - 1);
      for(int k = j + 1; k <= r; k++) {
        cnt[arr[k]]++;
      }
      solve(j + 1, r);
      return ;
    }
  }
  ans = max(ans, len);
  for(int i = l; i <= r; i++) {
    cnt[arr[i]]--;
  }
}

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

标签:cnt,return,14.0,int,u64,using,dp
From: https://www.cnblogs.com/leavenothingafterblog/p/18451236/speedrunv14

相关文章

  • CentOS 7.9安装ElasticSearch7.14.0、ElasticSearch-Head、Kibana、Node14.18.2
    CentOS7.9安装ElasticSearch7.14.0、ElasticSearch-Head、Kibana、Node14.18.2 1.安装文件1.elasticsearch-7.14.0-linux-x8664.tar.gz2.elasticsearch-head-master.zip3.jdk-11linux-x64bin.tar.gz4.kibana-7.14.0-linux-x8664.tar.gz5.node-v14.18.2-linux-......
  • Android 14.0 recovery竖屏界面旋转为横屏
    1.概述在14.0系统rom项目定制化开发中,由于平板固定横屏显示,而如果recovery界面竖屏显示就觉得怪怪的,所以需要recovery页面横屏显示的功能,所以今天就来解决这个问题2.实现功能相关分析Android的Recovery中,利用bootable\recovery下的minui库作为基础,采用的是直接存取framebu......
  • android 14.0 Launcher3定制folder文件夹16宫格实现二
    1.概述在14.0的系统产品rom定制化开发中,对于Launcher3的定制功能也是不少的,比如在Launcher3中添加默认文件夹,把默认的app添加的文件夹里面,其他的app然后按顺序排序。在文件夹布局就是默认的16宫格布局,接下来分析下相关源码来实现功能2.Launcher3定制化之修改添加的默认文件......
  • android 14.0 Launcher3禁止拖拽app图标到第一屏
    1.概述在14.0系统rom进行定制化开发Launcher3中,会对Launcher3做些要求,比如现在的需求就是Launcher3第一屏的图标固定,不让其他屏的图标拖动到第一屏所以说这个需求和禁止拖拽图标到Hotseat类似,也是从WorkSpace.java里面寻找解决方案,然后实现相关功能2.Launcher3禁止拖拽app......
  • 安卓11报错:Failed to resolve: com.github.xxxx:14.0 Show in Project Structure dial
    本篇文章主要讲解,安卓11版本情况下项目运行报错Failedtoresolve:com.github.getActivity:Toaster:14.0ShowinProjectStructuredialogAffectedModules:app的主要原因及解决办法。作者:任聪聪独立博客:https://rccblogs.com/631.html日期:2024年8月28日具体......
  • 010 Editor for Mac(文本和十六进制编辑器)v14.0版
    010EditorforMac是一款十分强大的二进制文件编辑器,可以用于编辑任何类型的二进制文件,包括磁盘映像、可执行文件、媒体文件、数据文件等等。该软件提供了多种文件格式的解析和编辑功能,支持自定义模板,用户可以根据自己的需求创建自己的模板来解析和编辑各种类型的二进制文件。......
  • Ubuntu14.04QT程序开机自启动(转)
     按语:    linux应用程序设为开机自启动,可修改/etc/rc.local中添加启动代码,但QT应用程序无法自动启动,后参考此文,添加应用(原来做好的desktop文件),成功。1.运行已经编辑好的QT程序,run、debug,生成类似于build-qtplot-Desktop-Debug的文件,当然程序在编译时会显示该debu......
  • Android 14.0 Camera2 静音时拍照去掉快门声音
    1.概述在14.0系统rom定制化开发时,在Camera2静音情况下有快门拍照声音,这就不符合使用规范了静音的情况下拍照也不应该发出声音,所以在静音拍照流程中要求去掉快门声音,接下来具体实现相关的功能2.Camera2静音拍照去掉快门声音核心代码/packages/apps/Camera2/src/co......
  • Android 14.0 开机过滤部分通知声音(莫名其妙的通知声音)
    1.概述 在14.0的系统定制开发产品的中,有时候在系统开机的时候会有一些通知的声音,但是由于系统模块太多,也搞不清楚到底是哪个模块发出的通知声音,所以就需要从通知的流程来屏蔽这些通知声音,接下来看具体怎么实现在开机的时候过滤开机声音的功能2.开机过滤部分通知声音(莫名其......
  • Android 14.0 Launcher3仿ios长按app图标实现拖拽抖动动画
    1.概述在14.0的系统rom定制化开发中,在对系统原生Launcher3的定制需求中,也有好多功能定制的,在ios等电子产品中的一些好用的功能,也是可以被拿来借用的,所以在最近的产品开发需求中,需求要求模仿ios的功能实现长按app图标实现抖动动画,接下来看如何分析该功能的实现.效果图如图:......