首页 > 其他分享 >OOI XVIII

OOI XVIII

时间:2024-10-20 21:13:09浏览次数:8  
标签:cout int OOI MAXN using 礼物 XVIII ve

CF 1939 B

题目描述

有一些点和 \(N-1\) 次操作,每次会在点 \(u\) 上所有纸条的上方贴一张纸条 \(c_u\),在 \(v\) 上贴 \(c_v\),并在两个点之间建一条边权为 \(w_{u,v}\) 的边,这次操作必须满足 \(c_u+c_v\ge w_{u,v}\)。

现在给你每个点上从上至下的纸条和所有边的边权,请给出一种加边方案或确定方案不存在。

思路

我们考虑从叶子结点一步一步贪心地往上推。我们可以从叶子结点开始,对于每个儿子找到最小的可以满足地纸条并使用即可。

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

代码

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

const int MAXN = 200001;

int n, q, d[MAXN], fid[MAXN];
vector<int> a[MAXN];
set<pii> s[MAXN];
vector<tuple<int, int, int>> e[MAXN];
vector<pii> edge;

void dfs(int u, int fa) {
  a[u].resize(e[u].size());
  for(auto [v, w, id] : e[u]) {
    if(v != fa) {
      fid[v] = id;
      dfs(v, u);
      auto it = s[u].lower_bound({w - s[v].begin()->first, 0});
      if(it == s[u].end()) {
        cout << "No";
        exit(0);
      }
      a[u][it->second] = id;
      s[u].erase(it);
    }
  }
}

void DFS(int u) {
  for(int x : a[u]) {
    if(!x) {
      cout << fid[u] << " ";
    }else {
      DFS(edge[x - 1].first == u ? edge[x - 1].second : edge[x - 1].first);
    }
  }
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> q;
  for(int i = 1, u, v, w; i < n; ++i) {
    cin >> u >> v >> w;
    e[u].emplace_back(v, w, i);
    e[v].emplace_back(u, w, i);
    edge.emplace_back(u, v);
    d[u]++, d[v]++;
  }
  for(int i = 1; i <= n; ++i) {
    for(int j = 1, x; j <= d[i]; ++j) {
      cin >> x;
      s[i].insert({x, d[i] - j});
    }
  }
  dfs(1, 0);
  cout << "Yes\n";
  DFS(1);
  return 0;
}

CF 1939 C

题目描述

有 \(k\) 个一模一样地栈,每个栈的第 \(i\) 个元素是一个种类为 \(A_i\) 的礼物。有若干个人,每个人都可以拿若干个礼物,只有拿完了前一个栈中的礼物,才能拿下一个栈的,并且只能从栈顶拿。但每个人拿的不同种类礼物数量不能超过 \(t\) 个,求至少要多少个人才能把礼物拿完。

思路

很明显一个人会拿所有能拿的,所以我们可以用双指针预处理出从每个礼物开始拿会拿到哪个礼物。使用倍增求解即可。

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

代码

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

const int MAXN = 600001;

int n, k, t, a[MAXN], tot, cnt[MAXN], f[61][MAXN];
ll g[61][MAXN], ans;
vector<int> ve;

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> k >> t;
  for(int i = 1; i <= n; ++i) {
    cin >> a[i];
    ve.emplace_back(a[i]);
  }
  sort(ve.begin(), ve.end()), ve.erase(unique(ve.begin(), ve.end()), ve.end());
  if(t >= ve.size()) {
    cout << 1;
    return 0;
  }
  for(int i = 1; i <= n; ++i) {
    a[i] = lower_bound(ve.begin(), ve.end(), a[i]) - ve.begin() + 1;
    if(a[i] != a[tot]) {
      a[++tot] = a[i];
    }
  }
  for(int i = 1; i <= tot; ++i) {
    a[tot + i] = a[i];
  }
  int res = 0;
  for(int i = 1, j = 1; i <= tot; --cnt[a[i]], res -= !cnt[a[i]], ++i) {
    for(; j <= 2 * tot && res + !cnt[a[j]] <= t; res += !cnt[a[j]], ++cnt[a[j++]]) {
    }
    f[0][i] = (j > tot ? j - tot : j);
    g[0][i] = (j > tot);
  }
  for(int i = 1; i <= 60; ++i) {
    for(int j = 1; j <= tot; ++j) {
      f[i][j] = f[i - 1][f[i - 1][j]];
      g[i][j] = g[i - 1][j] + g[i - 1][f[i - 1][j]];
    }
  }
  int x = 1;
  ll pos = 1;
  for(int i = 60; i >= 0; --i) {
    if(pos + g[i][x] <= k) {
      pos += g[i][x], x = f[i][x], ans += (1ll << i);
    }
  }
  res = 0;
  for(int i = 1; i <= n; ++i) {
    cnt[i] = 0;
  }
  for(int i = x, j = x; i <= tot; i = j) {
    for(; j <= tot && res + !cnt[a[j]] <= t; res += !cnt[a[j]], ++cnt[a[j++]]) {
    }
    ans++;
    res = 0;
    for(int p = i; p < j; ++p) {
      cnt[a[p]] = 0;
    }
  }
  cout << ans;
  return 0;
}

标签:cout,int,OOI,MAXN,using,礼物,XVIII,ve
From: https://www.cnblogs.com/yaosicheng124/p/18487893

相关文章

  • COOIS/COHV增强
    1、文档说明本文档介绍COOIS/COHV事务码中常用的选择屏幕增强和ALV增强2、选择屏幕增强COOIS生产订单抬头选择屏幕添加筛选条件,并将自定义数据添加到报表 选择屏幕新增筛选字段函数模块中,将选择屏幕筛选条件抛到内存。此处可以优化,将不属于自定义删选条件去掉,只抛自定义筛......
  • nginx 获取cooike的2种方式
    server{listen10001;server_namelocalhost;default_typetext/html;location=/favicon.ico{log_not_foundoff;access_logoff;}set$userN......
  • 使用cooike
    方法1:手动添加cooike先用浏览器打开首页:'https://xq.com/',此时浏览器会被分配'Cookie'在headers里加入 'User-Agent'、'Referer'、'Cookie'去请求URL因为这里是异步加载,因此需要从“Fetch/XHR”的请求中查到“标头”里的请求地址urlimportrequestsheaders={'User-......
  • Java set-cooike cookie.setDomain错误
    javacookie.setDomain(".test.com");错误Therewasanunexpectederror(type=InternalServerError,status=500).Aninvaliddomain[.test.com]wasspecifiedforthiscookiepublicvoidsetCookie(HttpServletResponseresponse,Stringtoken){/......
  • 题解 P6878 [JOI 2020 Final] JJOOII 2
    好久没写题解,水一篇。题意题意显然。分析看到这道题,我们就应该进行一个小贪心,对于最左边某一字符,直到最右边的这一字符,我们不会在中间删除同样的字符,不然则可以保留这一字符,将两边往内缩。也就是说,我们确定了最左边的J后,那么留下最后一个J必然是当前这个J的后面的第\(......
  • 银河麒麟服务器V10 SP3 安装ZooKeeperZookeeper 图形化的客户端工具(ZooInspector)
    服务器zookeeper安装一、软件介绍1、ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。2、ZooKeeper的原理......
  • 2.3Tucker分解HOSVD、HOOI算法推导和python实现
    HOSVD参考论文:AMULTILINEARSINGULARVALUEDECOMPOSITIONHOSVD虽然不能保证给Tucker分解给出最优拟合,但是可以提供一个好的初始化的解这些矩阵都是正交的。之所以求前R最大特征值,可以在下文的HOOI看到,目的是最大化目标函数UWHOSVD的最后一行证明如下:HOOI:黄色之所以可以化过去,......
  • Java应用【XVIII】在 Java 中使用JUnit5进行单元测试和自动化测试
    一、前言单元测试和自动化测试是现代软件开发过程中必不可少的环节,可以提高代码质量和开发效率。JUnit5是Java中流行的单元测试框架,本文将介绍如何在Java中使用JUnit5进行单......
  • BZOJ 1852 [MexicoOI06] 最长不下降序列
    https://darkbzoj.cc/problem/1852首先解决初始排序的问题:先把\(i,j\)对应的两组数\((a_i,b_i),(a_j,b_j)\)分为“必要”,“非必要”两类。“必要”,指\(i\)必须......
  • 安装zookeeper客户端可视化工具ZooInspector。
    下载:下载地址:​​https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip;​​解压:下载完后解压压缩包,打开地址为ZooInspector\build\zookeeper-dev-Z......