题意



分析

我们用形如(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. 12月22日 update_columns,完成第9节。

    Update_columns(attributes) //等同于update_column 直接更新database. 使用UPdate SQL 语法. ⚠️ :忽略了validations, Cal ...

  2. c#将Excel数据导入到数据库的实现代码

    这篇文章主要介绍了c#将Excel数据导入到数据库的实现代码,有需要的朋友可以参考一下 假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: 代码: 代码如下: using Syste ...

  3. c语言枚举类型变量的作用

    #include<stdio.h> enum DAY { MON=, TUE, WED, THU, FRI, SAT, SUN }; int main() { enum DAY day; ...

  4. iOS开发-开发文档安装

    iOS开发肯定离不开开发文档,苹果有在线帮助文档,xCode其实可以下载模拟器文档和iOS8.1文档的,不过下载的速度实在不敢恭维,而且比较头疼的是不显示下载进度条的,苹果的开发文档都是放在)/应用程 ...

  5. OC MRC之计数器的基本操作(代码分析)

    /* 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> ...

  6. java并发编程:线程安全管理类--原子操作类--AtomicStampedReference<V>

    1.类 AtomicStampedReference<V> AtomicStampedReference 维护带有整数“标志”的对象引用,可以用原子方式对其进行更新. 实现注意事项.通过创 ...

  7. forget word _a

    forget word a~   一再,铺音前     1● ab 2● ac 3● ad 4● af 5● ag 6● an 7● as 8● at 9● ap 10● ar

  8. learning uboot test command

    uboot commad test test - minimal test like /bin/sh so we can use test command to some judge for exam ...

  9. for each...in,for...in, for...of

    一.for  each ...in explanation: 该语句在对象属性的所有值上迭代指定的变量.对于每个不同的属性,执行指定的语句. 句法: for each (variable in obj ...

  10. Winform中用comboBox来选择显示Dataset中表格数据

    这是一次偷懒的尝试,因为每次都必须打开代码,调试才能看见数据,发现问题.也是借鉴了调试中查看dataset数据的模式,查看不同表格.经历一番研究,总算实现了想要的效果了,故作此一笔记.与人共享. 界面 ...