test20180921 手机信号
题意


分析
我们用形如(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 手机信号的更多相关文章
- "手机信号放大器" 让手机信号增强的办法
我的住处信号及其的差,电话基本打不进来,放大器的话便宜的也得一百多,于是自己尝试各种办法让自己的手机有信号,于是奇迹般的成功了: 将手机放于铁缸内,并45度角斜放,刚好淹没手机为佳.于是信号奇迹般的3 ...
- JZOJ5821手机信号
用set维护,(l,r,v),注意边界,保证了两个端点l,r一定有信号站 增加有三种可能,1.直接加(没有影响),2.将原本的一个区间变成两个 3.将原本的一个区间变成三个 删除有三种情况,1.全包含 ...
- Android Telephony —— 手机信号实时变化源码分析过程记录
源码版本:4.4 跳过InCallActivity等UI实现.先看service以及底层. 1, 在frameworks/opt下面会发现如下文件列表: ./telephony/src/java/co ...
- 手机信号G、E、O、3G代表什么意思?
G指GPRS,是2.5G网络,属于GSM网络,也就是说这项技术位于第二代(2G)和第三代(3G)移动通讯技术之间,GPRS的传输速率可提升至56甚至114Kbps,已经将2017年确定为关闭GSM网络 ...
- [set]JZOJ 5821 手机信号
Description
- android 获取手机GSM/CDMA信号信息,并获得基站信息
本文转自:http://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma/ 在Android中我们常用的轻松获取WIFI信号列表,那如 ...
- 手机定位室内gps没信号
手机定位一般分3种,gps,手机信号基站,上网地点,其中gps信号一般只有户外有,所以在室外的时候只开启定位和gps就可以定位了,但是在室内没有gps的情况,就需要开网络定位了.
- 手机信号强度单位dB、dBm和asu
dB.dBm都是功率增益的单位,不同之处如下: dB是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时,按下面的计算公式:10log( ...
- 酷派大神F2系列使用QPST进行nv备份和恢复,解决无信号问题(附备份文件)
测试机器: 大神F2联通版 8675_W00 系统COOLUI55 写贴原因: 自己无意间刷错了包,结果手机无信号,进入工程模式怎么设置都没有用.尝试过系统还原(备份过).刷新的ROM.线刷, ...
随机推荐
- ps命令各个内容信息详解
USER 用户名 PID 进程ID(Process ID) %CPU 进程的cpu占用率 %MEM 进程的内存占用率 VSZ 进程所使用的虚存的大小(Vi ...
- .NET中使用Rabbit MQ
1.通过Nuget 获取Rabbit MQ NET client bindings from NuGet: PM> Install-Package RabbitMQ.Client 2.发送者(生 ...
- Anton and School - 2 CodeForces - 785D (组合计数,括号匹配)
大意: 给定括号字符串, 求多少个子序列是RSGS. RSGS定义如下: It is not empty (that is n ≠ 0). The length of the sequence is ...
- 『Collections』namedtuple_具名元组
namedtuple()类 需要两个参数,参数一为nametupe名称,参数二为字段一般为序列(多个字段) Python中存储系列数据,比较常见的数据类型有list,除此之外,还有tuple数据类型. ...
- python-day8-元组的内置方法
#为何要有元组,存放多个值,元组不可变,更多的是用来做查询# t=(1,[1,3],'sss',(1,2)) #t=tuple((1,[1,3],'sss',(1,2)))# print(type(t ...
- 转化为json方式函数
1,我的数据格式是: {"message":"","code":0,"data":[{"Order" ...
- zzuli 1875多线DP
1875: 蛤玮的财宝 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 530 Solved: 116 SubmitStatusWeb Board De ...
- Docker安装及基础知识
一.安装 & 启动 1.安装Docker [root@tokyo ~]# yum install docker 2.启动Docker服务 (1)旧式的 sysv 语法 [root@tokyo ...
- spring cloud学习(四) Fegin 的使用
Feign 的使用 什么是Feign? Feign : Declarative REST clients. Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创 ...
- adobe flash player不是最新版本
adobe flash player不是最新版本