题意



分析

我们用形如(l, r, v) 的三元组描述一个区间,这个区间中从l 到r 每隔v 有一个信号站。

考虑一次construct 操作,会添加一个新的区间,并可能将一个已经存在的区间分裂为两个。

因此任何时刻区间总数不会超过\(O(n)\) 个。

我们用一个数据结构维护所有区间(比如说set),在询问时二分查找即可。

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

学习了。

我昨天打了一个set套区间端点,炸了,觉得分类太多没法打。

主要是因为不知道怎么查找区间的左右位置。

原来是分别查找左端点lower_bound-1和右端点upper_bound-1

代码

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff; int m;
ll c; struct node
{
int l,r,v;
bool operator<(const node&rhs)const
{
return l<rhs.l;
}
}; set<node>S;
typedef set<node>::iterator sit; int getlp(int l,int v,int p)
{
return l+(p-l)/v*v;
} int getrp(int r,int v,int p)
{
return r-(r-p)/v*v;
} void construct(int l,int r,int v)
{
r=getlp(l,v,r);
sit i=S.lower_bound((node){l,0,0});
if(i!=S.begin())
{
--i;
if(i->l<l&&i->r>r)
{
node t=*i;
S.erase(i);
int tt=getlp(t.l,t.v,l);
S.insert((node){t.l,tt,t.v});
tt=getrp(t.r,t.v,r);
S.insert((node){tt,t.r,t.v});
}
}
S.insert((node){l,r,v});
} void destruct(int l,int r)
{
sit i=S.lower_bound((node){l,0,0});
if(i!=S.begin())
{
--i;
if(i->l<l&&i->r>=l)
{
node t=*i;
S.erase(i);
int tt=getlp(t.l,t.v,l-1);
S.insert((node){t.l,tt,t.v});
}
}
i=S.upper_bound((node){r,0,0});
if(i!=S.begin())
{
--i;
if(i->l<=r&&i->r>r)
{
node t=*i;
S.erase(i);
int tt=getrp(t.r,t.v,r+1);
S.insert((node){tt,t.r,t.v});
}
}
S.erase(S.lower_bound((node){l,0,0}),S.upper_bound((node){r,0,0}));
} ll query(int x)
{
sit i=S.lower_bound((node){x,0,0});
int ans=INF;
if(i!=S.end())
ans=min(ans,i->l-x);
if(i!=S.begin())
{
--i;
if(i->r>=x)
{
int t1=getlp(i->l,i->v,x),t2=getrp(i->r,i->v,x);
ans=min(ans,min(x-t1,t2-x));
}
else
ans=min(ans,x-i->r);
}
if(ans==INF)
return 0;
else
return max(0ll,c-(ll)ans*ans);
} int main()
{
freopen("cellphone.in","r",stdin);
freopen("cellphone.out","w",stdout);
read(m);read(c);
char opt[20];
int x,y,z;
while(m--)
{
scanf("%s",opt);
if(opt[0]=='c')
{
read(x);read(y);read(z);
construct(x,y,z);
}
else if(opt[0]=='d')
{
read(x);read(y);
destruct(x,y);
}
else if(opt[0]=='q')
{
read(x);
printf("%lld\n",query(x));
}
}
// fclose(stdin);
// fclose(stdout);
return 0;
}

test20180921 手机信号的更多相关文章

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

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

  2. JZOJ5821手机信号

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

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

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

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

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

  5. [set]JZOJ 5821 手机信号

    Description

  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. Linux 设置程序开机自启动 (命令systemctl 和 chkconfig用法区别比较)

    之前在Linux centos 7 上安装了apache 和mysql,当时并没有设置开机自动启动. 最近又重新练习网页,每次开机总是要手动启动httpd和mysqld,不方便,就想设置成开机自动启动 ...

  2. 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下

    『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 # Author : Hellcat # Time : 2018/2/11 import torch as t import t ...

  3. 『cs231n』作业3问题2选讲_通过代码理解LSTM网络

    LSTM神经元行为分析 LSTM 公式可以描述如下: itftotgtctht=sigmoid(Wixxt+Wihht−1+bi)=sigmoid(Wfxxt+Wfhht−1+bf)=sigmoid( ...

  4. nyoj-833-博弈

    833-取石子(七) 内存限制:64MB 时间限制:1000ms 特判: No通过数:16 提交数:30 难度:1 题目描述: Yougth和Hrdv玩一个游戏,拿出n个石子摆成一圈,Yougth和H ...

  5. Python的数据类型1数值和字符串

    Python的交互器 在讲这个之前,我要先讲一下python的交互器,之后讲解代码(除了做简单项目)都在交互器上进行,这样可能比较直接一些,有利于刚接触python的人理解代码 python在命令行自 ...

  6. 感知器、logistic与svm 区别与联系

    https://blog.csdn.net/m0_37786651/article/details/61614865 从感知器谈起 对于典型的二分类问题,线性分类器的目的就是找一个超平面把正负两类分开 ...

  7. 060——VUE中vue-router之路由嵌套在文章系统中的使用方法:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. poj 2777线段树应用

    敲了n遍....RE愉快的debug了一晚上...发现把#define maxn = 100000 + 10 改成 #define maxn = 100010 就过了....感受一下我呵呵哒的表情.. ...

  9. C#阿里云移动推送列表

    C#阿里云移动推送列表 这个就在上期随笔的基础之上,加一个 函数就行了.   简单的. 附上源码:一下代码只要把参数改一下就可以了,中间几个参数 可以灵活修改 /// <summary> ...

  10. PHP excel reader , excel时间转成php时间格式

    最近,在做一个导入功能,在系统中使用PHPExcel类库,读取上传的Excel文件,然后进行字段映射,最后将Excel内的数据导入到系统中.其中,关于日期格式的导入,使我犯了难. 首先,如何导入日期, ...