D. In Love

原题链接:https://codeforces.com/contest/1883/problem/D

题目大意:

维护一个区间的集合,然后每次加减区间后,判断集合中是否存在两个区间不相交。

思路:

方法1: 由于区间散布很大,所以常规的离线做法+离散化区间,这种区间问题容易想到差分,每次加区间就在对应位置上加 \(1\),然后每次查询数值最大的位置是否为当前集合内区间的个数,如果是那么在该点所有区间相交,否则存在一对区间不相交,差分虽然为 \(O(1)\),但查询为 \(O(n)\),但多次查询明显不行,所以利用线段树去实现,具体为查询区间 \(max\),且可区间修改的线段树,然后每次判断全部范围内的最大值,再结合上面说过的判断条件就做出来了。

还有因为 \(q\) 为 \(1e5\),所以端点至多为 \(2e5\),要注意 \(N\) 的取值!

方法2(官解):维护一下左端点(l)最大的线段和右端点(r)最小的线段,若他俩没交点显然存在,否则所有线段在 \(r\) ~ \(l\) 间相交。 这里只用两个 \(mutilset\) 即可。

时间复杂度 \(O(nlg(n))\)

代码(线段树):

#include <bits/stdc++.h>
using namespace std; #define TII tuple<int, int, int>
#define all(x) x.begin(), x.end() typedef long long ll;
typedef pair<int, int> PII; const int N = 2e5 + 10, M = 2e5 + 10, K = 20, mod = 998244353;
const int INF = 0x3f3f3f3f;
const ll INF_L = 1e15; int n, m; struct Node{
int l, r;
int mx;
int lazy;
}tr[4 * N]; void push_up(Node &U, Node L, Node R){
U.mx = max(L.mx, R.mx);
} void push_up(int u){
push_up(tr[u], tr[u << 1], tr[u << 1 | 1]);
} void build(int u, int l, int r){
if(l == r) tr[u] = {l, r, 0, 0};
else{
tr[u] = {l, r, 0, 0};
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
}
} void push_down(int u){
auto &U = tr[u];
if(U.lazy == 0) return;
auto &L = tr[u << 1], &R = tr[u << 1 | 1];
L.mx += U.lazy, L.lazy += U.lazy;
R.mx += U.lazy, R.lazy += U.lazy;
U.lazy = 0;
} void modify(int u, int l, int r, int c){
if(tr[u].l >= l && tr[u].r <= r){
tr[u].mx += c;
tr[u].lazy += c;
}else{
push_down(u);
int mid = tr[u].l + tr[u].r >> 1;
if(l <= mid) modify(u << 1, l, r, c);
if(r > mid) modify(u << 1 | 1, l, r, c);
push_up(u);
}
} void solve()
{
cin >> m;
vector<PII> rng(m);
vector<int> num, op(m);
string s;
for(int i = 0; i < m; i ++){
cin >> s;
op[i] = (s[0] == '+');
auto &[l, r] = rng[i];
cin >> l >> r;
num.push_back(l), num.push_back(r);
}
sort(all(num));
num.erase(unique(all(num)), num.end());
for(int i = 0; i < m; i ++){
auto &[l, r] = rng[i];
l = lower_bound(all(num), l) - num.begin() + 1;
r = lower_bound(all(num), r) - num.begin() + 1;
}
n = num.size() + 5;
build(1, 1, n);
int c = 0;
for(int i = 0; i < m; i ++){
auto [l, r] = rng[i];
if(op[i]) modify(1, l, r, 1), c ++;
else modify(1, l, r, -1), c --;
if(c > tr[1].mx) cout << "YES\n";
else cout << "NO\n";
}
} int main()
{
cin.tie(0)->sync_with_stdio(false);
cout.tie(0); int t = 1;
// cin >> t; while (t--) solve(); return 0;
}

E. Look Back

原题链接:https://codeforces.com/contest/1883/problem/E

题目大意:

给定 \(n\) 个数的序列,每次可以任选一个位置的数乘 \(2\),求使得序列不递减的最小操作次。

思路:

一开始直接暴力,喜提 \(wa\),后面没意识到最后一个数可以被构造乘好多 \(2\),进而爆 \(long long\),喜提 \(10\) 几发 \(wa\),(一个可爆 $long long $的构造: \(1e9,1e9 - 1,1e9 - 2 ... 1e9 - 1e5 + 1\))。

用\(b[i]\)去表示第\(i\)个位置要乘以\(2\)的个数,这里要分两种情况如果:当\(a[i] >= a[i + 1]\) 的那么我们先令 \(b[i + 1] == b[i]\),除此之外,还要给\(b[i + 1]\) 加上一个 \(t\),使\(a[i + 1] * 2 ^ t ≥ a[i]\),令 \(p = (a[i] + a[i + 1] - 1) / a[i + 1]\),令 \(p\) 的最高位二进制\(1\)所在位数为\(lg(p)\),且显然我们可以给\(a[i + 1]\)乘的数的二进制位只能有一位 \(1\),所以当 \(p\) 只有一位\(1\)时,\(t = lg(p)\),否则\(t = lg(p) + 1\);当\(a[i] < a[i + 1]\)时,令\(p = a[i + 1] / a[i]\),当\(b[i] <= lg(p)\) 时,显然令 \(b[i + 1]=0\)即可,因为\(p >= 2^{b[i]}\),否则我们只需要使得\(p\)的最高位\(1\)移到\(b[i]\)即可。

时间复杂度:O(nlg(n))

代码:

#include <bits/stdc++.h>
using namespace std; #define TII tuple<int, int, int>
#define all(x) x.begin(), x.end() typedef long long ll;
typedef pair<int, int> PII; const int N = 2e5 + 10, M = 2e5 + 10, K = 20, mod = 998244353;
const int INF = 0x3f3f3f3f;
const ll INF_L = 1e15; int n, m; void solve()
{
cin >> n;
vector<ll> a(n + 1);
for(int i = 1; i <= n; i ++) cin >> a[i];
vector<int> b(n + 1, 0);
for(int i = 1; i < n; i ++){
if(a[i] >= a[i + 1]){
b[i + 1] = b[i];
ll p = (a[i] + a[i + 1] - 1) / a[i + 1];
ll s = p, c = 0;
while(s){
s -= s & -s;
c ++;
}
int t = __lg(p);
if(c > 1) t ++;
b[i + 1] += t;
}else{
ll p = a[i + 1] / a[i];
int t = __lg(p);
b[i + 1] = max(0, b[i] - t);
}
}
cout << accumulate(b.begin(), b.end(), 0ll) << endl;
// for(int i = 1; i <= n; i ++) cout << b[i] << ' ';
// cout << endl;
} int main()
{
cin.tie(0)->sync_with_stdio(false);
cout.tie(0); int t = 1;
cin >> t; while (t--) solve(); return 0;
}

G2. Dances (Hard Version)

题目大意:

给定一个长度为\(n-1\)的序列\(a\),长度为\(n\)的序列\(b\),构造序列\(c\),\(c[1]\)的取值可为\(1\) ~ \(m\),\(c[2\) ~ \(n] = a\),\(c和b\)均可重排,每次操作可以从\(c和b\)中各取一个值丢弃,最后各剩余\(k\)个数,且满足\(c[i]<b[i]\) \(i∈[1,k]\),求\(c[1]\)所有情况下,对应\(k\)值最大的情况下操作数的总和。

思路:

其实就是一个匹配问题,直接排序后从小到大匹配即可(每个去匹配小于它最大的),只不过我们一开始不能确定\(c[1]\),所以先匹配\(c[1]\)之外的部分,看最后\(b[]\)中能剩下的的最大值为多少,然后分情况讨论即可。

时间复杂度:O(nlg(n))

代码:

#include <bits/stdc++.h>
using namespace std; #define TII tuple<int, int, int>
#define all(x) x.begin(), x.end() typedef long long ll;
typedef pair<int, int> PII; const int N = 2e5 + 10, M = 2e5 + 10, K = 20, mod = 998244353;
const int INF = 0x3f3f3f3f;
const ll INF_L = 1e15; int n, m; void solve()
{
cin >> n >> m;
multiset<int> st;
for(int i = 1; i < n; i ++){
int x;
cin >> x;
st.insert(x);
}
vector<int> b(n);
for(int i = 0; i < n; i ++) cin >> b[i];
sort(b.begin(), b.end());
ll res = 0, mx = 0;
for(int i = 0; i < n; i ++){
if(st.lower_bound(b[i]) != st.begin()){
st.erase(-- st.lower_bound(b[i]));
}else{
res ++;
mx = b[i];
}
}
ll ans = res * m;
if(m < mx) ans -= m;
else ans -= (mx - 1);
cout << ans << endl;
} int main()
{
cin.tie(0)->sync_with_stdio(false);
cout.tie(0); int t = 1;
cin >> t; while (t--) solve(); return 0;
}

CF_div3_905(D/E/G2)的更多相关文章

  1. HP 820 G2变色龙安装10.11.6基本完美

    初始状态: 一块ssd硬盘,MBR格式分区,安装了WIN7 64位. 不想动win系统,因此就安装在硬盘的扩展分区 电脑配置: cpu: i7-5600u 声卡: ALC280 显卡: HD55 ...

  2. 微小,但是美好的改变 G2 2.2发布

    G2 2.2.0, 『微小,但是美好的改变.』 # 一.丰富可视化交互形式 #### 选择: [图形的单选.多选](https://g2.alipay.com/tutorial/geom-select ...

  3. 人之初,性本动 - G2 2.1 发布

    前言 随着可视化进入深水区,G2面临了越来越多交互上的需求.动画是提升交互必不可少的一部分,也是之前G2的薄弱环节.这个版本里我们开发并替换了动画底层,统一了时间轴,使G2的动画性能大大提升,并提供了 ...

  4. G2 2.0 更灵活、更强大、更完备的可视化引擎!

    概述 G2作为一款技术产品,自诞生以来,服务于广大的Web工程师群体和一部分数据分析师.一直来,G2 因其易用的语法和扎实的可视化理论基础,广受使用者好评.G2 1.x 的可视化能力已经非常强大,使用 ...

  5. EChart和G2比较

    1.上市时间:EChart已经久经沙场,G2算是新事物 2.源码:截止发文,在Github上 数量 EChart G2 commits 3086 8 branches 3 1 releases 43 ...

  6. G2 DT时代的图形语法 正式发布

    G2有一个高大上的名字叫做:The Grammar Of Graphics——图形语法.它是一个强大的语义化图表生成工具,它提供了一整套图形语法,可以让用户通过简单的语法搭建出无数种图表,并且集成了大 ...

  7. 蚂蚁金服新一代数据可视化引擎 G2

    新公司已经呆了一个多月,目前着手一个数据可视化的项目,数据可视化肯定要用到图形库如D3.Highcharts.ECharts.Chart等,经决定我的这个项目用阿里旗下蚂蚁金服所开发的G2图表库. 官 ...

  8. caffe+GPU︱AWS.G2+Ubuntu14.04+GPU+CUDA8.0+cudnn8.0

    国服亚马逊的GPU实例G2.2xlarge的python+caffe的安装过程,被虐- 一周才装出来- BVLC/caffe的在AWS安装的官方教程github: https://github.com ...

  9. G2( bizCharts ) React 绘制混合图例

    G2( bizCharts ) React 绘制混合图例, // data-set 可以按需引入,除此之外不要引入别的包 import React from 'react'; import { Cha ...

  10. G2 绘制混合图例 demo

    G2 绘制混合图例 demo import G2 from '@antv/g2'; import DataSet from '@antv/data-set'; // G2 对数据源格式的要求,仅仅是 ...

随机推荐

  1. zabbix - [03] 安装部署

    参考:https://www.yuque.com/fenghuo-tbnd9/ffmkvs zabbix6要求操作系统为Centos8,所以一开始安装部署的时候发现少了zabbix-server-my ...

  2. SuperSocket 服务端 和 SuperSocket.ClientEngine 客户端及普通客户端

    internal class Program { //static void Main(string[] args) //{ // byte[] arr = new byte[1024]; // 1. ...

  3. wordpress无法显示gitee图床的图片

    wordpress无法显示gitee图床的图片 Question:如题 Solution:是防盗链的问题,gitee官网给出了防盗链的方法,而github貌似没有. Reference:你已经是个成熟 ...

  4. IvorySQL 升级指南:从 3.x 到 4.0 的平滑过渡

    日前,IvorySQL 4.0 重磅发布,全面支持 PostgreSQL 17,并且增强了对 Oracle 的兼容性.关于 IvorySQL 4.0 的介绍,各位小伙伴可以通过这篇文章回顾:Ivory ...

  5. Qt Creator下使用Qt Console Application打印中文

    Qt对中文的支持一直不好,本人研究了其在控制台下显示中文的方法,直接上步骤: 1.首先创建Qt Console Application工程(本人用的是Qt5.10版本),然后点击 菜单栏->编辑 ...

  6. K8S基本概念和组件

    特点 便携性 无论公有云.私有云.混合云还是多云架构都全面支持 可扩展 模块化.可插拔.可挂载.可组合,支持各种形式的扩展 自修复 自保持应用状态.自重启.自复制.自缩放,声明式语法 组件 etcd ...

  7. Netty源码—6.ByteBuf原理一

    大纲 1.关于ByteBuf的问题整理 2.ByteBuf结构以及重要API 3.ByteBuf的分类 4.ByteBuf分类的补充说明 5.ByteBuf的主要内容分三大方面 6.内存分配器Byte ...

  8. 一文速通Python并行计算:04 Python多线程编程-多线程同步(上)—基于条件变量、事件和屏障

    一文速通 Python 并行计算:04 Python 多线程编程-多线程同步(下)-基于条件变量.事件和屏障 摘要: 本文介绍了 Python 多线程同步的三种机制:条件变量(Condition).事 ...

  9. 主存的扩展及其与CPU的连接——字扩展

    一块芯片的容量为\(2^{18}B\),而该CPU需要的容量为:\(2^{地址总线位宽}\)=\(2^{21}B\),所以需要8片该芯片来扩展. 由于CPU由21个地址引脚,芯片只有18个地址引脚,C ...

  10. luaL_ref如何使用

    // main.lua中有个全局函数function gf() print("hello world")end// c++中处理void callgf(){ lua_getglob ...