题意



分析

我们用形如(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. 如何配置Smarty模板

    <?php //首先包含Smarty类文件 include_once('Smarty/Smarty.class.php'); //实例化Smarty类文件 $smarty=new Smarty( ...

  2. ArcGIS API for Silverlight 的重要内容******重要

    ArcGIS Silverlight API:是构建在微软Silverlight平台之上,通过ArcGIS Server Rest API消费ArcGIS Server 服务,同时支持直接消费Bing ...

  3. python-day49--前端 html

    一.列表标签 1.有序列表 <ol>       (order list ) 在浏览器中显示包括:padding , 有序排列     <li>:列表中的每一项. 2.无序列表 ...

  4. python-day34--进程补充

    一.进程补充: 1,生产者消费者模型: 两类角色,一类负责生产数据,另外那类负责数据 生产完放到共享空间,另外那类到空间取数据进行处理 好处: 生产数据的同时可以进行数据的处理,不用等(并发效果) 问 ...

  5. vs2012修改代码编辑区域的背景色

  6. 54. 59. Spiral Matrix

    1. Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral ...

  7. 在linux中,如何增加、修改、删除、暂停和冻结用户名

    在Linux中,如何增加.修改.删除.暂停和冻结用户名 在操作增加.修改和删除用户名前,先认识linux中两个最重要的文件,它们就是账号管理最重要文件“/etc/passwd”与“etc/shadow ...

  8. 快速切题 sgu123. The sum

    123. The sum time limit per test: 0.25 sec. memory limit per test: 4096 KB The Fibonacci sequence of ...

  9. c#重写和重载的区别?重写和重载的意义?

    重写: 要求方法名.参数合返回值相同: 意义:重写是为了增强类的重用性和复用性,扩展性:重写是对类中方法的扩充,因为继承用的是父类的东西,重写则不仅得到父类的东西,同时也加入了自己的东西. 方法重写的 ...

  10. 关于反射的BindingFlag浅析

    MSDN关于BindingFlag的文档地址:https://msdn.microsoft.com/zh-cn/library/cexkb29a BindFlags作为一个特别的标志量,在反射中通过这 ...