题目描述

题解:

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

重点是,每个节点都可以通过$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. poj1477(水)

    犯了一个错误,贡献了一次CE: G++里面没有头文件,用scanf会CE:然而C++就可以. 两大cow解释: 最好不要c 的输入和c++的一起用 (特别是关同步的时候) 然而好像他们也不是很了解.. ...

  2. P2579 [ZJOI2005]沼泽鳄鱼

    传送门 话说邻接矩阵居然还能快速幂的么-- 把原图的邻接矩阵\(G\)打出来,那么\(G[u][v]\)表示一秒后\(u\)到\(v\)的方案数,\(G^2[u][v]\)表示\(2\)秒后的方案数- ...

  3. Luogu P1373 小a和uim之大逃离【dp】By cellur925

    题目传送门 $50pts$:容易设计出状态$f[i][j][l][r][st]$表示当前的这个人在($i$,$j$),小a和uim魔瓶中的含量分别为$l$,$r$,当$st=0$表明现在是小a在吃,当 ...

  4. 如何用Zookeeper来实现分布式锁?

    什么是Zookeeper临时顺序节点? 例如 : / 动物 植物 猫 仓鼠 荷花 松树 Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Zonde.# Znode分为四种类型 ...

  5. 最小生成树Prim算法和Kruskal算法(转)

    (转自这位大佬的博客 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html ) Prim算法 1.概览 普里姆算法(Pr ...

  6. CSS3向上移动的效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Stars in Your Window POJ - 2482

    错误记录: 题目说输入在int范围内,但是运算过程中可能超int:后来开了很多longlong就过了 #include<cstdio> #include<algorithm> ...

  8. PV,UV,IP概念

    PV是网站分析的一个术语,用以衡量网站用户访问的网页的数量.对于广告主,PV值可预期它可以带来多少广告收入.一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一个来访者 ...

  9. 堆参数-XMS 与-XMX的说明

    XMS : JVM初始分配的堆内存 XMX : JVM最大允许分配的堆内存,按需分配 堆内存分配: JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64: JVM最大分配的堆内存由-Xmx指 ...

  10. AJPFX总结Collection集合(上)

    出现集合类的原因 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一个方式. 数组和集合都是容器有何不同? 数组虽也可存储对象,但长度 ...