首页 > 其他分享 >2023-10-15 模拟赛总结

2023-10-15 模拟赛总结

时间:2023-10-15 17:33:24浏览次数:36  
标签:10 le 15 int top kMaxN stk 2023 LL

模拟赛链接

排名:\(\text{rank 9}\)
分数:\(0+0+100+60=160\)
第一第二题我连暴力都没打出来我是什么废物。

T1:情景剧 / tv

题目描述:

给你一个长度为 \(n\) 的序列 \(a_1,a_2,\dots a_n\),请求出一个区间 \([l,r]\),使得这个区间里的最大值乘最小值乘这个区间的长度的值最大,输出这个最大值。(\(n\le 2\times 10^6,a_i\le 10^9\))

思路:

我们考虑先枚举最小值,肯定要让区间长度最大,所以我们可以分别找到这个最小值的左边和右边第一个比他小的数的右边或左边,也就是要让这一段的区间长度最大的前提下最小值还是这个数,这很明显可以用单调栈求解,然后最大值一定就定下来了,这可以用 st 表求解。注意结果可能过大需要高精度。

代码:

#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 2e6 + 5, kL = 22;

int n, a[kMaxN], lg[kMaxN], f[kMaxN][kL], pre[kMaxN], suf[kMaxN], stk[kMaxN], top;
string s;
__int128 ans;

int Get(int l, int r) {
  int t = lg[r - l + 1];
  return max(f[l][t], f[r - (1 << t) + 1][t]);
}

int main() {
  freopen("tv.in", "r", stdin);
  freopen("tv.out", "w", stdout);
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n, lg[0] = -1;
  for (int i = 1; i <= n; i++) {
    cin >> a[i], f[i][0] = a[i], lg[i] = lg[i / 2] + 1;
  }
  for (int i = 1; i <= n; i++) {
    for (; top && a[stk[top]] > a[i]; top--) {
    }
    pre[i] = stk[top] + 1, stk[++top] = i;
  }
  top = 0;
  for (int i = n; i; i--) {
    for (; top && a[stk[top]] > a[i]; top--) {
    }
    suf[i] = (stk[top] ? stk[top] - 1 : n), stk[++top] = i;
  }
  for (int j = 1; j < kL; j++) {
    for (int i = 1; i + (1 << j - 1) - 1 <= n; i++) {
      f[i][j] = max(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);
    }
  }
  for (int i = 1; i <= n; i++) {
    ans = max(ans, (__int128)1 * Get(pre[i], suf[i]) * a[i] * (suf[i] - pre[i] + 1));
  }
  for (; ans; s += ans % 10 + '0', ans /= 10) {
  }
  reverse(s.begin(), s.end()), cout << s;
  return 0;
}

T2:抽卡 / card

无……

T3:修改 01 序列 / mo

题目描述:

给你一个长度为 \(n\) 的 01 序列 \(a\),你可以操作序列花费 \(1\) 的代价将序列里的其中一个数从 \(1\) 变成 \(0\) 或从 \(0\) 变成 \(1\)。(\(1\le d\le n\le 10^5\))

思路:

首先我们可以发现,将 \(0\) 变成 \(1\) 的操作是没有必要的,如果要满足要求那么至少要有一个 \(k\) 使得 \(p \equiv k \pmod d\)(\(p\) 为任意 \(a_p=1\) 的 \(p\))那么我们可以枚举这个 \(k\),然后用一个桶预处理出位置除以 \(d\) 余数为 \(r\) 的这个位置为 \(1\) 的位置的数量,然后再预处理出整个序列一共有多少个 \(1\),然后就没了。

代码:

#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 1e5 + 5;

int n, d, cnt[kMaxN], ans = 1e9;

int main() {
  freopen("mo.in", "r", stdin);
  freopen("mo.out", "w", stdout);
  cin >> n >> d;
  for (int i = 1, a; i <= n; i++) {
    cin >> a, cnt[i % d] += a, cnt[d] += a;
  }
  for (int i = 0; i < d; i++) {
    ans = min(ans, cnt[d] - cnt[i]);
  }
  cout << ans;
  return 0;
}

T4:集合 / set

题目描述

给定正整数 \(n\),计算 \(n\) 个元素的集合 \(\{1, 2, ..., n\}\),所有非空子集的乘积取模 \(998244353\) 后的结果。(\(n\le 200\))

思路:

看到子集,第一眼想到动态规划(暴搜),其实这就很像一个 01 背包,设 \(f_{i,j}\) 为选到第 \(i\) 个元素,当前的和为 \(j\) 的子集数量,那么答案就是 \(\sum i^{f_{n,i}} \mod 998244353\),很容易求出转移方程为:

\[f_{i,j}=(f_{i-1,j}+f_{i-1,j-i}) \bmod 998244353 \]

但是 \(f_{n,i}\) 是指数,无法直接取模,我们可以用到费马小定理:

若 \(p\) 为质数,且 \(a,p\) 互质,那么就有 \(a^{p-1}\equiv 1 \pmod p\)

所以我们可以将所有 \(f_{i,j}\) 对 \(998244353-1\) 取模即可。

代码:

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int kMaxN = 205, kM = 998244353;

int n;
LL f[kMaxN][kMaxN * kMaxN], ans = 1;

LL fpow(LL a, LL b, LL p, LL ret = 1) {
  for (; b; b >>= 1, a = a * a % p) {
    (b & 1) && (ret = ret * a % p);
  }
  return ret;
}

int main() {
  freopen("set.in", "r", stdin);
  freopen("set.out", "w", stdout);
  cin >> n;
  f[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= n * (n + 1) / 2; j++) {
      f[i][j] = f[i - 1][j];
      j >= i && (f[i][j] = (f[i][j] + f[i - 1][j - i]) % (kM - 1));
    }
  }
  for (int i = 1; i <= n * (n + 1) / 2; i++) {
    ans = ans * fpow(i, f[n][i], kM) % kM;
  }
  cout << ans;
  return 0;
}

标签:10,le,15,int,top,kMaxN,stk,2023,LL
From: https://www.cnblogs.com/lrx-blogs/p/2023-10-15-contest-summary.html

相关文章

  • 2023-10-15 闲话
    不完全统计:南开大学中南大学南方科技大学吉林大学杭州电子科技大学都是能凑出来三Ag的ACM队伍的。在船上的,祝你好运。列车总会到站,希望你珍惜旅途中的时光。人总有死的一天,总要生的伟大。虽然高代作业多做几个少做几个不会影响你是不是伟大,但是这点高代作业都做不出来......
  • 2023-2024-1 20231320 《计算机基础与程序设计》第三周学习总结
    2023-2024-120231320《计算机基础与程序设计》第三周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2022-2023-1计算机基础与程序设计第三周作业)这个作业的目标<自学《计算机基础与......
  • 配置GT9157触摸屏,获取触摸位置
    触摸IC为GT91571.配置触摸屏引脚VDDSCLSDARSTINTGND电源I2C时钟I2C数据屏幕复位屏幕触摸信号地staticvoidI2C_GPIO_Config(void){GPIO_InitTypeDefGPIO_InitStructure;/*I2CPeriphclockenable*/RCC_APB1PeriphClockCmd(GTP_I2C_CLK,ENA......
  • 10-多比特信号的跨时钟域处理
    1.两级触发器的问题2.多比特跨时钟域的处理方法FIFO是处理跨时钟问题的最常用问题3.格雷码编码处理跨时钟域4.异步FIFO5.多比特跨时钟域的握手处理......
  • 苹果10月24日推送iOS 17.1:修复iPhone 12辐射超标问题 信号会更差
    前段时间在iPhone15系列发布的当天,法国突然宣布iPhone12不能在该国销售,理由是iPhone12超过了当地无线电频率暴露的法定范围。根据法国监管机构ANFR(国家频率管理局)发布的最新消息,苹果将会在10月24日推送iOS17.1正式版,届时将解决iPhone12辐射超标问题。据悉,新系统将会降低iP......
  • ArcGIS 10.7 下载与安装教程!
    软件介绍:ArcGis是美国Esri公司研发的构建于工业标准之上的无缝扩展的GIS产品家族。它整合了数据库、软件工程、人工智能、网络技术、云计算等主流的IT技术,宗旨在为用户提供一套完整的、开放的企业级GIS解决方案。无论是在桌面端、服务器端、浏览器端、移动端乃至云端,ArcGis10都有与......
  • 阿里云10M公网带宽价格表_计算一下可真贵!
    阿里云服务器10M带宽收费价格表,阿里云服务器上海地域10M带宽一年优惠价格5355元,10M带宽一个月525元,地域不同带宽价格不同,阿里云服务器网以华东1(上海)地域为例,5M及5M以下带宽按照23元一个月的价格收取,6M及6M以上公网带宽按照80元一个月的价格收取。阿里云百科使用阿里云价格计算器,计......
  • 2023_10_15_DAY_01_JAVA_SE_Java基础知识_中_变量与运算符
    2023_10_15_DAY_01_JAVA_SE_Java基础知识_中_变量与运算符标识符、关键字和保留字标识符在Java语言中,通过标识符来表示一些元素的名字,比如变量名、类名、方法名和包名等。Java中的标识符要符合下面的规则:标识符必须以字母、下划线(_)、数字或美元($)组成;标识符必须由字母、下......
  • 20211105李宜时信息安全系统设计与实现第五周自学笔记
    20211105李宜时信息安全系统设计与实现第五周自学笔记:EXT2文件系统和三级文件系统EXT2文件系统EXT2(ExtendedFileSystem2)是一种广泛用于Linux操作系统的文件系统。它是EXT文件系统家族的第二个版本,设计用于提供高性能和可靠性的存储解决方案。以下是一些关于EXT2文件系统的关......
  • CSP 2023 游记
    笔者今年(2023年)高一,坐标SC。2023.9.16初赛,然而运势是大凶。真的就我是大凶两点过到了教科院附中门口,没看到教练,同校OIer也都已经进去了。进校之后遇到了这正找考场的sh。14:30开始考试,考生(包括本人)有且仅有4个人。。。发现有一道选择题就是P2765,甚至是样例,所以直接......