[hdu5372 Segment Game]树状数组

题意:有两种操作:(1)插入线段,第i次插入的线段左边界为Li,长度为i (2)删除线段,删除第x次插入的线段。每次插入线段之前询问有多少条线段被它覆盖。

思路:由于插入的线段长度是递增的,所以第i次插入的线段的长度比以前插入的所有线段都要长,从以前插入的线段里面任取一条,考虑其与当前线段的位置关系,主要有以下三种:

图中,下方表示当前线段。注意到,只有被当前线段覆盖的线段,它的左右边界和当前线段的左右边界的相对位置是不同的。也就是说,查询有多少个线段的右端点小于等于该线段右端点,再查询有多少条线段左端点小于该线段的左端点, 两者之差就是答案。因为不符合要求的线段同时进入了前者和后者,而符合要求的答案只进入了前者。

 

  123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
//#pragma comment(linker, "/STACK:1024000000")
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;#define X                   first
#define Y                   second
#define pb                  push_back
#define mp                  make_pair
#define all(a)              (a).begin(), (a).end()
#define fillchar(a, x)      memset(a, x, sizeof(a))
#define copy(a, b)          memcpy(a, b, sizeof(a))typedef long long ll;
typedef pair<int, int> pii;
typedef unsigned long long ull;//#ifndef ONLINE_JUDGE
void RI(vector<int>&a,int n){a.resize(n);for(int i=0;i<n;i++)scanf("%d",&a[i]);}
void RI(){}void RI(int&X){scanf("%d",&X);}template<typename...R>
void RI(int&f,R&...r){RI(f);RI(r...);}void RI(int*p,int*q){int d=p<q?1:-1;
while(p!=q){scanf("%d",p);p+=d;}}void print(){cout<<endl;}template<typename T>
void print(const T t){cout<<t<<endl;}template<typename F,typename...R>
void print(const F f,const R...r){cout<<f<<", ";print(r...);}template<typename T>
void print(T*p, T*q){int d=p<q?1:-1;while(p!=q){cout<<*p<<", ";p+=d;}cout<<endl;}
//#endif
template<typename T>bool umax(T&a, const T&b){return b<=a?false:(a=b,true);}
template<typename T>bool umin(T&a, const T&b){return b>=a?false:(a=b,true);}
template<typename T>
void V2A(T a[],const vector<T>&b){for(int i=0;i<b.size();i++)a[i]=b[i];}
template<typename T>
void A2V(vector<T>&a,const T b[]){for(int i=0;i<a.size();i++)a[i]=b[i];}#if 0
const double PI = acos(-1.0);
const int INF = 1e9 + 7;
const double EPS = 1e-8;
#endif/* -------------------------------------------------------------------------------- */const int maxn = 4e5 + 7;int u[maxn], v[maxn], w[maxn], tot;
pii rem[maxn];class TA {int C[maxn], n;inline int lowbit(int x) { return x & -x; }
public:void init(int n) {this->n = n;for (int i = 1; i <= n; i ++) C[i] = 0;}void update(int p, int x) {while (p <= n) {C[p] += x;p += lowbit(p);}}int query(int p) {int ans = 0;while (p) {ans += C[p];p -= lowbit(p);}return ans;}
};
TA lta, rta;inline int find(int x) {return lower_bound(w, w + tot, x) - w + 1;
}int main() {
#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);
#endif // ONLINE_JUDGEint cas = 0, n;while (cin >> n) {tot = 0;int len = 1;for (int i = 0; i < n; i ++) {scanf("%d%d", u + i, v + i);if (u[i] == 0) {rem[len] = mp(v[i], v[i] + len);w[tot ++] = v[i];w[tot ++] = v[i] + len ++;}}sort(w, w + tot);tot = unique(w, w + tot) - w;lta.init(tot);rta.init(tot);printf("Case #%d:\n", ++ cas);len = 1;for (int i = 0; i < n; i ++) {if(u[i] == 1) {pii buf = rem[v[i]];int lid = find(buf.X), rid = find(buf.Y);lta.update(lid, - 1);rta.update(rid, - 1);}else {int lid = find(v[i]), rid = find(v[i] + len ++);printf("%d\n", rta.query(rid) - lta.query(lid - 1));lta.update(lid, 1);rta.update(rid, 1);}}}return 0;
}

转载于:https://www.cnblogs.com/jklongint/p/4723997.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样从php转向java_Github标星10.8K!Java 实战博客项目分享

点击上方 Java后端&#xff0c;选择 设为星标优质文章&#xff0c;及时送达来源&#xff1a;开源最前线(ID&#xff1a;OpenSourceTop)作为程序员每天就是不停的敲代码&#xff0c;改Bug&#xff0c;写起代码来那真是行云如流水&#xff0c;但要你码出点文字&#xff0c;写点技…

Docker 部署一个用 Python 编写的 Web 应用

文章目录1. 安装 docker2. 编写代码3. 编写 Dockerfile4. 上传镜像5. 修改镜像learn from 《深入剖析Kubernetes》1. 安装 docker 在 WSL2 中安装 docker https://www.runoob.com/docker/ubuntu-docker-install.html 会报错&#xff1a; # Executing docker install script, …

python 代码文件路径注意事项

检查代码的工作路径&#xff0c;是不是代码文件所在路径 导入别处的包 基于该代码的工作路径写如下的代码&#xff0c;加入相对路径&#xff0c;可以找到要导入的文件 import sys import os sys.path.append("../xxx/") sys.path.append("../../xxx") fro…

微信小程序独立服务器的好处,微信小程序的优势和缺点

原标题&#xff1a;微信小程序的优势和缺点微信小程序从刚开始面世就引起了很多人的关注&#xff0c;虽然截止到目前&#xff0c;官方仍没有大肆宣传和推广&#xff0c;但是微信小程序的所带来的影响还是很大的&#xff0c;甚至让苹果&#xff0c;百度&#xff0c;阿里都头疼不…

LeetCode 2007. 从双倍数组中还原原数组(map)

文章目录1. 题目2. 解题1. 题目 一个整数数组 original 可以转变成一个 双倍 数组 changed &#xff0c;转变方式为将 original 中每个元素 值乘以 2 加入数组中&#xff0c;然后将所有元素 随机打乱 。 给你一个数组 changed &#xff0c;如果 change 是 双倍 数组&#xff…

怎么画韦布尔分布_手机按键寿命测试的样本数量怎么定?一文看懂 简述威布尔分布及其应用...

有一种手机按键的质量要求是&#xff0c;95%的产品的按压寿命需要达到1万次。根据这一要求&#xff0c;QC部门需要进行1.2万次的按压测试。那么QC部门需要选取多少按键来进行测试&#xff08;不允许有失效&#xff09;&#xff0c;才能保证95%的按键按压寿命达到1万次呢&#x…

Chrome浏览器报错:Origin null is not allowed by Access-Control-Allow-Origin.

问题&#xff1a;Chrome浏览器报错&#xff1a;Origin null is not allowed by Access-Control-Allow-Origin. 原因&#xff1a;.js文件中使用load()方法&#xff0c;而Chrome浏览器出于安全起见&#xff0c;不允许load本地文件。 方法&#xff1a;给Chrome添加启动参数--allow…

LeetCode 2008. 出租车的最大盈利(DP)

文章目录1. 题目2. 解题1. 题目 你驾驶出租车行驶在一条有 n 个地点的路上。 这 n 个地点从近到远编号为 1 到 n &#xff0c;你想要从 1 开到 n &#xff0c;通过接乘客订单盈利。 你只能沿着编号递增的方向前进&#xff0c;不能改变方向。 乘客信息用一个下标从 0 开始的二…

华为服务器清除系统日志,清空服务器日志

清空服务器日志 内容精选换一换为加强对系统数据的容灾管理&#xff0c;云堡垒机支持配置日志备份&#xff0c;提高审计数据安全性和系统可扩展性。本小节主要介绍如何在系统配置FTP/SFTP服务器参数&#xff0c;将日志远程备份至FTP/SFTP服务器。开启远程备份后&#xff0c;系统…

动态行转列小记

数据库环境&#xff1a;SQL SERVER 2005 最近在整理数据时&#xff0c;要将查询到的数据张贴到Excel中。在Excel中&#xff0c;要展示的行数是固定的&#xff0c;列数不固定&#xff0c; 一个一个数据的复制张贴太烦人。想了一个偷懒的方法&#xff0c;直接将查询的数据进行行转…

使用swiper_关于使用swiper制作web轮播图

我这个方法是很适用于小白的&#xff0c;利用swiper插件的应用。https://www.swiper.com.cn/这个是swiper中文官网的网址&#xff0c;上面有关于swiper的说明和使用方法。想要用到swiper插件要在官网下载swiper文件&#xff0c;如下图所示&#xff0c;在导航条上面找到下载swip…

LeetCode 2012. 数组美丽值求和

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums 。对于每个下标 i&#xff08;1 < i < nums.length - 2&#xff09;&#xff0c;nums[i] 的 美丽值 等于&#xff1a; 2&#xff0c;对于所有 0 < j < i 且 i < k < nums.length - 1 …

华为服务器上传文件后怎么通过链接查看,远程服务器文件上传后的操作

远程服务器文件上传后的操作 内容精选换一换本节指导您基于Linux操作系统环境完成镜像文件快速导入&#xff0c;推荐使用云平台的EulerOS云服务器作为转换镜像格式和生成位表文件的环境。Linux操作系统环境下&#xff0c;建议使用qemu-img-hw工具进行镜像格式转换。已完成镜像文…

Android学习笔记(十三)

Android中的广播机制 Android提供了一套完整的API&#xff0c;允许应用程序自由地发送和接受广播。 发送广播的方法借助于Intent&#xff0c;接受广播的方法需要广播接收器&#xff08;BroadcastsReceiver&#xff09;。 Android中的广播主要分为两种类型&#xff0c;标准广播和…

LeetCode 2013. 检测正方形(字典)

文章目录1. 题目2. 解题2.1 超时2.1 改进1. 题目 给你一个在 X-Y 平面上的点构成的数据流。设计一个满足下述要求的算法&#xff1a; 添加 一个在数据流中的新点到某个数据结构中。可以添加 重复 的点&#xff0c;并会视作不同的点进行处理。给你一个查询点&#xff0c;请你从…

python 获取英文人名翻译

# 获取中英文人名翻译 import time import urllib.requestdef getename(ename_dataename2cname.txt):flag "jerry.asp?id" # 特定标记位置url https://name.supfree.net/tom.asp?idalphas [chr(x) for x in range(ord(a), ord(z) 1)]with open(ename_data, w,…

浅析Java内存模型

概述 Java内存模型的主要目标是定义程序中各个变量的访问规则&#xff0c;即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量是线程共享的&#xff0c;存在竞争问题的。 Java内存模型规定了所有的变量都存储在主内存&#xff0c;每条线程还有自己的工…

fastapi quickstart学习

文章目录1. 安装包2. 编写代码3. 终端运行4. 文档5. 增加数据learn from https://fastapi.tiangolo.com/zh/#typer-fastapi 1. 安装包 # pip install fastapi # pip install uvicorn[standard]2. 编写代码 main.py from typing import Optional # typing 模块用于类型检查…

单列变双列css_css 两列布局中单列定宽单列自适应布局的6种思路

前面的话说起自适应布局方式&#xff0c;单列定宽单列自适应布局是最基本的布局形式。本文将从float、inline-block、table、absolute、flex和grid这六种思路来详细说明如何巧妙地实现布局float【思路一】float说起两列布局&#xff0c;最常见的就是使用float来实现。float浮动…

fastapi 用户指南(路径参数、查询参数、请求体)

文章目录1. 第一步1.1 小结2. 路径参数2.1 顺序很重要2.2 预设值2.3 包含路径的路径参数3. 查询参数3.1 查询参数类型转换4. 请求体learn from https://fastapi.tiangolo.com/zh/tutorial/1. 第一步 pip install fastapi[all] from fastapi import FastAPI my_app FastAPI(…