好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> using namespace std; #define R register int #define ull unsigned long long #define ll long long #define pause (for(R i=1;i<=10000000000;++i)) #define…
BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组 Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000. Input 第一行两个整数,S,W;其中S为矩阵初始值;W为矩阵大小 接下来每行为一下三种输入之一(不包含引号): "1 x y a" "2 x1…
#include <cstdio> #include <algorithm> #include <cstring> #include <cctype> using namespace std; template<class T>inline void read(T &num) { char ch; int flag=1; while(!isdigit(ch=getchar()))if(ch=='-')flag=-flag; for(num…
P5057 [CQOI2006]简单题 题目描述 有一个 n 个元素的数组,每个元素初始均为 0.有 m 条指令,要么让其中一段连续序列数字反转--0 变 1,1 变 0(操作 1),要么询问某个元素的值(操作 2). 例如当 n = 20 时,10 条指令如下: 输入格式 第一行包含两个整数 n, m,表示数组的长度和指令的条数: 以下 m 行,每行的第一个数 t 表示操作的种类: 若 t = 1,则接下来有两个数 L, R,表示区间 [L, R] 的每个数均反转: 若 t = 2,则接下来只…
这题目很有意思,让我学会了树状数组的差分,更加深刻理解了树状数组 树状数组的差分写法 void add(int x,int k) { for (int i = x;i <= n;i += lowbit(i)) c[i] += k; } int sum(int x) { ; ;i -= lowbit(i)) ans += c[i]; return ans; } { add(l,x); add(r+,-x); int zhi=sum(l)//就是a[l]的数值,前缀和. } 题意: 很简单,输入n…
Description 前缀和(prefix sum)\(S_i=\sum_{k=1}^i a_i\). 前前缀和(preprefix sum) 则把\(S_i\)作为原序列再进行前缀和.记再次求得前缀和第i个是\(SS_i\) 给一个长度n的序列\(a_1, a_2, \cdots, a_n\)有两种操作: Modify i x:把\(a_i\)改成\(x\): Query i:查询\(SS_i\) Input 第一行给出两个整数N,M.分别表示序列长度和操作个数 接下来一行有N个数,即给定的…
题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 //瞎敲的emmm 7 1 -2 -1 3 10 2 15//对应得到差分数组. 我们发现从[1,i]求和,得到的就是我们的原数组对应值.(这就是差分. 为什么用差分+树状数组? 对应差分,我们修改一个位置都会对应影响一段区间. 差分的话,我们修改一个位置就达到了修改后面区间的效果. 而我们修改一个区间,只需…
嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到的是异或意义下的差分数组,于是自己便写了一个差分数组,确实好写,但很慢(可能我写的不优),下面是五十分的异或意义下的差分的代码: #include<cstdio> #include<iostream> using namespace std; ], b[]; int main(){ i…
题意:有一个长度为\(n\)的数组,进行\(m\)次操作,每次读入一个值\(t\),如果\(t=1\),则将区间\([l,r]\)的数字反转,若\(t=2\),则查询下标为\(i\)的值. 题解:树状数组的板子题,但是考察到了位运算的知识,我们对区间进行反转的时候,只需要对树状数组\(c[l]\) ^ 1,\(c[r+1]\) ^ \(1\)即可,然后进行单点查询时只须对前缀异或就好了. 代码: int n,m; int a[N]; int op,l,r,x; int lowbit(int x)…
题目大意:有一个长度为$n$的$01$串,两个操作: $1\;l\;r:$把区间$[l,r]$翻转($0->1,1->0$) $2\;p:$求第$p$位是什么 题解:维护前缀异或和,树状数组即可 卡点:无 C++ Code: #include <cstdio> #include <cctype> namespace std { struct istream { #define M (1 << 24 | 3) char buf[M], *ch = buf -…