A. United We Stand

题解

  • 赛时想复杂了
  • 题目要求我们保证数组\(c\)中的数不是数组\(b\)中任意一个数的因子
  • 我们考虑将最小值置于数组\(b\)即可
const int N = 2e5 + 10, M = 4e5 + 10;

int n;
int a[N]; void solve()
{
cin >> n;
int mi = INF;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
mi = min(a[i], mi);
}
vector<int> b, c;
for (int i = 1; i <= n; ++i)
{
if (a[i] == mi)
b.push_back(a[i]);
else
c.push_back(a[i]);
}
if (b.size() == 0 || c.size() == 0)
cout << -1 << endl;
else
{
cout << b.size() << " " << c.size() << endl;
for (auto x : b)
cout << x << " ";
cout << endl;
for (auto x : c)
cout << x << " ";
cout << endl;
}
}

B. Olya and Game with Arrays

题解

  • 我们考虑贪心
  • 对于所有数组中的最小值来说,不管我们怎么移动,他对答案的贡献不变
  • 所以我们考虑将每个数组中的最小值移动到某一个数组中,使得次小值对答案产生贡献
  • 我们如何确定被移动到的是哪一个数组呢
  • 只要对次小值排序即可,对于存在最小的次小值的数组就是被移动到的数组
const int N = 2e5 + 10, M = 4e5 + 10;

int n;
vector<int> vec[N]; void solve()
{
cin >> n;
int mi = INF;
vector<int> b;
for (int i = 1; i <= n; ++i)
{
int k;
cin >> k;
vec[i].clear();
for (int j = 1; j <= k; ++j)
{
int x;
cin >> x;
vec[i].push_back(x);
}
sort(all(vec[i]));
b.push_back(vec[i][1]);
mi = min(mi, vec[i][0]);
}
sort(all(b));
int ans = 0;
ans += mi;
for (int i = 1; i < b.size(); ++i)
ans += b[i];
cout << ans << endl;
}

C. Another Permutation Problem

题解

  • 打表找规律
  • 发现除了\(n=2\)时都是先升序后降序的形式,例如\([1, 2,3,4,8,7,6,5]\)
  • \(O(n^2)\)枚举在哪个位置开始降序即可
const int N = 2e5 + 10, M = 4e5 + 10;

int n;
int a[N], b[N], c[N]; void solve()
{
cin >> n;
if (n == 2)
{
cout << 2 << endl;
return;
}
int ans = 0;
for (int i = 1; i <= n; ++i)
{
int mx = 0, sum = 0;
for (int j = 1; j <= i; ++j)
{
sum += j * j;
mx = max(mx, j * j);
}
int t = n;
for (int j = i + 1; j <= n; ++j)
{
sum += t * j;
mx = max(mx, t * j);
--t;
}
ans = max(ans, sum - mx);
}
cout << ans << endl;
}

D. Andrey and Escape from Capygrad

\(1 \leq n, q\leq 2e5\)

题解

  • 显然越向右移动越好,所以我们肯定选择\(l_i \leq x \leq b_i\)中较大的\(b_i\)传送,因为只有\(b_j > l_i\)时才能传送,所以实际上的区间为\([l_i, b_i]\)
  • 所以问题转化为给定\(n\)个区间\([l_i,b_i]\),对于数轴上一点\(x > 0\),对于左端点\(l_i \leq x\)的区间,我们找到其最大的右端点
  • 所以我们先考虑将区间合并\(O(nlogn)\)
  • 然后离散化区间左端点和询问点
  • 然后线段树在左端点处单点修改加上右端点的值即可,维护区间最大值
const int N = 4e5 + 10, M = 4e5 + 10;

int n, q;
struct node
{
int l, r, a, b;
bool operator<(const node &t) const
{
return l < t.l;
}
} line[N];
int l[N], r[N], tot, qry[N]; struct info
{
int mx;
friend info operator+(const info &a, const info &b)
{
info c;
c.mx = max(a.mx, b.mx);
return c;
}
};
struct SEG
{
info val;
} seg[N << 2]; void up(int id)
{
seg[id].val = seg[lson].val + seg[rson].val;
} void build(int id, int l, int r)
{
if (l == r)
{
seg[id].val.mx = 0;
return;
}
int mid = l + r >> 1;
build(lson, l, mid);
build(rson, mid + 1, r);
up(id);
} void change(int id, int l, int r, int x, int val)
{
if (l == r)
{
seg[id].val.mx = val;
return;
}
int mid = l + r >> 1;
if (x <= mid)
change(lson, l, mid, x, val);
else
change(rson, mid + 1, r, x, val);
up(id);
} info query(int id, int l, int r, int ql, int qr)
{
if (ql <= l && r <= qr)
{
return seg[id].val;
}
int mid = l + r >> 1;
if (qr <= mid)
return query(lson, l, mid, ql, qr);
else if (ql > mid)
return query(rson, mid + 1, r, ql, qr);
else
return query(lson, l, mid, ql, qr) + query(rson, mid + 1, r, ql, qr);
} void solve()
{
cin >> n;
for (int i = 1; i <= n; ++i)
{
int l, r, a, b;
cin >> l >> r >> a >> b;
line[i] = {l, r, a, b};
}
// 区间合并
sort(line + 1, line + n + 1);
tot = 0;
int st = line[1].l, ed = line[1].b;
line[n + 1] = {INF, INF, INF, INF};
for (int i = 2; i <= n + 1; ++i)
{
auto [L, R, a, b] = line[i];
if (L > ed)
{
tot++;
l[tot] = st, r[tot] = ed;
st = L, ed = b;
}
else
ed = max(ed, b);
}
vector<int> vec;
auto find = [&](int x)
{
return lower_bound(all(vec), x) - vec.begin() + 1;
};
for (int i = 1; i <= tot; ++i)
vec.push_back(l[i]);
cin >> q;
for (int i = 1; i <= q; ++i)
{
cin >> qry[i];
vec.push_back(qry[i]);
}
sort(all(vec));
vec.erase(unique(all(vec)), vec.end());
int m = vec.size() + 10;
build(1, 1, m);
for (int i = 1; i <= tot; ++i)
change(1, 1, m, find(l[i]), r[i]);
for (int i = 1; i <= q; ++i)
{
int x = find(qry[i]);
int mx = query(1, 1, m, 1, x).mx;
cout << max(mx, qry[i]) << " ";
}
cout << endl;
}

Codeforces Round 892 (Div.2)的更多相关文章

  1. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  2. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  3. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  6. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  7. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  8. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

  9. Codeforces Round #268 (Div. 2) ABCD

    CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...

  10. 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts

    题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...

随机推荐

  1. 《放弃繁琐的if-else》开启Assert断言的新时代

    一.场景再现 我们平时在service操作数据库,难免会出现这种情况: if(null == result){ }else{ } 这样的代码会吞噬掉你有限的代码空间,虽然通俗易懂,但一旦爆炸式的袭来, ...

  2. JSP+Java编程资源

    <JSP+Servlet+Tomcat应用开发从零开始学(第2版)>源码课件视频下载地址: https://pan.baidu.com/s/1HkFRul3wYBxe-skXCoQPwg ...

  3. 解决 Vue 项目打包上线后客户端缓存的问题

    由于重新打包后会导致对应的 js 和 css 文件 hash 值发生变化,客户端不刷新的话就会存在之前的文件找不到,导致报错的问题. 通过 build.sh 定义打包命令 #!/usr/bin/env ...

  4. 使用GrabCut做分割

    主要完成了界面化设计,代码如下 import cv2 as cv import numpy as np import sys from PyQt5.Qt import * class MyWedige ...

  5. 2021年11月墨天轮国产数据库排行榜:openGauss闯入前三,Kingbase流行度与日俱增,TDengine厚积薄发

    2021年11月的国产数据库流行度排行榜已在墨天轮发布,本月共有163家数据库参与排名.就前15名的总体情况来看,除openGauss反超OceanBase闯入前三,TDengine厚积薄发来到第15 ...

  6. uniapp电子签名盖章实现详解

    项目开发中用到了电子签名.签好名的图片需要手动实现横竖屏旋转.并将绘制的签名图片放到pdf转换后的base64的图片上,可以手动拖动签名到合适的位置,最后合成签名和合同图片并导出.和以往一样,先发一下 ...

  7. C#查漏补缺----Exception处理实现,无脑抛异常不可取

    前言 环境:.NET 8.0 系统:Windows11 参考资料:CLR via C#, .Net Core底层入门 https://andreabergia.com/blog/2023/05/err ...

  8. Linux查看显卡 GPU信息

    1.Linux查看显卡信息: 1.1查询显卡信息 lspci | grep -i vga 前边的序号 "04:00.0″是显卡的代号 ASPEED Technology, Inc. ASPE ...

  9. 一文读懂 KubeSphere 企业版 4.0:多品类生态价值赋能的里程碑

    近日,青云科技 KubeSphere 团队革新先行,重磅发布了沉淀数年.倾力打造的全新分布式云原生可扩展开放架构--KubeSphere LuBan,以及在此之上构建的化整为零.全能开放.随时随地自由 ...

  10. 云原生周刊:K8s 在 v1.27 中移除的特性和主要变更

    文章推荐 K8s 在 v1.27 中移除的特性和主要变更 随着 Kubernetes 发展和成熟,为了此项目的整体健康,某些特性可能会被弃用.移除或替换为优化过的特性.基于目前在 v1.27 发布流程 ...