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. Swift 5.3

    Swift 5.3 https://swift.org/blog/ refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  2. Angular Learning Paths

    Angular Learning Paths Angular Expert refs https://app.pluralsight.com/search/?q=angular xgqfrms 201 ...

  3. 运行Chrome浏览器如何添加Options

    原文档 Options Windows: 退出Chrome的所有正在运行的实例. 右键单击"Chrome"快捷方式 选择属性 在"目标:"行的末尾添加命令行标志 ...

  4. 为什么要抢挖Baccarat流动性挖矿的头矿?头矿的价值是什么?

    今年下半年,DeFi流动性挖矿非常受投资者的欢迎,究其原因,其超高的挖矿回报率着实足够吸引无数投资者的眼球.而即将上线的Baccarat流动性挖矿,也未上线先火了一把.Baccarat是由NGK公链推 ...

  5. java线程池趣味事:这不是线程池

    要想写出高性能高并发的应用,自然有许多关键,如io,算法,异步,语言特性,操作系统特性,队列,内存,cpu,分布式,网络,数据结构,高性能组件. 胡说一通先. 回到主题,线程池.如果说多线程是提高系统 ...

  6. .net core 和 WPF 开发升讯威在线客服系统:怎样实现拔网线也不丢消息的高可靠通信(附视频)

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...

  7. MacOS下PHP7.1升级到PHP7.4.15

    最近写SDK的时候需要用到object类型提示符,PHPStorm智能提示说需要PHP7.2以上才能支持这种类型提示. 我一查我本机的PHP是7.1.30版本,于是考虑升级一下PHP版本. 首先要尝试 ...

  8. 面试20家互联网公司总结出的高频MySQL面试题

    1.MyISAM存储获与InnoDB存储引擎  MyISAM存储引擎不支持事务.表锁设计.支持全文索引.缓冲池只缓存索引文件,并不缓存数据文件. InnoDB存储引擎支持事务.行锁设计.支持外键,支持 ...

  9. 解决margin-top无效问题

    当两个空的块级元素嵌套时,如果内部的块设置有margin-top属性,而且父元素没有下边解决方法所述的特征,那么内部块的margin-top属性会绑架父元素(即将margin-top传递凌驾给了父元素 ...

  10. python进阶(3)序列化与反序列化

    序列化与反序列化 按照某种规则,把内存中的数据保存到文件中,文件是一个字节序列,所以必须要把内存数据转换成为字节序列,输出到文件,这就是序列化:反之,从文件的字节恢复到内存,就是反序列化: pytho ...