题目描述

输入

输出

样例输入

11 10000
query 5
construct 5 500 100
query 500
query 1000
construct 10 90 5
query 44
destruct 44 66
query 55
construct 50 60 3
query 46
query 6000

样例输出

0
975
0
9999
9775
9984
0

提示

题解

这道题给你三种操作(这道题用set维护区间)

对于construct操作,我们可以发现加入的区间要么和所有的区间都不相交,要么就是区间的大小比某个区间的v还要小

construct操作读入的x,y我们可以可以把y改成x+(y-x)/v*v(最后一个信号站的位置)

对于destruct操作,我们判断一下左右端点是否把其他的区间截断了

对于query操作,我们只要找一下离这个点最近的一个区间就可以了

具体细节可以看一下代码

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
int x,y,v;
bool operator <(const node &a) const{
return x<a.x;
}
};
typedef multiset<node>::iterator It;
int m,l,r,v,x,y;
ll c;
char s[];
multiset<node> q;
int calc(int x,int y,int v){ return x+(y-x)/v*v; }
void solve_c(){
scanf("%d%d%d",&x,&y,&v);
y=calc(x,y,v);
It point=q.upper_bound((node){x,,});
if (point!=q.begin()){
point--;
int st=point->x,ed=point->y;
if (st<x&&ed>y){
int stp=point->v;
q.erase(point);
q.insert((node){st,calc(st,x,stp),stp});
if (st!=ed)
q.insert((node){calc(st,x,stp)+stp,ed,stp});
}
}
q.insert((node){x,y,v});
}
void solve_d(){
scanf("%d%d",&x,&y);
It point=q.lower_bound((node){x,,});
if (point!=q.begin()){
point--;
int st=point->x,ed=point->y;
if (st<x&&ed>=x){
int stp=point->v;
q.erase(point);
q.insert((node){st,calc(st,x-,stp),stp});
if (ed>y)
q.insert((node){calc(st,r,stp)+stp,ed,stp});
}
}
point=q.upper_bound((node){y,,});
if (point!=q.begin()){
point--;
int st=point->x,ed=point->y;
if (st<=y&&ed>y){
int stp=point->v;
q.erase(point);
q.insert((node){calc(st,y,stp)+stp,ed,stp});
}
}
q.erase(q.lower_bound((node){x,,}),q.upper_bound((node){y,,}));
}
void solve_q(){
scanf("%d",&x);
int d=1e9;
It point=q.lower_bound((node){x,,});
if (point!=q.end()) d=min(d,point->x-x);
if (point!=q.begin()){
point--;
int st=point->x,ed=point->y;
if (ed>=x){
int stp=point->v;
d=min(d,x-calc(st,x,stp));
if (st!=ed) d=min(d,calc(st,x,stp)+stp-x);
} else d=min(d,x-point->y);
}
if (d==1e9) puts("");
else printf("%lld\n",max(0ll,c-(ll)d*d));
}
int main(){
scanf("%d%lld",&m,&c);
for (int i=;i<=m;i++){
scanf("%s",s);
if (s[]=='q') solve_q(); else
if (s[]=='c') solve_c(); else
if (s[]=='d') solve_d();
}
return ;
}

最新文章

  1. 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)
  2. log4j配置日志文件log4j.appender.R.File相对路径方法
  3. Flash图表控件FusionCharts如何定制图表中的趋势线和趋势区
  4. C语言中输入输出格式控制
  5. 初探swift语言的学习—Object-C与Swift混编
  6. PO经批准的订单API
  7. H5C301
  8. 【JDK和Open JDK】平常使用的JDK和Open JDK有什么区别(转)
  9. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-8底层驱动之RTC
  10. 写给大忙人的nginx核心配置详解
  11. 『TensorFlow Internals』笔记_系统架构
  12. Jmeter(五)录制功能
  13. mybatis延迟加载——(十二)
  14. Matlab scatter 如何显示不同颜色点状
  15. [转]关闭WIN7“程序兼容性助理”
  16. hdoj1068 Girls and Boys(二分图的最大独立集)
  17. Android 中的冷启动和热启动
  18. C++虚函数原理
  19. asp.net mvc文件下载
  20. PostgreSQL锁级别及什么操作获取什么锁

热门文章

  1. 测试与发布(Alpha版本)
  2. 201521123015 《Java程序设计》第七周学习总结
  3. 201521123076 《Java程序设计》第6周学习总结
  4. 201521123088《JAVA程序设计》第5周学习总结
  5. 201521123028《Java程序设计》第1周学习总结
  6. 利用ASCII码生成指定规则的字符串
  7. 全方位解读&quot;CPU load average&quot;
  8. maven web 项目中启动报错 Java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
  9. [python学习笔记] py2exe 打包
  10. [python学习笔记] python程序打包成exe文件