》》点击进入原题测试《《

思路:好像是第一次这么印象深刻的写线段树,说实话,这个题确实很有意思,值得学习。

看了大神讲解视频,但是自己写的还是超时了。

参考来自 https://blog.csdn.net/yiqzq/article/details/81211652 个人认为可以作为模板

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <set>
#include <cctype>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define MOD 1e9+7
#define PI acos(-1)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + ; int n, q;
int MIN[maxn << ];//记录区间最小值
int lazy[maxn << ];//延迟标记减法
int ans[maxn << ];//记录答案数量
int b[maxn << ];//记录b数组 //线段树基本操作,pushup和pushdown
void pushup(int rt) {
MIN[rt] = min(MIN[rt << ], MIN[rt << | ]);
ans[rt] = ans[rt << ] + ans[rt << | ];
} void pushdown(int rt) {
if(lazy[rt]) {
lazy[rt << ] += lazy[rt];
lazy[rt << | ] += lazy[rt];
MIN[rt << ] -= lazy[rt];
MIN[rt << | ] -= lazy[rt];
lazy[rt] = ;
}
}
//建树
void build(int l, int r, int rt) {
lazy[rt] = ;
ans[rt] = ;
if(l == r) {
scanf("%d", &b[rt]);
MIN[rt] = b[rt];
return ;
}
int m = (l + r) >> ;
build(lson);
build(rson);
pushup(rt);
}
//区间更新,需要注意当NIN减为0的时候,要ans++并且重新将b的值赋给MIN
void updata(int L, int R, int l, int r, int rt) {
if(L <= l && R >= r) {
MIN[rt]--;
if(MIN[rt]) {
lazy[rt]++;
return;
} else {
if(l == r) {
ans[rt]++;
MIN[rt] = b[rt];
return;
/*血的教训,这个return不能放大括号外面,因为如果递归到某个节点MIN是0
但是又不是叶子节点,那么还是需要继续递归直到找到叶子节点为止
*/
} }
}
pushdown(rt);
int m = (l + r) >> ;
if(L <= m) updata(L, R, lson);
if(R > m) updata(L, R, rson);
pushup(rt);
}
//查询
int query(int L, int R, int l, int r, int rt) {
if(L <= l && R >= r) {
return ans[rt];
}
pushdown(rt);
int m = (l + r) >> ;
int sum = ;
if(m >= L) sum += query(L, R, lson);
if(m < R) sum += query(L, R, rson);
return sum;
}
int main() {
while(~scanf("%d%d", &n, &q)) {
build(, n, );
for(int i = ; i <= q; i++) {
char op[];
int a, b;
scanf("%s%d%d", op, &a, &b);
if(op[] == 'q') {
printf("%d\n", query(a, b, , n, ));
} else {
updata(a, b, , n, );
}
}
}
return ;
}

复制来的代码

#include<queue>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn = 1e5 + ; int add[maxn << ];
int tree[maxn << ];
int MAX[maxn << ];
int a[maxn]; void build(int l, int r,int rt)
{ add[rt] = ;
MAX[rt] = (int)-1e9;
tree[rt] = ; if (l == r){
add[rt] = ;
tree[rt] = ;
MAX[rt] = -a[l];
return;
}
int m = (l + r) >> ;
build(lson);
build(rson);
tree[rt] = tree[rt << ] + tree[rt << | ];
MAX[rt] = max(MAX[rt << ], MAX[rt << | ]);
}
void PushDown(int rt)
{
if (add[rt]){
add[rt << ] += add[rt];
add[rt << | ] += add[rt];
MAX[rt << ] += add[rt];
MAX[rt << | ] += add[rt];
add[rt] = ;
}
}
void update1(int L, int R, int l, int r, int rt)
{
if (L <= l&&r <= R){
add[rt]++;
MAX[rt]++;
return;
}
PushDown(rt);
int m = (l + r) >> ;
if (L <= m)update1(L, R, lson);
if (R > m)update1(L, R, rson);
tree[rt] = tree[rt << ] + tree[rt << | ];
MAX[rt] = max(MAX[rt << ], MAX[rt << | ]);
}
void update2(int L, int R, int l, int r, int rt)
{
if (l == r){ if (MAX[rt] >= ){ tree[rt]++;
MAX[rt] = -a[l];
}
return;
}
PushDown(rt);
int m = (l + r) >> ;
if (L <= m&&MAX[rt << ] >= )update2(L, R, lson);
if (R > m&&MAX[rt << | ] >= )update2(L, R, rson);
tree[rt] = tree[rt << ] + tree[rt << | ];
MAX[rt] = max(MAX[rt << ], MAX[rt << | ]);
}
int query(int L, int R, int l, int r, int rt)
{
if (L <= l&&r <= R){
return tree[rt];
}
int m = (l + r) >> , ans = ;
if (L <= m)ans += query(L, R, lson);
if (R > m)ans += query(L, R, rson);
return ans;
}
void Print(int l, int r, int rt)
{
if (l == r){
cout << rt << " = " << MAX[rt] << endl;
return;
}
cout << rt << " = " << MAX[rt] << endl;
int m = (l + r) >> ;
if (l <= m)Print(lson);
if (r > m)Print(rson);
}
int main()
{
std::ios::sync_with_stdio(false);
int n, q;
while (cin >> n >> q){
for (int i = ; i <= n; i++)
cin >> a[i]; build(, n, ); string flag; int l, r;
for (int i = ; i < q; i++){
cin >> flag >> l >> r; if (flag == "add"){
update1(l, r, , n, );
update2(l, r, , n, );
//Print(1, n, 1);
}
else cout << query(l, r, , n, ) << endl;
}
} return ;
}

多校1007 Naive Operations的更多相关文章

  1. 2018 杭电多校2 - Naive Operations

    题目链接 Problem Description In a galaxy far, far away, there are two integer sequence a and b of length ...

  2. HDU6315 Naive Operations(多校第二场1007)(线段树)

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  3. hdu 6315 Naive Operations (2018 Multi-University Training Contest 2 1007)

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  4. HDU 多校对抗 F Naive Operations

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  5. 杭电多校第二场 hdu 6315 Naive Operations 线段树变形

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  6. HDU 6351 Naive Operations(线段树)

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=6315 Naive Operations Time Limit: 6000/3000 MS (Java/O ...

  7. hdu Naive Operations 线段树

    题目大意 题目链接Naive Operations 题目大意: 区间加1(在a数组中) 区间求ai/bi的和 ai初值全部为0,bi给出,且为n的排列,多组数据(<=5),n,q<=1e5 ...

  8. HDU-6315:Naive Operations(线段树+思维)

    链接:HDU-6315:Naive Operations 题意: In a galaxy far, far away, there are two integer sequence a and b o ...

  9. HDU 6315: Naive Operations

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

随机推荐

  1. 杂项-Java:JSP

    ylbtech-杂项-Java:JSP 1.返回顶部 1. JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Micros ...

  2. U74201 旅行计划 树上找链长度

    题目背景 珂朵莉放假了,她打算去唐山旅行. 题目描述 我们简单地把唐山的共 nn 个景点看成是一棵树,有 n-1n−1 条边将它们连接起来,每个景点有一个游览指数 v_ivi​.珂朵莉的假期时间不长, ...

  3. cisco secure ACS服务器搭建

    网上下载Cisco Secure Access Control System 5.2.iso的镜像,总共有两部分 http://pan.baidu.com/disk/home#path=%252FCi ...

  4. Spark 2.2.0 分布式集群环境搭建

    集群机器: 1台 装了 ubuntu 14.04的 台式机 1台 装了ubuntu 16.04 的 笔记本     (机器更多时同样适用) 1.需要安装好Hadoop分布式环境 参照:Hadoop分类 ...

  5. Java properties配置文件

    Java中的配置文件常为properties文件,格式为文本文件,文件内容的格式是“键=值”格式.注释信息使用“#”来注释. Properties类的常用方法 String getProperty(S ...

  6. bzoj 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路【Floyd】

    弗洛伊德之后按序列加起来即可 #include<iostream> #include<cstdio> #include<algorithm> using names ...

  7. Linux文件详解

    一.Linux文件类型分:普通文件.目录文件.链接文件.设备文件.管道文件. 1.普通文件:由ls -al显示属性时,第一个属性为 [-],例如 [-rwxrwxrwx].包括: 纯文本文件(ASCI ...

  8. C#中接受一个非字符串的输入

    接受来自用户的值 System 命名空间中的 Console 类提供了一个函数 ReadLine(),用于接收来自用户的输入,并把它存储到一个变量中. 例如: int num; num = Conve ...

  9. CircuitBreaker design pattern---reference

    It's common for software systems to make remote calls to software running in different processes, pr ...

  10. (三)Mybatis总结之动态sql

    动态sql 为何需要动态sql?因为简单的sql语句已经不能满足复杂的业务需求 动态sql相当于sql语句拼接 1.if语句 if语句:判断,如果执行多条件查询,如果中间某个条件变量为空,就跳过当前判 ...