洛谷-P2801 教主的魔法 分块

题目

题目链接

题意

  • 修改:将一个区间内所有的数+C。
  • 查询:查询一个区间内>C的数字有多少个。

题解

很经典的分快算法题目。
将数列分块以后,对块内的元素进行排序。

  • 当我们要做修改操作的时候:遇到要修改的完整的块的时候,我们给它在addmark数组的相应的位置+C,标记为我对整个区间做了一个修改操作,有点类似于带lazy标记的线段树的操作。当要修改的部分区间不是完整的块的时候,我们检查这部分区间所在的块的addmark有没有被标记,如果有就对这个块整个进行更新操作,然后把addmark清零,并且暴力把这部分区间的元素+C。时间复杂度为O(n+nlogn))O(n+n∗logn))
  • 当我们遇到查询操作的时候:当我们要查询的部分区间不属于完整的块的时候,如果块的addmark被标记过了,那么更新这个块,然后再暴力查询这个“部分区间”。当我们要查询的区间属于完整的块的时候,由于这个区间是有序的,我们只需要使用二分搜索结合addmark,就可以确定出该块内>C的元素有多少个。时间复杂度O(n+nlogn))O(n+n∗logn))

因此总的时间复杂度就是:O((n+nlogn)m)O((n+n∗logn)∗m)

代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
#define pr(x) cout<<#x<<":"<<x<<endl
int Base = 1000;
ll a[1000007],addmark[1007],C;
int n,q,L,R;
char op;
vector<ll> vec[1007];inline void read(ll &x){scanf("%lld",&x);
}inline void read(int &x){scanf("%d",&x);
}inline void read(char &c){scanf(" %c",&c);
}void work(int bl){if(addmark[bl]){for(int t = bl*Base;t < (bl+1)*Base && t < n;++t){a[t] += addmark[bl];}for(auto &i : vec[bl]){i += addmark[bl];}addmark[bl] = 0;}
}void buildvec(int bl){vec[bl].clear();for(int t = bl*Base;t < (bl+1)*Base && t < n;++t){vec[bl].push_back(a[t]);}sort(vec[bl].begin(),vec[bl].end());
}int main(){scanf("%d%d",&n,&q);for(int i = 0;i < n;++i){int bl = i/Base;read(a[i]);vec[bl].push_back(a[i]);if((i+1)%Base == 0 || i == n-1){sort(vec[bl].begin(),vec[bl].end());}}for(int i = 0;i < q;++i){read(op);read(L);read(R);read(C);L--;R--;ll rep = 0;if(op == 'A'){if(L % Base != 0 && addmark[L/Base]) {work(L / Base);}if((R+1)%Base != 0 && addmark[R/Base]){work(R / Base);}int ans = 0;for(;L <= R && L % Base != 0;L++){ans += a[L] >= C;}for(;L <= R && (R+1)%Base != 0;R--){ans += a[R] >= C;}if(L > R){printf("%d\n",ans);continue;}int bl = L / Base;int br = R / Base;for(;bl <= br;++bl){auto loc = lower_bound(vec[bl].begin(),vec[bl].end(),C-addmark[bl]);int ad = vec[bl].size() - (loc - vec[bl].begin());ans += max(0,ad);}printf("%d\n",ans);}else{int bl,br;if(L % Base != 0){work(L / Base);bl = L / Base;for(;L <= R && L % Base != 0;++L){a[L] += C;//pr(L);//pr(a[L]);}buildvec(bl);}if((R+1) % Base != 0){work(R / Base);br = R / Base;for(;L <= R && (R+1) % Base != 0;--R)a[R] += C;buildvec(br);}if(L < R){bl = L / Base;br = R / Base;for(;bl <= br;++bl){addmark[bl] += C;}}}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【枚举】数列(jzoj 1507)

数列 题目大意&#xff1a;给出一个等差数列的初始值和差值还有一个等比数列的处值和比值&#xff0c;问不大于n的数中&#xff0c;问这两个序列中&#xff0c;有多少个数小于n&#xff08;只要在一个序列中就行了&#xff0c;在两个序列中只记一次&#xff09; 样例输入 1 …

AT4352-[ARC101C] Ribbons on Tree【dp,容斥】

正题 题目链接: https://www.luogu.com.cn/problem/AT4352 https://atcoder.jp/contests/arc101/tasks/arc101_c 题目大意 nnn个点之间两两配对&#xff0c;要求配对点之间的路径覆盖整棵树&#xff0c;求方案数 解题思路 考虑容斥&#xff0c;我们钦定有lll条边没有路径覆盖…

洛谷-P3203 弹飞绵羊 分块

题目 题目链接 题意 据说这道题要用一道叫做LCT的数据结构&#xff0c;然而我不会。。。 一排有n个弹簧装置&#xff0c;从第ii个可一往后跳k[i]" role="presentation" style="position: relative;">k[i]k[i]步。 修改&#xff1a;修改某个位…

【模拟】蚂蚁(jzoj 1508)

蚂蚁 题目大意&#xff1a; 有n只蚂蚁&#xff0c;他们各往一个方向走&#xff08;上北&#xff0c;下南&#xff0c;左西和有东四个方向&#xff09;&#xff0c;他们如果撞到一起就会直接消失&#xff0c;每个单位时间走一格&#xff0c;但有一种情况&#xff1a;两只蚂蚁相…

P3302-[SDOI2013]森林【主席树,LCA,启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/P3302 题目大意 nnn个点的一个森林&#xff0c;要求支持以下操作 连接两个不连通的点询问两个点之间最短路径上第kkk大的数 解题思路 需要支持查询第kkk大&#xff0c;是必定使用主席树的&#xff0c;所以考虑如何合并两棵树…

codeforces gym-101741 Cover the Paths LCA、离线询问

题目 题目链接 题意 给出一棵树。 给出一堆路径&#xff0c;找出最少一个最少的点的集合&#xff0c;使得所有的路径都经过集合中的至少一个点。 题解 考虑一个路径的两个端点&#xff0c;从下往上最后一个能被经过的点就是这两点的LCA。 因此我们做整棵树dfs&#xff0…

【结论】单元格(jzoj 1509)

单元格 题目大意&#xff1a; 在一个RC的矩形中选三个点&#xff0c;使他们行列各不同&#xff0c;定义“费用”为&#xff0c;这三个点之间的行列的差值的和&#xff08;1,2和3,4费用是差值是&#xff08;3-1&#xff09;&#xff08;4-2&#xff09;224&#xff09;&#x…

nssl1487-图

正题 题目大意 nnn个点nnn条边的图&#xff0c;每条边的边权为两个连接节点的权值和&#xff0c;给出所有边权&#xff0c;求每个节点权值&#xff08;保证唯一的环为奇环&#xff09; 解题思路 首先并查集找到环上相邻的两个点&#xff0c;然后可以发现这两个点之间有两个关系…

codeforces gym-101741 Subsequence Sum Queries 分治+离线

题目 这里写链接内容 题意 给出一个最长为200000200000数列 给出一堆最多为200000200000个询问区间&#xff0c;问从这些区间中取出一些数使得数字之和是m的倍数&#xff0c;有多少种方案。其中保证1≤m≤201≤m≤20。 题解 最容易想到的方法就是倍增dp来做。 定义f[i][…

【DP】剪草(jzoj 1510)

剪草 题目大意&#xff1a; 有n棵小草&#xff0c;B某看它们很不顺眼&#xff0c;想让他们的高度总和不大于H&#xff0c;它们一开始各有一个高度&#xff0c;然后它们各有一个固定的生长值&#xff0c;B某每个单位时间可以将一棵草减掉&#xff08;让他的高度变为0&#xff…

nssl1488-上升子序列【贪心,dp】

正题 题目大意 长度为nnn的序列&#xff0c;分割成两个上升子序列要求长度差最小 解题思路 我们对于i<j,ai≥aji<j,a_i\geq a_ji<j,ai​≥aj​的点之间连边&#xff0c;然后可以对于一个联通块进行二分图染色&#xff0c;我们可以发现&#xff0c;如果我们先固定一个…

经典题:poj2104-区间第k小 整体二分学习

写在前面 区间第k小 可以说是一个很经典的数据结构题了&#xff0c;这道题有很多种解法比如莫队离线、主席树、整体二分等等。 之前用莫队和主席树写过这道题&#xff0c;今天来学习一个以前不会的算法——整体二分。 因为最近遇到一个类似于整体二分的题目&#xff0c;就是…

2019.01.28【NOIP普及组】模拟赛C组总结

总结 这次比赛的得分是&#xff1a;100000100&#xff08;rank 5&#xff09; 这次第一题打了一会&#xff0c;又想到会超时就想了另一个不会超时的方法&#xff0c;就A了&#xff0c;第二题用了一种十分智障的方法&#xff0c;但定义了一个int结构的time&#xff0c;哪知不可…

nssl1489-大冰隙2【树链剖分,线段树】

正题 题目大意 nnn只叫龙&#xff0c;mmm个操作。每只叫龙有种类(0/1)(0/1)(0/1)和攻击力。 修改某只叫龙的攻击力取出l∼rl\sim rl∼r只叫龙&#xff0c;然后将连续的种类为010101的叫龙消灭只到没有连续的010101为止&#xff0c;求剩下的叫龙中攻击力最高是多少 解题思路 初…

【对数】YY(jzoj 1438)

YY 题目大意&#xff1a; 给出一个超大正整数S&#xff0c;求出nn{n}^{n}nnS中n的解 样例输入 387420489 样例输出 9 数据范围限制 S的位数小于500000 解题思路&#xff1a; 看到数据&#xff0c;爆搜是不可能的&#xff0c;我们用数字的位数来做&#xff0c;我们用一…

codeforces gym-101741 Elevator 动态规划、单调队列

题目 这里写链接内容 题解 注意&#xff1a;题目给出是按照时间给出的顺序。 我们考虑第ii个人要上的楼高h[i]" role="presentation" style="position: relative;">h[i]h[i]&#xff0c;排在第ii个人前面的,所有要人上的楼高度&#x2264;h[…

P5952-[POI2018]水箱【最小生成树】

正题 题目链接:https://www.luogu.com.cn/problem/P5952 题目大意 n∗mn*mn∗m个格子&#xff0c;最外层有无限高的墙&#xff0c;然后每个格子之间有一睹给定高度的墙&#xff0c;然后求有多少种不同的水位情况。 解题思路 首先我们如果将墙看成边&#xff0c;那么会造成影响…

【枚举】LAGNO(jzoj 1149)

LAGNO 题目大意&#xff1a; 给你一个88的矩阵&#xff0c;里面有黑棋&#xff08;B&#xff09;&#xff0c;白棋&#xff08;W&#xff09;&#xff0c;还有一些格子没棋子&#xff08;.&#xff09;&#xff0c;当两个黑棋在同一条直线上&#xff0c;并且他们之间全是白棋…

HDU5833 异或方程组的初步学习

题目 题目链接 题解 选出来的数相乘要能组成一个完全平方数&#xff0c;则这个完全平方数进行素数分解以后&#xff0c;相同的素因子的个数是偶数个。 基于这个结论&#xff0c;我们对与每一个候选数a[i]a[i]进行质因数分解&#xff08;最多有303个不同的质因子&#xff09…

codeforces 962E Byteland, Berland and Disputed Cities 最小生成树变形

题目 题目链接 题意 在OxOx轴上有一堆点&#xff0c;这些点有三种类型R、B、PR、B、P型&#xff0c;现在要求添加一些线段把这些点连起来&#xff0c;使得如果去掉RR类型点,剩下的点都是联通的。如果去掉B" role="presentation" style="position: rela…