题目链接

题目

题目描述

首先给定一个定值k,支持如下操作(在数轴上)

  1. 加入一条线段[l,r]
  2. 删除一条已经存在的线段
  3. 给定x,问有多少个区间包含x+kt,其中t是一个整数变量,即t ∈ Z

比如说当x=2,k=3的时候,区间[7,10]是应该算入答案的,因为x+2k=8,且7 ≤ 8 ≤ 10

如果n=0,那么你只需要输出一行"fafa"然后结束程序即可(注意不输出双引号)

输入描述

第一行两个整数n,k,分别表示操作次数以及定值k

之后有n行,每行先输入一个整数op,之后分类讨论:

  1. op=1,此时再输入[l,r],表示加入一个区间[l,r]
  2. op=2,此时再输入[l,r],表示删除区间[l,r],保证这个区间存在(如果存在多个相同的区间,那么只需要删除其中的任意一个)
  3. op=3,此时再输入x,之后需要输出答案并换行

输出描述

对于每一个op=3的操作,输出查询结果后换行

示例1

输入

10 7
1 3393 14151
3 13229
1 3427 18356
1 7602 20138
1 8566 28714
1 1076 32552
2 3427 18356
2 8566 28714
3 10962
1 387 7783

输出

1
3

说明

(以下内容与本题无关)

这个样例,无疑是善良的出题人无私的馈赠。

大量精心构造的 n ≤ 100 的测试数据,涵盖了测试点中所有出现性质的组合。

你可以利用这个测试点,对自己的程序进行全面的检查。

足量的数据组数、不大的数据范围和多种多样的数据类型,能让程序中的错误无处遁形。

出题人相信,这个美妙的样例,可以给拼搏于 AC 这道题的逐梦之路上的你,提供一个有力的援助。

示例2

输入

0 0

输出

fafa

备注

一共有20个测试点,每个测试点5分

有4个测试点保证:\(n≤1000\)

有另外5个测试点保证:\(n≤10000\)

对于全部数据,保证:

\(0 ≤ n,k ≤ 10^5\) ,\(0 ≤ l ≤ r ≤ 10^9\) , \(0 ≤ x ≤ 10^9\)

题解

知识点:树状数组,离散化,数论。

\(n = 0\) 时,输出 fafa

  1. \(k = 0\) 时,需要区间修改、单点询问,可以用树状数组维护,需要先离散化区间端点。
  2. \(k \neq 0\) 时,需要区间修改、固定间隔的多点询问,注意到间隔是固定的,因此区间覆盖可以在模 \(k\) 意义下计算贡献,但要注意端点顺序可能相反,要分类处理,可以用树状数组维护。

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

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; template<class T>
struct Discretization {
vector<T> uniq;
Discretization() {}
Discretization(const vector<T> &src) { init(src); }
void init(const vector<T> &src) {
uniq = src;
sort(uniq.begin() + 1, uniq.end());
uniq.erase(unique(uniq.begin() + 1, uniq.end()), uniq.end());
}
int get(T x) { return lower_bound(uniq.begin() + 1, uniq.end(), x) - uniq.begin(); }
}; struct Query {
int op;
int x, l, r;
}; struct T {
ll sum;
static T e() { return { 0 }; }
T &operator+=(const T &x) { return sum += x.sum, *this; }
};
template<class T>
class Fenwick {
int n;
vector<T> node; public:
Fenwick(int _n = 0) { init(_n); } void init(int _n) {
n = _n;
node.assign(n + 1, T::e());
} void update(int x, T val) { for (int i = x;i <= n;i += i & -i) node[i] += val; } T query(int x) {
T ans = T::e();
for (int i = x;i >= 1;i -= i & -i) ans += node[i];
return ans;
}
}; int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, k;
cin >> n >> k;
if (n == 0) return cout << "fafa" << '\n', 0;
if (k == 0) {
vector<Query> q(n + 1);
vector<int> src(1);
for (int i = 1;i <= n;i++) {
int op;
cin >> op;
if (op == 1 || op == 2) {
int l, r;
cin >> l >> r;
l++, r++;
q[i] = { op,-1,l,r };
src.push_back(l);
src.push_back(r);
}
else {
int x;
cin >> x;
x++;
q[i] = { op,x,-1,-1 };
src.push_back(x);
}
}
Discretization<int> dc(src);
Fenwick<T> fw(dc.uniq.size());
for (int i = 1;i <= n;i++) {
auto [op, x, l, r] = q[i];
if (op == 1) fw.update(dc.get(l), { 1 }), fw.update(dc.get(r) + 1, { -1 });
else if (op == 2) fw.update(dc.get(l), { -1 }), fw.update(dc.get(r) + 1, { 1 });
else cout << fw.query(dc.get(x)).sum << '\n';
}
}
else {
Fenwick<T> fw(k + 1);
for (int i = 1;i <= n;i++) {
int op;
cin >> op;
if (op == 1) {
int l, r;
cin >> l >> r;
if (r - l + 1 >= k) fw.update(1, { 1 }), fw.update(k + 1, { -1 });
else {
l %= k;
r %= k;
l++, r++;
if (l <= r) fw.update(l, { 1 }), fw.update(r + 1, { -1 });
else fw.update(l, { 1 }), fw.update(k + 1, { -1 }), fw.update(1, { 1 }), fw.update(r + 1, { -1 });
}
}
else if (op == 2) {
int l, r;
cin >> l >> r;
if (r - l + 1 >= k) fw.update(1, { -1 }), fw.update(k + 1, { 1 });
else {
l %= k;
r %= k;
l++, r++;
if (l <= r) fw.update(l, { -1 }), fw.update(r + 1, { 1 });
else fw.update(l, { -1 }), fw.update(k + 1, { 1 }), fw.update(1, { -1 }), fw.update(r + 1, { 1 });
}
}
else {
int x;
cin >> x;
x %= k;
x++;
cout << fw.query(x).sum << '\n';
}
}
}
return 0;
}

NC21125 践踏的更多相关文章

  1. 牛客OI周赛6-提高组 B 践踏

    践踏 思路: 如果k不为0, 那么就是对k取模意义下的区间更新, 单点查询 否则, 就是普通的区间更新, 单点查询 代码: #pragma GCC optimize(2) #pragma GCC op ...

  2. 用 jQuery.ajaxSetup 实现对请求和响应数据的过滤

    不知道同学们在做项目的过程中有没有相同的经历呢?在使用 ajax 的时候,需要对请求参数和响应数据进行过滤处理,比如你们觉得就让请求参数和响应信息就这么赤裸裸的在互联网里来回的穿梭,比如这样: 要知道 ...

  3. .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制

    项目背景是一个社区类的APP(求轻吐...),博主主要负责后台业务及接口.以前没玩过webAPI,但是领导要求必须用这个(具体原因鬼知道),只好硬着头皮上了. 最近刚做完权限这一块,分享出来给大家.欢 ...

  4. php 远程本地化无后缀图片

    $body = '<p style="margin: 0px 0px 1.1em; padding: 0px; color: rgb(51, 51, 51); font-family: ...

  5. iOS之应用发布中的一些细节

    Bundle identifier Xcode中 Target -> General中的bundle identifier ; info.plist中的Bundle identifier; 证书 ...

  6. 前端小知识(转载http://www.cnblogs.com/Wayou/p/things_you_dont_know_about_frontend.html)

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

  7. 不同json如何使用jsonArray以及ajax如何取,实现读取新闻

    jsp界面 <%@ page contentType="text/html;charset=gb2312"%><%@page import="org.j ...

  8. Timberwolves forward Kevin Garnett to retire _洛杉矶时报

    Timerwolves:森林狼队,forward:前锋; kevin Garnett,the best player in Minnesota Timberwolves history,is expe ...

  9. 偶的《javascript框架设计》终于出版

    #cnblogs_post_body p{ text-indent:2em!important; } 历时两年多,我的书终于付梓出版了.应各方面的要求,写软文一篇,隆重介绍一下此书对各位程序员的钱途有 ...

  10. 冷门JS技巧

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

随机推荐

  1. ACP 知识点总结

    记录下学习ACP过程不断遇到的且需要记录的知识点: 在阿里云专有网络VPC创建之后,路由器也是随着VPC一起自动创建,所以不需要手动创建,这个时候需要继续创建交换机才能在交换机种创建其他云产品. 7层 ...

  2. 如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 3

    在本教程的前两部分,我们分别了解和学习了Prometheus 和 Grafana 的基本概念和使用的前提条件,以及使用 Helm 在 Kubernetes 上安装 Prometheus. 在今天的教程 ...

  3. 搞了个Blazor工具站,域名一次性买了10年!

    大家好,我是沙漠尽头的狼. 在 Dotnet9 上线在线小工具和小游戏后,服务器的压力感觉挺大的,打开25个页面,内存占用170MB左右,CPU保持在60~70%,看来Server真不适合搞这类交互较 ...

  4. Verilog Review

    Agenda 目的 Verilog概述 Verilog建模 模块 模块组成 书写建议 时延 Verilog基本语法 标识符 可读性 注释 空格 数据类型 操作数 运算符 条件语句 循环语句 函数 Ve ...

  5. 0xGame 2023【WEEK1】Crypto全解

    What's CBC? 题目信息 from Crypto.Util.number import * from secret import flag,key def bytes_xor(a,b): a, ...

  6. CSS 3D - rotate旋转90度看不到的原理 和 解决方法

    原理: 旋转元素的坐标有三个 :X(向右),   Y(向左) ,   Z(向电脑屏幕的你) 当没有位移旋转元素时,元素 Z 坐标也会同着一起旋转 ,当一个物品旋转到90度时,我们只能看到它的厚度,而d ...

  7. [转帖]备份与恢复工具 BR 简介

    https://docs.pingcap.com/zh/tidb/v4.0/backup-and-restore-tool BR 全称为 Backup & Restore,是 TiDB 分布式 ...

  8. [转帖]Windows磁盘性能压测(1)-DiskSpd

    http://www.manongjc.com/detail/59-xrydhtisrajqsxn.html 本文章向大家介绍Windows磁盘性能压测(1)-DiskSpd,主要内容包括其使用实例. ...

  9. unzip 解压缩存在Bug-- 这个方法不行啊

    linux中解压大于4G的zip压缩包(已解决) tar -zxvf 压缩包名.zip

  10. 一文详解 Netty 组件

    作者:京东物流 张弓言 一.背景 Netty 是一款优秀的高性能网络框架,内部通过 NIO 的方式来处理网络请求,在高负载下也能可靠和高效地处理 I/O 操作 作为较底层的网络通信框架,其被广泛应用在 ...