题目描述

题解:

考虑到经过一系列变化后小数不可能比大数大,我们可以用线段树维护区间修改。

重点是,每个节点都可以通过$a[i]=a[i]*t1+a0[i]*t2+t3$这个函数来表示,我们就可以把三个标记一起维护。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = ;
template<typename T>
inline void read(T&x)
{
T f = ,c = ;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
x = f*c;
}
int n,m;
ll L,R;
char ch[];
struct Pair
{
ll x,y;
}p[N],q[N];
bool cmp(Pair a,Pair b){return a.x<b.x;}
ll ans[N];
struct segtree
{
ll t1[N<<],t2[N<<],t3[N<<];
ll lp[N<<],rp[N<<],mx[N<<],mn[N<<];
void pushup(int x)
{
mx[x]=mx[x<<|];
mn[x]=mn[x<<];
}
void add(int x,ll k1,ll k2,ll k3)
{
t1[x]*=k1;
t2[x]=t2[x]*k1+k2;
t3[x]=t3[x]*k1+k3;
mx[x]=mx[x]*k1+rp[x]*k2+k3;
mn[x]=mn[x]*k1+lp[x]*k2+k3;
}
void pushdown(int x)
{
if(t1[x]!=||t2[x]||t3[x])
{
add(x<<,t1[x],t2[x],t3[x]);
add(x<<|,t1[x],t2[x],t3[x]);
t1[x]=,t2[x]=t3[x]=;
}
}
void build(int l,int r,int x)
{
t1[x]=,t2[x]=t3[x]=;
lp[x]=mn[x]=q[l].x,rp[x]=mx[x]=q[r].x;
if(l==r)return ;
int mid = (l+r)>>;
build(l,mid,x<<);build(mid+,r,x<<|);
}
void cl(int x)
{
if(mn[x]>=L)return ;
if(mx[x]<=L){add(x,,,L);return ;}
pushdown(x);
if(mx[x<<]<=L)add(x<<,,,L),cl(x<<|);
else cl(x<<);
pushup(x);
}
void cr(int x)
{
if(mx[x]<=R)return ;
if(mn[x]>=R){add(x,,,R);return ;}
pushdown(x);
if(mn[x<<|]>=R)add(x<<|,,,R),cr(x<<);
else cr(x<<|);
pushup(x);
}
void down(int l,int r,int x)
{
if(l==r)
{
ans[q[l].y] = mx[x];
return ;
}
pushdown(x);
int mid = (l+r)>>;
down(l,mid,x<<);
down(mid+,r,x<<|);
}
}tr;
int main()
{
// freopen("tt.in","r",stdin);
read(n),read(L),read(R);
for(int i=;i<=n;i++)
{
scanf("%s",ch);
read(p[i].y);
if(ch[]=='+')p[i].x=;
if(ch[]=='-')p[i].x=;
if(ch[]=='*')p[i].x=;
if(ch[]=='@')p[i].x=;
}
read(m);
for(int i=;i<=m;i++)
{
read(q[i].x),q[i].y=i;
}
sort(q+,q++m,cmp);
tr.build(,m,);
for(int i=;i<=n;i++)
{
if(p[i].x==)tr.add(,,,p[i].y);
if(p[i].x==)tr.add(,,,-p[i].y);
if(p[i].x==)tr.add(,p[i].y,,);
if(p[i].x==)tr.add(,,p[i].y,);
if(tr.mx[]>R)tr.cr();
if(tr.mn[]<L)tr.cl();
}
tr.down(,m,);
for(int i=;i<=m;i++)printf("%lld\n",ans[i]);
return ;
}

AHOI2014/JSOI2014 奇怪的计算器的更多相关文章

  1. BZOJ3878: [Ahoi2014&Jsoi2014]奇怪的计算器

    BZOJ3878: [Ahoi2014&Jsoi2014]奇怪的计算器 Description [故事背景] JYY有个奇怪的计算器,有一天这个计算器坏了,JYY希望你能帮助他写 一个程序来模 ...

  2. 2018.07.25 bzoj3878: [Ahoi2014&Jsoi2014]奇怪的计算器(线段树)

    传送门 线段树综合. 让我想起一道叫做siano" role="presentation" style="position: relative;"&g ...

  3. BZOJ 3878 【AHOI2014】 奇怪的计算器

    题目链接:奇怪的计算器 如果没有溢出的话,所有的标记都可以在线段树上直接维护,所以一棵线段树就解决问题了. 现在有了溢出,怎么办呢? 发现就算溢出了,各个元素的相对大小关系也是不变的.所以,如果一开始 ...

  4. BZOJ 3878 [AHOI&JSOI2014]奇怪的计算器 (线段树)

    题面:BZOJ传送门 洛谷传送门 线段树好题 题目保证$a$一定是正整数,容易发现计算结果是单调的 我们把询问离线,并按照从小到大排序 某次操作可能导致某些位置达到边界$L/R$ 根据单调性的结论 这 ...

  5. [AHOI2014/JSOI2014] 解题报告

    [AHOI2014/JSOI2014] 奇怪的计算器 一个很关键的结论,任何时候每个数的相对大小是不变的. 于是可以把这个相对大小当成线段树的权值,每次只需要维护一下区间极值和tag就好了,关于操作四 ...

  6. 「AHOI2014/JSOI2014」奇怪的计算器

    「AHOI2014/JSOI2014」奇怪的计算器 传送门 我拿到这题首先是懵b的,因为感觉没有任何性质... 后来经过同机房dalao的指导发现可以把所有的 \(X\) 放到一起排序,然后我们可以发 ...

  7. BZOJ 3878: [Ahoi2014]奇怪的计算器

    BZOJ 3878: [Ahoi2014]奇怪的计算器 标签(空格分隔): OI-BZOJ OI-线段树 Time Limit: 10 Sec Memory Limit: 256 MB Descrip ...

  8. AHOI2014 奇怪的计算器 和 HDU5306 Gorgeous Sequence

    线段树秀操作题. 奇怪的计算器 有 N 个数,一共会对这 N 个数执行 M 个指令(对没个数执行的指令都一样),每一条指令可以是以下四种指令之一:(这里 a 表示一个正整数) 加上 a 减去 a 乘以 ...

  9. 【BZOJ3875】[Ahoi2014&Jsoi2014]骑士游戏 SPFA优化DP

    [BZOJ3875][Ahoi2014&Jsoi2014]骑士游戏 Description  [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会扮演一个英勇的 ...

随机推荐

  1. AFN清除图片缓存 以及菊花转圈

    AFNetworking网络库已经提供了很好的图片缓存机制,效率是比较高的,但是我发现没有直接提供清除缓存的功能,可项目通常都需要添加 清除功能的功能,因此,在这里我以UIImageView+AFNe ...

  2. Linux--------------mysql的安装

    工具: 1>Centos6.8 2>Jdk1.7 3>Mysql5.7 1.下载mysql        wget http://dev.mysql.com/get/Download ...

  3. 跟我一起玩Win32开发(21):复制&粘贴&剪贴板操作

    我要提醒一下大家,看了我的博文学到的知识,千万不要用于实际开发,不然你会被你的上司骂:“妈的,这些东西哪来的,从来没有人这样做过.”不信你试试,脑细胞被冻结的经理或者技术总监们肯定会这样说的. 如果是 ...

  4. Eclipse的ant调用maven

    需要在 eclipse 的 windows - preferences - ant - runtime - classpath - global entries 加入 eclipse 里面的 jsch ...

  5. A. The Fault in Our Cubes 暴力dfs

    http://codeforces.com/gym/101257/problem/A 把它固定在(0,0, 0)到(2, 2, 2)上,每次都暴力dfs检查,不会超时的,因为规定在这个空间上,一不行, ...

  6. Apache Kylin的核心概念

    不多说,直接上干货! 1.表(table):This is definition of hive tables as source of cubes,在build cube 之前,必须同步在 kyli ...

  7. Dev GridView 属性说明

    说明  Options  OptionsBehavior 视图的行为选项 AllowIncrementalSearch 允许用户通过输入想得到的列值来定位行 AllowPartialRedrawOnS ...

  8. android控件之webview和js与java交互

    首先添加权限:<uses-permission android:name="android.permission.INTERNET"/> 布局文件: <Relat ...

  9. Javaweb学习笔记8—DBUtils工具包

    今天来讲javaweb的第8阶段学习. DBUtils技术,DBUtils是我们操作数据库很常用的功能,虽然后期使用都是它的封装结果,但是也需要掌握. 老规矩,首先先用一张思维导图来展现今天的博客内容 ...

  10. How `new’ operator works ?

    这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=15 February 15, 2013 How `new’ operator ...