Description

 

Input

第一行由一个空格隔开的两个正整数 m, c,意义见题目描述。
接下来 m 行,每行可能有以下形式:
construct l r v 代表发生了第一种事件;
destruct l r 代表发生了第二种事件;
query x 代表发生了第三种事件。 

Output

对于每个 query 操作,请输出一行一个整数代表此时坐标 x 处的信号强度。
 

Sample Input

11 10000
query 5
construct 5 500 100
query 500
query 1000
construct 10 90 5 
query 44
destruct 44 66
query 55
construct 50 60 3
query 46
query 6000

Sample Output

0
975
0
9999
9775
9984
 

Data Constraint

分析

用set维护三元组(l,r,v),然后对于新加入的区间和原区间重叠时,劈开与新区间相交或重合的部分即可

然后删除类似,查询有在区间内和区间外两种情况

这是第一次用set写题呢

#include <iostream>
#include <cstdio>
#include <set>
#include <cstring>
using namespace std;
struct Ivs {
int l,r,v;
bool operator < (const Ivs a) const {
return l<a.l||l==a.l&&r<a.r||l==a.l&&r==a.r&&v<a.v;
}
};
set<Ivs> s;
long long c;
int m;
char order[30]; void Insert(int l,int r,int v) {
s.insert((Ivs){l,r-(r-l)%v,v});
set<Ivs>::iterator iter=s.lower_bound((Ivs){l,r-(r-l)%v,v}),p=iter;
p--;
if (iter!=s.begin()) {
Ivs pstar=*p;
if (pstar.r>=l) {
s.erase(p);
if (l-1>=pstar.l)
s.insert((Ivs){pstar.l,l-1-(l-1-pstar.l)%pstar.v,pstar.v});
if (r+1<=pstar.r)
s.insert((Ivs){r+1+((r+1-pstar.l)%pstar.v?pstar.v-(r+1-pstar.l)%pstar.v:0),pstar.r,pstar.v});
}
}
} void Destroy(int l,int r) {
s.insert((Ivs){l,r,-1});
set<Ivs>::iterator iter=s.lower_bound((Ivs){l,r,-1}),p=iter,n=iter,rq;
p--;n++;
if (iter!=s.begin()) {
Ivs pstar=*p;
if (pstar.r>=l) {
s.erase(p);
if (l-1>=pstar.l)
s.insert((Ivs){pstar.l,l-1-(l-1-pstar.l)%pstar.v,pstar.v});
if (r+1<=pstar.r)
s.insert((Ivs){r+1+((r+1-pstar.l)%pstar.v?pstar.v-(r+1-pstar.l)%pstar.v:0),pstar.r,pstar.v});
}
}
while (n!=s.end()) {
Ivs nstar=*n;rq=n;n++;
if (nstar.l<=r) {
s.erase(rq);
if (r+1<=nstar.r)
s.insert((Ivs){r+1+((r+1-nstar.l)%nstar.v?nstar.v-(r+1-nstar.l)%nstar.v:0),nstar.r,nstar.v});
}
else break;
}
s.erase((Ivs){l,r,-1});
} long long Query(int x) {
long long mx=1e9+1;
s.insert((Ivs){x,x,-1});
set<Ivs>::iterator iter=s.lower_bound((Ivs){x,x,-1}),p=iter,n=iter;
p--;n++;
if (iter!=s.begin()) {
Ivs pstar=*p;
mx=min(mx,
(long long)(x<=pstar.r?min((x-pstar.l)%pstar.v,pstar.v-(x-pstar.l)%pstar.v)
:x-pstar.r));
}
if (n!=s.end()) mx=min(mx,(long long)(*n).l-x);
s.erase((Ivs){x,x,-1});
return max(0ll,c-mx*mx);
} int main() {
freopen("cellphone.in","r",stdin);
freopen("cellphone.out","w",stdout);
scanf("%d%lld",&m,&c);
while (m--) {
int l,r,x;
scanf("%s%d",&order,&l);
if (order[0]=='q') printf("%lld\n",Query(l));
if (order[0]=='c') {
scanf("%d%d",&r,&x);
Insert(l,r,x);
}
if (order[0]=='d') {
scanf("%d",&r);
Destroy(l,r);
}
}
fclose(stdin);fclose(stdout);
}

[set]JZOJ 5821 手机信号的更多相关文章

  1. "手机信号放大器" 让手机信号增强的办法

    我的住处信号及其的差,电话基本打不进来,放大器的话便宜的也得一百多,于是自己尝试各种办法让自己的手机有信号,于是奇迹般的成功了: 将手机放于铁缸内,并45度角斜放,刚好淹没手机为佳.于是信号奇迹般的3 ...

  2. test20180921 手机信号

    题意 分析 我们用形如(l, r, v) 的三元组描述一个区间,这个区间中从l 到r 每隔v 有一个信号站. 考虑一次construct 操作,会添加一个新的区间,并可能将一个已经存在的区间分裂为两个 ...

  3. JZOJ5821手机信号

    用set维护,(l,r,v),注意边界,保证了两个端点l,r一定有信号站 增加有三种可能,1.直接加(没有影响),2.将原本的一个区间变成两个 3.将原本的一个区间变成三个 删除有三种情况,1.全包含 ...

  4. Android Telephony —— 手机信号实时变化源码分析过程记录

    源码版本:4.4 跳过InCallActivity等UI实现.先看service以及底层. 1, 在frameworks/opt下面会发现如下文件列表: ./telephony/src/java/co ...

  5. 手机信号G、E、O、3G代表什么意思?

    G指GPRS,是2.5G网络,属于GSM网络,也就是说这项技术位于第二代(2G)和第三代(3G)移动通讯技术之间,GPRS的传输速率可提升至56甚至114Kbps,已经将2017年确定为关闭GSM网络 ...

  6. android 获取手机GSM/CDMA信号信息,并获得基站信息

    本文转自:http://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma/ 在Android中我们常用的轻松获取WIFI信号列表,那如 ...

  7. 手机定位室内gps没信号

    手机定位一般分3种,gps,手机信号基站,上网地点,其中gps信号一般只有户外有,所以在室外的时候只开启定位和gps就可以定位了,但是在室内没有gps的情况,就需要开网络定位了.

  8. 手机信号强度单位dB、dBm和asu

    dB.dBm都是功率增益的单位,不同之处如下: dB是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时,按下面的计算公式:10log( ...

  9. 酷派大神F2系列使用QPST进行nv备份和恢复,解决无信号问题(附备份文件)

    测试机器: 大神F2联通版 8675_W00 系统COOLUI55     写贴原因: 自己无意间刷错了包,结果手机无信号,进入工程模式怎么设置都没有用.尝试过系统还原(备份过).刷新的ROM.线刷, ...

随机推荐

  1. how to config custom process.env in node.js

    how to config custom process.env in node.js process.env APP_ENV NODE_ENV https://nodejs.org/api/proc ...

  2. how to delete the virtual dom that created in memory using js

    how to delete the virtual dom that created in memory using js const virtualDomConvert = (filename = ...

  3. css var & auto width css triangle

    css var & auto width css triangle https://codepen.io/xgqfrms/pen/PooeEbd css var https://codepen ...

  4. C++算法代码——快速排序

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?cid=1371&pid=1 题目描述 第一行一个数字n, n<=100000. ...

  5. JavaScript async/await:优点、陷阱及如何使用

    翻译练习 原博客地址:JavaScript async/await: The Good Part, Pitfalls and How to Use ES7中引进的async/await是对JavaSc ...

  6. Kubernetes-3.安装

    docker version:19.03.14 kubernetes version:1.19.4 本文介绍使用kubeadm安装Kubernetes集群的简单过程. 目录 使用kubeadm安装k8 ...

  7. c++指针数组与二维数组的最大区别

    下面随笔是关于指针数组说明及与二维数组的最大区别. 指针数组 数组的元素是指针型 例 利用指针数组存放矩阵 1 #include 2 using namespace std; 3 int main() ...

  8. Zeebe服务学习1-简单部署与实现demo

    1.Zeebe是什么? Camunda公司研发的工作流引擎Zeebe,目标是对微服务的编排.具体详细介绍可以参考官网:https://zeebe.io/what-is-zeebe/ 2.背景 随着微服 ...

  9. Python——input与raw_input的区别

      区别一: raw_input():python2版本 input():python3版本 区别二: raw_input()不管是输数字还是字符串,结果都会以字符串的形式展现出来 input()则是 ...

  10. mongoDB导出-导入数据

    --导出数据集 C:\MongoDB\db\bin>mongoexport -d ttx-xwms-test -c things -o d:\mongo_data\things.txt C:\M ...