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. 使用opencv-python实现MATLAB的fspecial('Gaussian', [r, c], sigma)

    reference_opencv实现高斯核 reference_MATLAB_fspecial函数说明 # MATLAB H = fspecial('Gaussian', [r, c], sigma) ...

  2. 20 个使用原生 JavaScript 实现的 Web 项目

    20 个使用原生 JavaScript 实现的 Web 项目 20 vanilla JavaScript Web Projects https://github.com/learning-js-by- ...

  3. js Memory Management

    js Memory Management 垃圾回收是一个术语,在计算机编程中用于描述查找和删除那些不再被其他对象引用的对象的处理过程. 换句话说,垃圾回收是删除任何其他对象未使用的对象的过程. 垃圾收 ...

  4. PIP & Python packages management

    PIP & Python packages management $ python3 --version # OR $ python3 -V # Python 3.7.3 $ pip --ve ...

  5. You Don't Know the Hack tech in the frontend development

    You Don't Know the Hack tech in the frontend development 你所不知道的前端黑科技 css in js animation https://www ...

  6. let & var & initialized bug

    let & var & initialized bug what's wrong with this? https://github.com/lydiahallie/javascrip ...

  7. 呼叫河马——搭建在NGK公链上的去中心化智能合约DAPP

    基于区块链技术发展的DAPP是一种分布式应用生态系统.目前最受DAPP欢迎的区块链有以太坊.EOS.波场等公链. 但由于当前 EOS资源模型的局限性,使得其使用成本较高.尽管 EOS的DPOS共识机制 ...

  8. SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法

    本文转载自SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法 导语 作为一名安全爱好者,我一向很喜欢SSL(目前是TLS)的运作原理.理解这个复杂协议的基本原理花了我好几天的时间,但只要 ...

  9. 007-变量的作用域和LED点阵

    变量 一.局部变量和全局变量 局部变量:函数内申明的变量,只在函数内有效. 全局变量:函数外部申明的变量.一个源程序文件有一个或者多个函数,全局变量对他们都起作用. 备注:全局变量有副作用,降低了函数 ...

  10. 【粉丝问答10】C语言关键字static的使用详解

    视频地址:https://www.ixigua.com/6935761378816819748 粉丝提问 粉丝问题,总结一下: 关键字static的使用方法. 要想搞清楚关键字static的使用方法, ...