Rip Van Winkle was fed up with everything except programming. One day he found a problem whichrequired to perform three types of update operations (A, B, C), and one query operation S over an arraydata[]. Initially all elements of data are equal to 0. Though
Rip Van Winkle is going to sleep for 20years, and his code is also super slow, you need to perform the same update operations and output theresult for the query operation S in an efficient way.

long long data[250001];

void A( int st, int nd ) {

for( int i = st; i \le nd; i++ ) data[i] = data[i] + (i - st + 1);

}

void B( int st, int nd ) {

for( int i = st; i \le nd; i++ ) data[i] = data[i] + (nd - i + 1);

}

void C( int st, int nd, int x ) {

for( int i = st; i \le nd; i++ ) data[i] = x;

}

long long S( int st, int nd ) {

long long res = 0;

for( int i = st; i \le nd; i++ ) res += data[i];

return res;

}

Input

The first line of input will contain T (≤ 4 ∗ 105) denoting the number of operations. Each of the nextT lines starts with a character (‘A’, ‘B’, ‘C’ or ‘S’), which indicates the type of operation. Character ‘A’,‘B’ or ‘S’ will be followed by two integers,
st and nd in the same line. Character ‘C’ is followed by threeintegers, st, nd and x. It’s assumed that, 1 ≤ st ≤ nd ≤ 250000 and −105 ≤ x ≤ 105. The meaningsof these integers are explained by the code of Rip Van Winkle.

Output

For each line starting with the character ‘S’, print S(st, nd) as defined in the code.

Sample Input

7

A 1 4

B 2 3

S 1 3

C 3 4 -2

S 2 4

B 1 3

S 2 4

Sample Output

9

0

3

这题是区间更新,这题比較麻烦,做了非常长时间。先用线段树维护l,r,add1(线段左端点加的值),add2(线段右端点加的值),step(区间的公差,右边减去左边的),sum(区间总和),flag(推断区间是否数字同样),value(区间数字都同样时的数值大小).我的思路是每一次更新,都把这一段的sum值直接表示出来。假设更新的这条线段小于当前线段,那么先不更新sum值。而是b[th].sum=b[lth].sum+b[rth].sum;

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<bitset>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef long double ldb;
#define lth th<<1
#define rth th<<1|1
#define inf 99999999
#define pi acos(-1.0)
#define MOD 100000007
#define maxn 250050
struct node{
int l,r;
ll value,flag; //flag表示这段是不是值都是同样的,value是这段的值
ll add1,step,add2; //add1表示左端点加的值,add2表示右端点,step表示这段的公差
ll sum;
}b[4*maxn]; void build(int l,int r,int th)
{
int mid;
b[th].l=l;b[th].r=r;
b[th].value=0;b[th].flag=1;
b[th].add1=b[th].step=b[th].add2=0;
b[th].sum=0;
if(l==r)return;
mid=(l+r)/2;
build(l,mid,lth);
build(mid+1,r,rth);
}
void pushdown(int th)
{
int mid;
mid=(b[th].l+b[th].r)/2;
if(b[th].flag){
b[th].flag=0;
b[lth].flag=1;
b[lth].value=b[th].value;
b[lth].add1=b[lth].add2=b[lth].step=0;
b[lth].sum=(b[lth].r-b[lth].l+1)*b[th].value; b[rth].flag=1;
b[rth].value=b[th].value;
b[rth].add1=b[rth].add2=b[rth].step=0;
b[rth].sum=(b[rth].r-b[rth].l+1)*b[th].value;
} ll add1,add2;
add1=b[th].add1; add2=b[th].add1+(mid-b[th].l)*b[th].step;
b[lth].add1+=add1;
b[lth].add2+=add2;
b[lth].step+=b[th].step;
b[lth].sum+=(add1+add2)*(b[lth].r-b[lth].l+1)/2; ll add3,add4;
add3=add2+b[th].step;add4=add3+(b[th].r-(mid+1))*b[th].step;
b[rth].add1+=add3;
b[rth].add2+=add4;
b[rth].step+=b[th].step;
b[rth].sum+=(add3+add4)*(b[rth].r-b[rth].l+1)/2; b[th].add1=b[th].add2=b[th].step=0;
}
void pushup(int th)
{
b[th].sum=b[lth].sum+b[rth].sum;
} void update(int l,int r,ll add,int f,int th)
{
int mid;
if(b[th].l==l && b[th].r==r){
if(f==1){
b[th].add1+=add;
b[th].add2+=add+b[th].r-b[th].l;
b[th].step+=1;
b[th].sum+=(add+add+b[th].r-b[th].l)*(b[th].r-b[th].l+1)/2;
return;
}
else if(f==2){
b[th].add1+=add+b[th].r-b[th].l;
b[th].add2+=add;
b[th].step-=1;
b[th].sum+=(add+add+b[th].r-b[th].l)*(b[th].r-b[th].l+1)/2;
return;
}
else if(f==3){
b[th].flag=1;
b[th].value=add;
b[th].sum=b[th].value*(b[th].r-b[th].l+1);
b[th].add1=b[th].add2=b[th].step=0;
return;
}
}
pushdown(th);
mid=(b[th].l+b[th].r)/2;
if(r<=mid)update(l,r,add,f,lth);
else if(l>mid)update(l,r,add,f,rth);
else{
if(f==1){
update(l,mid,add,f,lth);
update(mid+1,r,add+(mid+1-l),f,rth);
}
else if(f==2){
update(l,mid,add+(r-mid),f,lth);
update(mid+1,r,add,f,rth);
}
else if(f==3){
update(l,mid,add,f,lth);
update(mid+1,r,add,f,rth);
}
}
pushup(th);
}
ll question(int l,int r,int th)
{
int mid;
if(b[th].l==l && b[th].r==r){
return b[th].sum;
}
pushdown(th);
mid=(b[th].l+b[th].r)/2;
if(r<=mid)return question(l,r,lth);
else if(l>mid)return question(l,r,rth);
else{
return question(l,mid,lth)+question(mid+1,r,rth);
}
}
int main()
{
int m,i,j,T,c,d;
ll n,num;
char s[10];
while(scanf("%lld",&n)!=EOF)
{
build(1,250010,1);
for(i=1;i<=n;i++){
scanf("%s%d%d",s,&c,&d);
if(s[0]=='A'){
update(c,d,1,1,1);
}
else if(s[0]=='B'){
update(c,d,1,2,1);
}
else if(s[0]=='C'){
scanf("%lld",&num);
update(c,d,num,3,1);
}
else if(s[0]=='S'){
printf("%lld\n",question(c,d,1) );
}
}
}
return 0;
}

Uva 12436 Rip Van Winkle&#39;s Code的更多相关文章

  1. UVA 12436 - Rip Van Winkle&#39;s Code(线段树)

    UVA 12436 - Rip Van Winkle's Code option=com_onlinejudge&Itemid=8&page=show_problem&cate ...

  2. Uva 12436 Rip Van Winkle's Code

    Rip Van Winkle was fed up with everything except programming. One day he found a problem whichrequir ...

  3. UVA-12436 Rip Van Winkle's Code (线段树区间更新)

    题目大意:一个数组,四种操作: long long data[250001]; void A( int st, int nd ) { for( int i = st; i <= nd; i++ ...

  4. UVA 12436-Rip Van Winkle's Code(线段树的区间更新)

    题意: long long data[250001]; void A( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = da ...

  5. UVA - 10057 A mid-summer night&#39;s dream.

    偶数时,中位数之间的数都是能够的(包含中位数) 奇数时,一定是中位数 推导请找初中老师 #include<iostream> #include<cstdio> #include ...

  6. 常见条码类型介绍(Code 39、Code 128、EAN-8、EAN-13、EAN-128、ISSN、TIF、TIF-14、UPC(A)、UPC(E))

    常见条码类型,如下: 1.Code 39 Code 39,又称为"Code 3 of 9",是非零售市场中最常用的格式,用于盘存和跟踪.Code 39码编码规则简单,误码率低.所能 ...

  7. 退役笔记一#MySQL = lambda sql : sql + &#39; Source Code 4 Explain Plan &#39;

    Mysql 查询运行过程 大致分为4个阶段吧: 语法分析(sql_parse.cc<词法分析, 语法分析, 语义检查 >) >>sql_resolver.cc # JOIN.p ...

  8. UVa 1593 (水题 STL) Alignment of Code

    话说STL的I/O流用的还真不多,就着这道题熟练一下. 用了两个新函数: cout << std::setw(width[j]);    这个是设置输出宽度的,但是默认是在右侧补充空格 所 ...

  9. UVA 1484 - Alice and Bob&#39;s Trip(树形DP)

    题目链接:1484 - Alice and Bob's Trip 题意:BOB和ALICE这对狗男女在一颗树上走,BOB先走,BOB要尽量使得总路径权和大,ALICE要小,可是有个条件,就是路径权值总 ...

随机推荐

  1. 使用spring框架中的组件发送邮件

    首先进入自己的QQ邮箱,在设置中修改账户信息 然后来至底部  点击开启,再用手机发送对应信息到指定号码,然后点击我已发送  获取授权码  注意提示: 到这里,相信你已经开通了SMTP服务,这样就可以在 ...

  2. DataProtection Key的选择

    代码位于: Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver.cs private IKey FindDefau ...

  3. SQL Server 2008 R2 企业版 MSDN原版

    经网友建议,提供常用试验用资源.以下软件或系统仅为完成本博客内的各种实验而提供下载. 所有软件.系统均为该软件发布方提供的原版文件,未经任何修改.破解等操作.使用目的仅限于学习.测试及实验,符合国家相 ...

  4. (原创)遗传算法C++实现

    本文没有对遗传算法的原理做过多的解释 基础知识可以参考下面的博客:http://blog.csdn.net/u010451580/article/details/51178225 本实验用到的变异用到 ...

  5. Java实现邮箱发送验证码

    第一步,导入JAR包,JAR包下载地址[http://pan.baidu.com/s/1kVRvGyF] 正式代码: 首先书写一个工具类: MailUtil import javax.mail.*; ...

  6. Maven仓库-Nexus环境搭建及简单介绍

    1.    环境搭建 1.1  下载 http://www.sonatype.org/nexus/ NEXUS OSS [OSS = Open Source Software,开源软件——免费] NE ...

  7. JSON Web Tokens(JWT)

    现在API越来越流行,如何安全保护这些API? JSON Web Tokens(JWT)能提供基于JSON格式的安全认证.它有以下特点: JWT是跨不同语言的,JWT可以在 .NET, Python, ...

  8. C#设计模式之十五命令模式(Command Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第二个模式,该模式是[命令模式],又称为行动(Action)模式或交易(Transaction)模式,英文名称是:Command P ...

  9. java.lang.Collections

    java.lang.Collections 此类完全由在collection上进行操作或返回 collection 的静态方法组成.也就是说Collections提供了对Collection集合操作的 ...

  10. Android WebView 上传各种文件(包括拍照 录像 录音 文件 音乐 等,用到图片或拍照的,可以参考下)

    我也是从网上扒下来的,经过多次实验,找到了个好用的.网上能搜到最多的也就是这个解决方案,我英文不好,也没仔细研究,但大多数都是出自这: http://stackoverflow.com/questio ...