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

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

时间:2024-10-17 19:33:06浏览次数:1  
标签:const log int ll 40 2024 Calc 初秋 dis

B. 艰难睡眠

题目描述

一天有 \(M\) 分钟,依次编号 \(1,2,\dots,M\)。有 \(N\) 个人,第 \(i\) 个人会在 \(A_i\) 分钟开始吵闹,持续 \(B_i\) 分钟(可能会到第二天)。现在你想要睡连续 \(k\) 分钟,所以你要使得这 \(k\) 分钟内没人吵闹。你可以花费 \(c_{i,j}\) 的代价让第 \(i\) 个人从 \(j\) 分钟开始吵闹。求你至少需要多少代价才能睡觉,或者确定你不能睡觉。

思路

显然只有存在 \(B_i>M-k\) 时,你才不能睡觉。

首先枚举在什么时候睡觉,我们可以对于每个人求出他在什么时间段不会吵到睡觉,使用 st 表求出这个时间段内的最小需要代价即可。

时空复杂度均为 \(O(NM\log M)\)。

代码

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

const int MAXN = 5001, MAXM = 2001;

int n, m, k, a[MAXN], log_2[MAXM], ans = int(1e9);
short st[MAXN][14][MAXM];

int Getmin(int i, int l, int r) {
  return min(st[i][log_2[r - l + 1]][l], st[i][log_2[r - l + 1]][r - (1 << log_2[r - l + 1]) + 1]);
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m >> k;
  for(int i = 1; i <= n; ++i) {
    cin >> a[i] >> a[i];
  }
  log_2[1] = 0;
  for(int i = 2; i <= m; ++i) {
    log_2[i] = log_2[i / 2] + 1;
  }
  for(int i = 1; i <= n; ++i) {
    for(int j = 0; j < m; ++j) {
      cin >> st[i][0][j];
    }
    for(int j = 1; j <= 13; ++j) {
      for(int k = 0; k < m; ++k) {
        if(k + (1 << j) - 1 < m) {
          st[i][j][k] = min(st[i][j - 1][k], st[i][j - 1][k + (1 << (j - 1))]);
        }
      }
    }
  }
  for(int i = 1; i <= n; ++i) {
    if(a[i] > m - k) {
      cout << -1;
      return 0;
    }
  }
  for(int i = 0; i < m; ++i) {
    int res = 0;
    bool ok = 1;
    for(int j = 1; j <= n; ++j) {
      int l = (i + k) % m, r = (i - a[j] + m) % m;
      if(l <= r) {
        res += Getmin(j, l, r);
      }else {
        res += min(Getmin(j, 0, r), Getmin(j, l, m - 1));
      }
    }
    ans = min(ans, res);
  }
  cout << ans;
  return 0;
}

C. 路径难题

题目描述

你在一个城市中,可以看作一个 \(N\) 个点 \(M\) 条边的图,其中有一些边连接这些点,你有两种移动方式:

  • 使用出租车移动。每次移动 \(l\) 个单位需要 \(\lceil \frac{l}{r}\rceil\) 的代价。
  • 使用公交车移动。有 \(k\) 种线路,第 \(i\) 个线路可以让你在 \(a_{i,1},a_{i,2},\dots,a_{i,t_i}\) 之间移动,每次移动需要 \(c_i\) 的代价。

有 \(Q\) 次查询,每次查询从 \(a_i\rightarrow b_i\) 的最小代价。

思路

对于公交车,我们可以建一个中转站 \(x_i\),并建边 \(a_{i,j}\overset{c_i}\rightarrow x_i,x_i\overset{0}\rightarrow a_{i,j}\) 即可。

由于这里 \(Q\le 10\),所以对于每次查询暴力跑最短路。最短路中有两个属性:当前出租车走了多远,总共花费了多少代价。

当总代价一样时,很明显出租车行走距离 \(\bmod r\) 更小的之后更优。

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

代码

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

const int MAXN = 210001;
const ll INF = (ll)(1e18);

int r;

struct Node {
  int u;
  ll dis, cost;
  ll Calc() const {
    return cost + (dis + r - 1) / r;
  }
  bool operator<(const Node &b) {
    return Calc() < b.Calc() || (Calc() == b.Calc() && dis % r < b.dis % r);
  }
};

struct cmp {
  bool operator()(const Node &a, const Node &b) const {
    return a.Calc() > b.Calc() || (a.Calc() == b.Calc() && a.dis % r > b.dis % r);
  }
};

struct INFO {
  ll dis, cost;
  ll Calc() const {
    return cost + (dis + r - 1) / r;
  }
  bool operator<(const INFO &b) {
    return Calc() < b.Calc() || (Calc() == b.Calc() && dis % r < b.dis % r);
  }
}dist[MAXN];

int n, m, k, q;
bool vis[MAXN];
vector<pii> e[MAXN];

ll dij(int s, int t) {
  priority_queue<Node, vector<Node>, cmp> pq;
  for(int i = 1; i <= n + k; ++i) {
    dist[i] = {INF, INF};
    vis[i] = 0;
  }
  pq.push({s, 0, 0}), dist[s] = {0, 0};
  for(; !pq.empty(); ) {
    auto [u, dis, cost] = pq.top();
    pq.pop();
    if(u == t) {
      return cost + (dis + r - 1) / r;
    }
    if(vis[u]) {
      continue;
    }
    vis[u] = 1;
    for(auto [v, w] : e[u]) {
      ll nowd = (u <= n && v <= n ? dis + w : 0ll), nowc = cost + (u <= n && v <= n ? 0ll : w + (dis + r - 1) / r);
      if(INFO{nowd, nowc} < dist[v]) {
        dist[v] = INFO{nowd, nowc};
        pq.push({v, nowd, nowc});
      }
    }
  }
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m >> k >> r >> q;
  for(int i = 1, u, v, w; i <= m; ++i) {
    cin >> u >> v >> w;
    e[u].emplace_back(v, w);
    e[v].emplace_back(u, w);
  }
  for(int i = 1, t, c; i <= k; ++i) {
    cin >> t >> c;
    for(int j = 1, x; j <= t; ++j) {
      cin >> x;
      e[x].emplace_back(n + i, c);
      e[n + i].emplace_back(x, 0);
    }
  }
  for(int i = 1, u, v; i <= q; ++i) {
    cin >> u >> v;
    cout << dij(u, v) << "\n";
  }
  return 0;
}

标签:const,log,int,ll,40,2024,Calc,初秋,dis
From: https://www.cnblogs.com/yaosicheng124/p/18472936

相关文章

  • EE4002D AI-Based Teaching
    Commentsfrom02/09meetingwithProfRajeshTotal$2000budgettouse!CoulduseanotsoLmodeliflocallyProjectTemplate:-Problemstatement-Variousoptions[ProsandCons]-SpecificApproachesandimplementation[Splitto2ifneedbe]*-Whatcouldbe......
  • 20241017
    袜子分配(socks)我们可以考虑一下我们是怎么暴搜的,我们搜出一个\(2\timesn\)长度的序列,然后枚举每相邻两个数字,判断是不是合法的,那么也就是说,一个数字想合法,他必须精准的落在这个序列中的一个位置,那么概率是\(2\timesn-1\),有\(n\)对数字,那么期望就是\(n\div......
  • CSP2024 前集训:多校A层冲刺NOIP2024模拟赛08
    前言光顾着想T2了,但是不知道哪儿假了,只有\(\dfrac{n}{k}\le5\)的点是对的,然后居然只有二十分,发现数据放错了,找喵喵改了成五十了。然后T1因为重边挂没了。T3没调出来,确切的说是省的时间不多了打不完,就写了个部分分。T4咕了。机房凳子没靠椅,一直坐着腰快折了肿么办。......
  • 2024年软件设计师中级(软考中级)详细笔记【6】结构化开发方法(分值3~4)
    目录前言6.1系统分析与设计概述6.1.2系统设计的基本原理6.1.3系统总体结构设计6.1.4系统文档6.2.2数据流图6.2.3数据字典(DD)6.5用户界面设计6.5.1用户界面设计的黄金原则杂题习题:结语前言在备考软件设计师中级考试的过程中,我遇到了些许挑战,也收获了宝贵的......
  • 20241016
    intarr[3]={10,20,30};int*parr=arr;1.*parr、*arr分别代表什么   *(parr+0)==*(arr+0)==10==》取首素值=========================================================================      2.*(parr+1)、*(arr+1)、*parr+1、*arr+1分别......
  • 『模拟赛』多校A层冲刺NOIP2024模拟赛08
    Rank还行A.传送(teleport)签。单元最短路,先想Dijkstra。发现这道题还有个不同寻常的移动方式,可以以\(min\left(|x_i-x_j|,|y_i-y_j|\right)\)的代价从\(i\)移动到\(j\)。暴力连边是\(\mathcal{O(n^2)}\)的,时间空间都过不去。被叫去整内务在楼梯上想到,一个点不应......
  • 题解:GZOI2024 D2T2 乒乓球
    考场上切了,但是比较神奇的题,应该是蓝/紫。Discription乒乓球\(\text{}\)时间限制:\(\bold{3}\)秒众所周知,一场乒乓球比赛共有两个玩家\(A\)和\(B\)参与,其中一场比赛由多局比赛组成,而每局比赛中又由多盘比赛组成。每盘比赛\(A\)或\(B\)只有一名选手获胜。当其中一名......
  • 【ACM独立出版 | EI稳检索 】第三届公共卫生与数据科学国际学术会议(ICPHDS 2024)
    随着大数据和人工智能的迅速发展,数据科学在公共卫生领域的应用越来越广泛。会议议题将涵盖公共卫生数据的收集、处理、分析和解读,以及数据科学在流行病学、健康管理、决策支持、公共卫生政策、数据科学理论、人工智能技术、健康大数据分析等方面的应用。第三届公共卫生与数据科......
  • 网络安全2024就业前景如何?找工作容易吗?
    众所周知,网络安全与我们息息相关,无论是企业还是个人都应该重视网络安全。 而网络安全作为一个新兴行业,人才需求量远大于供给,因此在薪资福利上具有很大的优势,但对于初学者而言,很多人依然担心前景问题,那么网络安全就业前景如何?本文将为大家介绍一下。从目前市场情况来讲,网络安......
  • Adobe Premiere(简称PR2024)视频编辑软件下载
    一、发展历史1.1早期版本AdobePremiere(简称PR)是Adobe公司推出的一款视频编辑软件,其历史可以追溯到1991年。当时,Adobe发布了Premiere1.0版本,仅支持MacOS系统。1993年9月,Adobe公司推出了首个针对Windows系统的Premiere版本,这使得更多用户能够接触和使用这款强大的视频编辑工......