首页 > 其他分享 >2024初秋集训——提高组 #23

2024初秋集训——提高组 #23

时间:2024-09-30 20:44:35浏览次数:8  
标签:emplace ve 23 int back 2024 MAXN 初秋 size

C. 前缀

题目描述

给定一个字符串 \(S\),你会将这个字符串无限循环,即变成 \(S+S+S+S+\dots\)。

接着给定一个字符串 \(T\),你要求最短的一个 \(S\) 的前缀使得其中存在一个子序列 \(T\),若 \(T_i=*\),则这一位是什么都可以。但由于 \(T\) 太长了,所以其中有一些字符后会有数字,表示这个字符重复了这么多次。

思路

我们对每个字符记录其出现位置,然后找循环节即可。

空间复杂度 \(O(|S|+|\sum|)\),时间复杂度 \(O(Q+(\sum|T|)\log |S|)\)。

代码

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

const int MOD = 998244353;

int q;
string s;
vector<int> ve[27];

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> s >> q;
  for(int i = 0; i < int(s.size()); ++i) {
    ve[s[i] - 'a'].emplace_back(i);
    ve[26].emplace_back(i);
  }
  for(; q--; ) {
    string t;
    cin >> t;
    int pos = -1, ans = 0;
    bool op = 0;
    for(int i = 0; i < int(t.size()); ) {
      int c = (t[i] == '*' ? 26 : t[i] - 'a');
      if(ve[c].empty()) {
        op = 1;
        break;
      }
      int l = i, m = 0, res = 0;
      for(i++; i < int(t.size()) && t[i] >= '0' && t[i] <= '9'; ++i) {
        res = (10ll * res % MOD + (m * 10 + t[i] - '0') / int(ve[c].size())) % MOD;
        m = (m * 10 + t[i] - '0') % int(ve[c].size());
      }
      ans = (ans + res) % MOD;
      if(l + 1 == i) {
        m = 1;
      }
      int x = upper_bound(ve[c].begin(), ve[c].end(), pos) - ve[c].begin();
      if(int(ve[c].size()) - x >= m) {
        pos = ve[c][(x + m + ve[c].size() - 1) % int(ve[c].size())];
        if(!x && !m) {
          ans = (ans - 1 + MOD) % MOD;
        }
        continue;
      }
      m -= ve[c].size() - x;
      ans = (ans + 1) % MOD;
      pos = ve[c][m - 1];
    }
    cout << (op ? -1 : (1ll * ans * int(s.size()) % MOD + pos + 1) % MOD) << "\n";
  }
  return 0;
}

D. 移动

题目描述

有 \(N\) 个闸门,其中有 \(M\) 个事件,每个事件为:在时间 \([l,r]\) 中闸门 \(x\) 关闭。保证每一个闸门的事件时间不会有交集。

牛牛一开始在闸门 \(0\),时刻为 \(0\)。每秒钟他可以走到左/右边的闸门或原地不动。当闸门关闭时如果牛牛还在下面那么牛牛就会变成牛排。求在不变成牛排的情况下最少要到什么时候才能到达闸门 \(N+1\)。

思路

我们可以对每个闸门处理出其没有关闭的时间段。由于一开始有 \(N+2\) 个闸门,也就是 \(N+2\) 个时间段,每多一个事件就会多一个时间段,所以总共 \(O(N+M)\) 个时间段。

我们可以在这些时间段之间连边,而边的数量可以通过感性理解发现也是 \(O(N+M)\) 的。

接着在这个图上跑最短路即可。

空间复杂度 \(O(N+M)\),时间复杂度 \(O((N+M)\log (N+M))\)。

代码

#include<bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;

const int MAXN = 100005, MAXM = MAXN, INF = int(2e9) + 10;

struct Node {
  int u, dis;
};

struct cmp {
  bool operator()(const Node &a, const Node &b) const {
    return a.dis > b.dis;
  }
};

int n, m, l[MAXN + MAXM], r[MAXN + MAXM], tot, dist[MAXN + MAXM];
bool vis[MAXN + MAXM];
vector<int> ve[MAXN], L[MAXN], R[MAXN], id[MAXN];
vector<pii> e[MAXN + MAXM];

void add(int x, int y) {
  for(int i = 0; i < int(L[x].size()); ++i) {
    int j = lower_bound(R[y].begin(), R[y].end(), L[x][i] - 1) - R[y].begin();
    for(; j < int(R[y].size()) && L[y][j] <= R[x][i] + 1; ++j) {
      e[id[x][i]].emplace_back(id[y][j], max(L[x][i] + 1, L[y][j]));
    }
  }
}

void dij() {
  fill(dist + 1, dist + tot + 1, INF);
  priority_queue<Node, vector<Node>, cmp> pq;
  pq.push({1, 0});
  dist[1] = 0;
  for(; !pq.empty(); ) {
    auto [u, dis] = pq.top();
    pq.pop();
    if(vis[u]) {
      continue;
    }
    vis[u] = 1;
    for(auto [v, w] : e[u]) {
      if(max(dis + 1, w) <= r[v] && max(dis + 1, w) < dist[v]) {
        dist[v] = max(dis + 1, w);
        pq.push({v, max(dis + 1, w)});
      }
    }
  }
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  freopen("move.in", "r", stdin);
  freopen("move.out", "w", stdout);
  cin >> n >> m;
  for(int i = 0; i <= n + 1; ++i) {
    ve[i].emplace_back(-1);
    ve[i].emplace_back(INF);
  }
  for(int i = 1, x, l, r; i <= m; ++i) {
    cin >> x >> l >> r;
    ve[x].emplace_back(l);
    ve[x].emplace_back(r);
  }
  for(int i = 0; i <= n + 1; ++i) {
    sort(ve[i].begin(), ve[i].end());
    for(int j = 0; j < int(ve[i].size()); j += 2) {
      ve[i][j]++, ve[i][j + 1]--;
      if(ve[i][j] > ve[i][j + 1]) {
        continue;
      }
      L[i].emplace_back(ve[i][j]);
      R[i].emplace_back(ve[i][j + 1]);
      id[i].emplace_back(++tot);
      l[tot] = ve[i][j], r[tot] = ve[i][j + 1];
    }
  }
  for(int i = 0; i <= n + 1; ++i) {
    if(i) {
      add(i, i - 1);
    }
    if(i <= n) {
      add(i, i + 1);
    }
  }
  dij();
  cout << dist[tot];
  return 0;
}

标签:emplace,ve,23,int,back,2024,MAXN,初秋,size
From: https://www.cnblogs.com/yaosicheng124/p/18442418

相关文章

  • 2024.9.29校测
    T1题目描述\(Mr.Hu\)最近偶得一函数:\(f(n)=(\displaystyle\sum_{d\midn}\varphi(d))^m(\sum_{d\midn}\sigma_0(d)\mu(\fracnd)\fracnd)\)其中\(\sigma_0(n)\)表示\(n\)的正约数个数,比如\(\sigma_0(12)=6\),因为\(12\)有\(1,2,3,4,6,12\)共......
  • 解析2024年电工杯A题:园区微电网风光储协调优化配置(完整代码分享)
    引言2024年电工杯数学建模竞赛的A题聚焦于园区微电网的风光储协调优化配置问题。这一问题旨在通过数学建模和优化算法,提高风光发电在园区总发电量中的占比,同时减少因风光发电与负荷不匹配导致的弃电问题。本文将介绍题目背景、解题思路,并提供代码获取方式。题目背景园区微电......
  • IEEE独立出版!暨南大学与中山大学联合主办!第四届电子信息工程与计算机技术国际学术会议
         第四届电子信息工程与计算机技术国际学术会议(EIECT2024)20244thInternationalConferenceonElectronicInformationEngineeringandComputerTechnology2024年11月15-17日|中国深圳#往届均已成功见刊、EI检索;先投稿,先送审,先录用!快至投稿后三天录用!......
  • 【Ehviewer绿色版】2.0.8.4最新版本下载2024安卓苹果
    Ehviewer开发应用程序(App)是一项综合性的工作,涉及从构思到发布等多个环节。以下是开发一个基本应用程序的教程,Ehviewer包括从概念设计到发布的完整流程。Ehviewer本教程将分别介绍iOS和Android平台的开发过程。ehviewer官方安装包下载:http://ez.oubaidu.com/一、Ehviewer构......
  • 2024最新前端八股文
    近期整理了一下高频的前端面试题,分享给大家一起来学习。如有问题,欢迎指正!如需完整版可以【点此获取】【1】CSS面试真题【2】ES6面试真题【3】Git面试真题【4】HTTP面试真题【5】JavaScript面试真题【6】Linux面试真题【7】Node.js面试真题【8】React面试真题【9】Typ......
  • CSP-S 2024 第七次
    有打对拍的时间不去想想T4?好吧根据一些经验分析确实该先写拍打一场模拟赛造三题数据,就当攒RP了A钦定\(A_i,B_j,C_k,D_l,E_m\)的中位数是它们按值为第一关键字,所属序列编号为第二关键字排序后正中间的数,这样就可以确定中位数在哪个序列的哪一位。枚举中位数在哪个序列的......
  • 软件著作权申请教程(超详细)(2024新版)软著申请
              目录一、注册账号与实名登记二、材料准备三、申请步骤1.办理身份2.软件申请信息3.软件开发信息4.软件功能与特点5.填报完成一、注册账号与实名登记    首先我们需要在官网里面注册一个账号,并且完成实名认证,一般是注册【个人】的身份。......
  • PICO 2 RP2350使用官方推荐RISC-V编译器在O3优化下的coremark跑分,与Hazard3库宣传跑分
    编译环境:WSLUbuntu22.04GCC13.2.0 Hazard3存储库https://github.com/Wren6991/Hazard3/RP2350默认频率150MHz,编译内核为其RISC-V架构内核,在此频率下实测O3等级跑分453左右,O2等级跑分429左右。在测试时,当我打开第二个核心后,并且第二个核心只用来控制led灯,此时coremark跑......
  • 【JPCS独立出版】第四届机电一体化技术与航空航天工程国际学术会议(ICMTAE 2024)
    第四届机电一体化技术与航空航天工程国际学术会议(ICMTAE2024)20244th InternationalConferenceon MechatronicsTechnologyandAerospaceEngineering大会时间:2024年11月8-10日大会地点:中国-南昌大会官网:http://www.ic-icsm.com/【论文投稿】收录检索:EI和Scopus......
  • 【EI检索】第五届先进材料与智能制造国际学术会议(ICAMIM 2024)
    第五届先进材料与智能制造国际学术会议(ICAMIM2024)20245th InternationalConferenceonAdvancedMaterialsandIntelligentManufacturing大会时间:2024年11月01日-03日大会地点:广州大会官网:http://www.ic-icsm.com/【论文投稿】收录检索:EI +Scopus主办单位:广......