种西瓜

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

现在郭小冉决定在瓜场种m年西瓜。
首先他有n块西瓜地。
第i块西瓜地每年可以将会生产出b(i)颗西瓜。
每一年ta都会回到西瓜地。
每一年ta有两种操作,一种是选择一段连续的土地查询它们这些年的产量总和。
另外一种是选择一段连续的土地,并把它们的每一块的年产量都增加1.

Input

每组输入包含多组测试数据
对于每组测试数据
第一行包含西瓜地的块数n。
第二行包含n块西瓜地的年产量。
第三行包含m 代表接下来的年数。
每一年都会有一个操作
查询格式如下:
查询产量 Q s t (1<=s,t<=n)
增加年产量 I s t (1<=s,t<=n)
只有在查询的时候进行输出。

1<=n<=100000

1<=m<=100000

1<=b(i)<=100000

Output

对于每组测试,输出一行由空格隔开的整数(个数为输入中查询Q的个数)

Sample Input

4
1 1 1 1
3
Q 1 3
Q 1 4
Q 2 4
4
1 2 3 4
3
Q 1 4
I 1 3
Q 2 4

Sample Output

3 8 9
10 29

西安赛的时候根本没开这道题。。。

算是一道思维题。 你要查询的这个结果 就是 (b[i] + 增量)*当前年份 - 所有增量的对应的年份和。

显然,如果我们要知道每个增量是在第几年出现的,太麻烦了。

所以用了两个线段树,一个维护 (b[i] + 增量)          一个维护年份和。

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define ll long long
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define ms(x) memset(x, 0,sizeof(x))
const int MAXN = 100005;
const int INF = 0x3f3f3f3f;
ll add1[MAXN], add2[MAXN];
ll sum1[MAXN], sum2[MAXN];inline void Scan(int &x) {char c;while((c=getchar())<'0' || c>'9');x=c-'0';while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0';
}
inline void Scanll(ll &x) {char c;while((c=getchar())<'0' || c>'9');x=c-'0';while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0';
}
void PushUp1(int rt) {sum1[rt] = sum1[rt<<1] + sum1[rt<<1|1];
}
void PushUp2(int rt) {sum2[rt] = sum2[rt<<1] + sum2[rt<<1|1];
}
void PushDown1(int rt, int m) {if(add1[rt]) {add1[rt<<1] += add1[rt];add1[rt<<1|1] += add1[rt];sum1[rt<<1] += add1[rt]*(m - (m>>1));sum1[rt<<1|1] += add1[rt]*(m>>1);add1[rt] = 0;}
}
void PushDown2(int rt, int m) {if(add2[rt]) {add2[rt<<1] += add2[rt];add2[rt<<1|1] += add2[rt];sum2[rt<<1] += add2[rt]*(m - (m>>1));sum2[rt<<1|1] += add2[rt]*(m>>1);add2[rt] = 0;}
}
void build1(int l, int r, int rt) {add1[rt] = 0;if(l == r) {
//        scanf("%lld",&sum1[rt]);Scanll(sum1[rt]);return ;}int m = (l+r)>>1;build1(lson);build1(rson);PushUp1(rt);
}
void build2(int l, int r, int rt) {add2[rt] = 0;if(l == r) {sum2[rt] = 0;return ;}int m = (l+r)>>1;build2(lson);build2(rson);PushUp2(rt);
}
void update1(int L, int R, int c, int l, int r, int rt) {if(L<=l && r<=R) {add1[rt] +=c;sum1[rt] += (ll)c*(r-l+1);return ;}PushDown1(rt, r-l+1);int m = (l+r)>>1;if(L<=m) update1(L,R,c,lson);if(m<R) update1(L,R,c,rson);PushUp1(rt);
}
void update2(int L, int R, int c, int l, int r, int rt) {if(L<=l && r<=R) {add2[rt] +=c;sum2[rt] += (ll)c*(r-l+1);return ;}PushDown2(rt, r-l+1);int m = (l+r)>>1;if(L<=m) update2(L,R,c,lson);if(m<R) update2(L,R,c,rson);PushUp2(rt);
}
ll query1(int L, int R, int l, int r, int rt) {if(L<=l && r<=R) {return sum1[rt];}PushDown1(rt, r-l+1);int m = (l+r)>>1;ll ret = 0;if(L<=m) ret+=query1(L,R, lson);if(m<R) ret+=query1(L,R,rson);return ret;
}
ll query2(int L, int R, int l, int r, int rt) {if(L<=l && r<=R) {return sum2[rt];}PushDown2(rt, r-l+1);int m = (l+r)>>1;ll ret = 0;if(L<=m) ret+=query2(L,R, lson);if(m<R) ret+=query2(L,R,rson);return ret;
}
vector<ll>vec;
int main() {int n, m;while(scanf("%d", &n)!=EOF) {build1(1, n, 1);build2(1, n, 1);Scan(m);vec.clear();for(int o=1; o<=m; o++) {int a, b;char ask[2];scanf("%s",ask);Scan(a);Scan(b);if(ask[0] == 'Q') {ll ans = query1(a,b,1,n,1)*o - query2(a,b,1,n,1);
//                printf("1:  %lld\n", query1(a,b,1,n,1));
//                printf("2:  %lld\n", query2(a,b,1,n,1));vec.push_back(ans);} else if(ask[0] == 'I') {update1(a,b,1,1,n,1);update2(a,b,o,1,n,1);}}for(int i=0;i<vec.size();i++){if(i) printf(" ");printf("%lld",vec[i]);}printf("\n");}return 0;
}

sdut4259种西瓜 [原题: 2018西安邀请赛K题]【线段树】相关推荐

  1. sdut 4295 种西瓜 (2018西安邀请赛K)【线段树】

    种西瓜 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 现在郭小冉决定在瓜场种m年西瓜. 首先他有n块西瓜地. 第i块西 ...

  2. 2018陕西省赛K题[watermelon_planting]

    题意:有一个序列a[],描述的是另一个序列ans[]每个位置单位时间的增量.每个单位时间每个位置都会增加一个单位对应增量.时间总长m,每个单位时间包含有两种操作中的一个:1.询问ans[]在[l,r] ...

  3. 美味佳肴【可持久化线段树】【“纽劢科技杯”第十六届同济大学程序设计竞赛暨上海邀请赛.K题】

    题目链接 题目描述 众所周知,天才程序员菜哭武是一个伟大的厨师.这天,张老师和石头来到菜哭武家做客,想尝一尝菜哭武的手艺. 菜哭武手上有n种食材,每种食材个数无限多,编号为i的食材有一个美味度ai.一 ...

  4. 刷题总结——影魔(HNOI2017 BZOJ4826 线段树+扫描线)

    题目: Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄 ...

  5. 牛客练习赛85 数学家的迷题 (带修莫队/线段树)

    题意: 1:将a[id]a[id]a[id]的值改为xxx. 2:令t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a ...

  6. 2018 湘潭邀请赛 K.2018

    K. 2018 2018 的约数只有 4 个,可以算出区间内和 2018 的最⼤公约数是 1, 2, 1009, 2018 的各有⼏个,之后 4 × 4 枚举统计答案. #include <io ...

  7. 2019ICPC西安邀请赛 E. Tree(树剖 + 线段树)

    Tree 给定一棵树,节点有点权,然后有三种操作: 一.修改1−>s1->s1−>s的路径上的点权与ttt进行按位或. 二.修改1−>s1->s1−>s的路径上的点 ...

  8. 2015 UESTC 数据结构专题A题 秋实大哥与小朋友 线段树 区间更新,单点查询,离散化...

    秋实大哥与小朋友 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Desc ...

  9. poj 2352 Stars 线段树(先建后查/边建边查)/树状数组三种方法思路详解,带你深入了解线段树难度⭐⭐⭐★

    poj 2352 Stars 目录 poj 2352 Stars 1.树状数组 2.线段树,先建树后查找 3.线段树,边建树边查找 Description Astronomers often exam ...

最新文章

  1. 清华大学朱军:发展安全可靠的AI,为什么依旧任重道远?
  2. 索尼:声控将在VR中发挥大作用
  3. panda.read_csv的常用参数说明
  4. 如何用Java做玫瑰花数_c语言如何输出玫瑰花数?(代码示例)
  5. android 广播观察者,BroadcastReceiver和Activity之间的通信 – android
  6. C语言程序的错误和警告
  7. 产品经理必读:用户场景分析的四要素
  8. S5PV210裸机之GPIO
  9. git pull使用【转】
  10. 【11】MINST数据集的分类与效果验证
  11. 关于Pytorch中detach
  12. android 5 投射屏幕,从手机投射屏幕到电视的5种方法
  13. qq公众号消息是发送到自己服务器,qq公众号屏蔽后还发消息 qq消息被屏蔽了怎么办...
  14. OpenStack-M版(Mitaka)搭建基于(Centos7.2)+++十、Openstack对象存储服务(swift)中
  15. 数据压缩读书笔记——线性代数的几何意义(五)
  16. 较为简洁明了的KMP算法解释
  17. Date,LocalDateTime类型,获取今年开始时间,获取去年的今天。
  18. 电脑应用程序错误:提示0xc000009错误怎么办?
  19. 新网银木马BankJp详细分析与清除
  20. 微信小程序构建商城百度云_构建云存储应用程序

热门文章

  1. 什么是C++虚函数、虚函数的作用和使用方法
  2. 使用C++制作一个蓝屏程序
  3. iOS中常用的几种锁
  4. 披荆斩棘、共赴未来-2020总结及2021年计划
  5. 普通话成绩查询全国计算机,国家普通话水平测试成绩查询系统
  6. 分词并显示词性jieba.posseg.cut()
  7. 中国电工PI薄膜市场市场需求现状与投资前景展望报告2022-2028年
  8. 舌尖上的硬件: 厨房中探秘图形渲染
  9. [No000061]别人凭什么要帮你?理解中国人的人际和谐外人、自己人与另一半...
  10. 虚拟机安装CentOS 7以及解决图形化界面问题