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.线刷, ...
随机推荐
- php json josn_decode()返回的是对像,如何把对像转成数组
php json josn_decode()返回的是对像,如何把对像转成数组 a.php传值页面,使用 json_encode($array)对数组进行加密码. b.php页面在接收a.php传过来的 ...
- Python的url解析库--urlparse
一.urlparse解析url的query并构建字典 下面的方法主要的功能: 解析url的各个部分,并能够获取url的query部分,并把query部分构建成dict. 具体的代码实现: >&g ...
- LeetCode--141--环形链表
问题描述: 给定一个链表,判断链表中是否有环. 思路:用快的指针追慢的指针,只要有圈,一定能追上. 错误: class Solution(object): def hasCycle(self, hea ...
- LTE时代的定位技术:OTDOA,LPP,SUPL2.0
LTE时代的定位技术:OTDOA,LPP,SUPL2.0 移动定位技术的发展历程 如今智能手机已经在整个社会普及,数量众多的手机应用成为了人们生活当中不可或缺的一部分.越来越多的手机应用都用到了手机定 ...
- python-day15函数递归
1.递归: 在函数内,调用自己. (技巧: 每次调用时,函数前面需加上return,这样返回值就可以一层一层 的返回去) #def age(n):# if n == 1:# re ...
- CF-500div2-A/B/C
A. Piles With Stones time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Android studio Suggestion: use tools:overrideLibrary=”jp.wasabeef.blurry” to force usage
异常提示: 应用在Android Studio Build的时候,抛出了如下异常: Error:Execution failed for task ‘:app:processDebugManifest ...
- .net 环境配置
需要把安装中文包也安装上.4个都安装
- 4.1 delegate
delegate ---packed up function public delegate double myDelegate (double x); my delegate d2 = new m ...
- 24.2 网络编程基础——System.Net 命名空间
使用C#进行网络编程时,通常要用到: System. Net 命名空间. System. Net. Sockets 命名空间. System. Net. Mail 命名空间. 24.2.1 Sy ...