AHOI2014/JSOI2014 奇怪的计算器
题解:
考虑到经过一系列变化后小数不可能比大数大,我们可以用线段树维护区间修改。
重点是,每个节点都可以通过$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 奇怪的计算器的更多相关文章
- BZOJ3878: [Ahoi2014&Jsoi2014]奇怪的计算器
BZOJ3878: [Ahoi2014&Jsoi2014]奇怪的计算器 Description [故事背景] JYY有个奇怪的计算器,有一天这个计算器坏了,JYY希望你能帮助他写 一个程序来模 ...
- 2018.07.25 bzoj3878: [Ahoi2014&Jsoi2014]奇怪的计算器(线段树)
传送门 线段树综合. 让我想起一道叫做siano" role="presentation" style="position: relative;"&g ...
- BZOJ 3878 【AHOI2014】 奇怪的计算器
题目链接:奇怪的计算器 如果没有溢出的话,所有的标记都可以在线段树上直接维护,所以一棵线段树就解决问题了. 现在有了溢出,怎么办呢? 发现就算溢出了,各个元素的相对大小关系也是不变的.所以,如果一开始 ...
- BZOJ 3878 [AHOI&JSOI2014]奇怪的计算器 (线段树)
题面:BZOJ传送门 洛谷传送门 线段树好题 题目保证$a$一定是正整数,容易发现计算结果是单调的 我们把询问离线,并按照从小到大排序 某次操作可能导致某些位置达到边界$L/R$ 根据单调性的结论 这 ...
- [AHOI2014/JSOI2014] 解题报告
[AHOI2014/JSOI2014] 奇怪的计算器 一个很关键的结论,任何时候每个数的相对大小是不变的. 于是可以把这个相对大小当成线段树的权值,每次只需要维护一下区间极值和tag就好了,关于操作四 ...
- 「AHOI2014/JSOI2014」奇怪的计算器
「AHOI2014/JSOI2014」奇怪的计算器 传送门 我拿到这题首先是懵b的,因为感觉没有任何性质... 后来经过同机房dalao的指导发现可以把所有的 \(X\) 放到一起排序,然后我们可以发 ...
- BZOJ 3878: [Ahoi2014]奇怪的计算器
BZOJ 3878: [Ahoi2014]奇怪的计算器 标签(空格分隔): OI-BZOJ OI-线段树 Time Limit: 10 Sec Memory Limit: 256 MB Descrip ...
- AHOI2014 奇怪的计算器 和 HDU5306 Gorgeous Sequence
线段树秀操作题. 奇怪的计算器 有 N 个数,一共会对这 N 个数执行 M 个指令(对没个数执行的指令都一样),每一条指令可以是以下四种指令之一:(这里 a 表示一个正整数) 加上 a 减去 a 乘以 ...
- 【BZOJ3875】[Ahoi2014&Jsoi2014]骑士游戏 SPFA优化DP
[BZOJ3875][Ahoi2014&Jsoi2014]骑士游戏 Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会扮演一个英勇的 ...
随机推荐
- Tasks 多核查找最大最小值问题
先贴下代码 _Datas.ParallelForEach(arg_nDataStartIndex, arg_nDataCount, (data) => { dMax = dMax.Max(dat ...
- 洛谷 P2578 [ZJOI2005]九数码游戏【bfs+康托展开】
只有9!=362880个状态,用康托展开hash一下直接bfs即可 #include<iostream> #include<cstdio> #include<cstrin ...
- RobotFramework自动化测试框架(2)- RobotFramework语法
RobotFramework测试用例是由四部分组成的,下面就从这四个部分简单介绍语法: 关键字表 *** Keywords *** 设置表 *** Settings *** 变量表 *** Varia ...
- PowerShell~文件操作和对象遍历
ps提供了丰富的文件操作,如建立,删除,改名,移动,复制,文件夹建立,显示文件列表,同时对数组对象的遍历也很方便,如果在使用PS脚本时,希望现时传入参数,可以把参数声明为param,当然需要把它写在文 ...
- 【转】Java泛型方法
1. 定义泛型方法 (1) 如果你定义了一个泛型(类.接口),那么Java规定,你不能在所有的静态方法.静态初块等所有静态内容中使用泛型的类型参数.例如: public class A<T> ...
- leetcode410 Split Array Largest Sum
思路: dp. 实现: class Solution { public: int splitArray(vector<int>& nums, int m) { int n = nu ...
- CCF|最大波动|Java|100
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Sc ...
- Android Studio V4 V7 包冲突的问题
最近被包冲突的问题搞奔溃了,特别是V4,V7 V4和V7包冲突的解决方式就是!版本要一致!! 比如我的一个项目中应用本来是这样引用包的 compile 'com.android.support:sup ...
- PMP项目管理学习笔记(9)——范围管理
关于范围管理的几个名词定义 产品范围:表示你和你的团队正在构建的产品或服务的特性和功能:产品范围与最终产品有关,包括产品的特性,组件和组成部分.人们谈论确定产品的范围时,大多都是在谈论确定产品的特性, ...
- android开发中设置字体
转自:http://segmentfault.com/q/1010000000494116 http://ryanhoo.github.io/blog/2014/05/05/android-bette ...