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

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

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

参考来自 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. bzoj4443

    二分+二分图匹配 晚上脑子不太好使... 行列模型,填充数量性质,种种迹象告诉我们这是二分图,但是我觉得好像不太科学就弃了网络流... 二分第k大值,转化为求第n-k+1小值,二分求匹配判定即可. # ...

  2. 在WIN7里IE8的开发人员工具打不开的解决办法

    IE8新增了开发人员工具,非常不错,比早期的DevToolbar好用多了.不过在我的Win7下使用的时候偶尔会出现一个莫名其妙的问题,就是整个开发人员工具窗口消失了,打不开了.当你使用win+Tab切 ...

  3. 查看mysql数据库的所有配置信息和服务器的各种状态

    查看MySQL服务器配置信息 mysql> show variables; 2, 查看MySQL服务器运行的各种状态值 mysql> show global status;

  4. taro.js & dva 脚手架搭建及常见问题

    ## taro.js & dva 脚手架 ### 启动 npm install -g @tarojs/cli // 全局安装taro-cli npm i npm run dev:weapp / ...

  5. 牛客练习赛17-A-长方体

    题目描述 给出共享长方体一个顶点的三个面的面积,求它十二条边的边长和. 输入描述: 一行三个整数a, b, c表示面积(1 <= a, b, c <= 10000). 输出描述: 一行一个 ...

  6. ASP.NET 简介(转自Wiki)

    ASP.NET是由微软在.NET Framework框架中所提供,开发Web应用程序的类库,封装在System.Web.dll文件中,显露出System.Web名字空间,并提供ASP.NET网页处理. ...

  7. Cesium加载影像

    注意:使用自定义数据源时,Cesium.Viewer类参数必须设置为 baseLayerPicker:false A. 使用天地图数据源 //天地图var provider=new Cesium.We ...

  8. C:\Windows\System32\drivers\etc\hosts文件显示

     attrib -s -h C:\Windows\System32\drivers\etc\hosts 

  9. 《CSS世界》学习笔记(一)

    <CSS世界>,张鑫旭著,人民邮电出版社,2017年12月第一版. 1.P9二维码链接文章的demo值得一看,可以实现有关“某些区域颜色始终保持一致”的效果. P9二维码所链接文章的一个d ...

  10. mongo 3.4分片集群系列之六:详解配置数据库

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...