《线段树学习笔记》 AC代码索引
P3372 【模板】线段树 1 | LibreOJ#132. 树状数组 3 :区间修改,区间查询
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define ls (i<<1) // 左子节点
#define rs (i<<1|1) // 右子节点
#define mid ((l+r)>>1) // 当前区间中部
int tree[1000005<<2],tag[1000005<<2];
int n,m;
int a[1000005];
void pushup(int i){
tree[i]=tree[ls]+tree[rs];
}
void build(int i,int l,int r){
if(l==r){
tree[i]=a[l];
return ;
}
build(ls,l,mid);
build(rs,mid+1,r);
pushup(i);
}
void pushdown(int i,int l,int r){
if(tag[i]){ // 如果有标记
tag[ls]+=tag[i]; // 左节点更新标记
tag[rs]+=tag[i]; // 右节点更新标记
tree[ls]+=(mid-l+1)*tag[i]; // 左节点更新值
tree[rs]+=(r-mid)*tag[i]; // 右节点更新值
tag[i]=0; // 清除当前节点标记
}
}
void update(int i,int l,int r,int x,int y,int k){
if(l>=x&&r<=y){ // 被包含
tree[i]+=(r-l+1)*k; // 修改本身的值
tag[i]+=k; // 打标记
return ;
}
pushdown(i,l,r); // 标记下传
if(mid>=x) update(ls,l,mid,x,y,k);
if(mid<y) update(rs,mid+1,r,x,y,k); // 二分
pushup(i); // 上传
}
int query(int i,int l,int r,int x,int y){
if(l>=x&&r<=y){ // 被包含
return tree[i];
}
pushdown(i,l,r);// 标记下传
int ret=0;
if(mid>=x) ret+=query(ls,l,mid,x,y);
if(mid<y) ret+=query(rs,mid+1,r,x,y);// 二分
return ret;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
int opt,l,r,k;
cin>>opt>>l>>r;
if(opt==1){
cin>>k;
update(1,1,n,l,r,k);
}
else{
cout<<query(1,1,n,l,r)<<'\n';
}
}
return 0;
}
P3374 【模板】树状数组 1 | LibreOJ#130. 树状数组 1 :单点修改,区间查询
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int SIZE = 1e6 + 5;
int t[SIZE << 2], a[SIZE];
int n, m;
void pushup(int i) {
t[i] = t[i << 1] + t[i << 1 | 1];
}
void build(int i, int l, int r) {
if (l == r) {
t[i] = a[l];
return;
}
int mid = (l + r) >> 1;
build(i << 1, l, mid);
build(i << 1 | 1, mid + 1, r);
pushup(i);
}
int query(int ql, int qr, int l, int r, int i) {
if (ql <= l && r <= qr) {
return t[i];
}
int mid = (l + r) >> 1;
int result = 0;
if (ql <= mid) {
result += query(ql, qr, l, mid, i << 1);
}
if (qr > mid) {
result += query(ql, qr, mid + 1, r, i << 1 | 1);
}
return result;
}
void update(int p, int l, int r, int i, int v) {
if (l == r) {
t[i] += v;
return;
}
int mid = (l + r) >> 1;
if (p <= mid) {
update(p, l, mid, i << 1, v);
}
if (p > mid) {
update(p, mid + 1, r, i << 1 | 1, v);
}
pushup(i);
}
signed main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
build(1, 1, n);
while (m--) {
int op, x, y;
cin >> op >> x >> y;
if (op == 1) {
update(x, 1, n, 1, y);
} else {
cout << query(x, y, 1, n, 1) << endl;
}
}
return 0;
}
P1531 I Hate It
#include<bits/stdc++.h>
using namespace std;
const int SIZE = 2e5+5;
int t[SIZE<<2],a[SIZE];
int n,m;
void pushup(int i){
t[i]=max(t[i<<1],t[i<<1|1]);
}
void build(int i,int l,int r){
if(l==r){
t[i]=a[l];
return;
}
int mid=(l+r)>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
pushup(i);
}
int query(int ql,int qr,int l,int r,int i){
if(ql<=l && r <= qr){
return t[i];
}
int mid = (l+r)>>1;
int result = 0;
if(ql <= mid){
result = max(result,query(ql,qr,l,mid,i<<1));
}
if(qr > mid){
result = max(result,query(ql,qr,mid+1,r,i<<1|1));
}
return result;
}
void update(int p,int l,int r,int i,int v){
if(l==r){
if(t[i]<v){
t[i]=v;
}
return;
}
int mid=(l+r)>>1;
if(p <= mid){
update(p,l,mid,i<<1,v);
}
if(p > mid){
update(p,mid+1,r,i<<1|1,v);
}
pushup(i);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
char op;int a,b;
cin>>op>>a>>b;
if(op=='Q'){
cout<<query(a,b,1,n,1)<<endl;
}
else{
update(a,1,n,1,b);
}
}
return 0;
}
P1198 [JSOI2008]最大数 | BZOJ1012 [JSOI2008]最大数maxnumber
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t[800005];
int m,d;
char op;
int x,tt,cnt;
void pushup(int i){
t[i]=max(t[i<<1],t[i<<1|1])%d;
}
void update(int pv,int v,int i,int l,int r){
if(l==r){
t[i]=v;
return;
}
int mid=(l+r)>>1;
if(mid>=pv){
update(pv,v,i<<1,l,mid);
}
if(mid<pv){
update(pv,v,i<<1|1,mid+1,r);
}
pushup(i);
}
int ask(int ql,int qr,int i,int l,int r){
if(ql<=l&&qr>=r){
return t[i];
}
int mid=(l+r)>>1;
int result=LLONG_MIN;
if(ql<=mid){
result=max(result,ask(ql,qr,i<<1,l,mid));
}
if(qr>mid){
result=max(result,ask(ql,qr,i<<1|1,mid+1,r));
}
return result;
}
signed main(){
cin>>m>>d;
for(int i=1;i<=m;i++){
cin>>op>>x;
if(op=='A'){
update(cnt+1,(x+tt)%d,1,1,m);
cnt++;
}
else{
if(x==0)tt=0;
else tt=ask(cnt-x+1,cnt,1,1,m)%d;
cout<<tt<<endl;
}
}
return 0;
}
P2880 [USACO07JAN] Balanced Lineup G
#include <bits/stdc++.h>
using namespace std;
int n, q, a[1000005];
int maxn[1000005 << 2], minn[1000005 << 2];
bool flag = true;
void pushup(int i) {
maxn[i] = max(maxn[i << 1], maxn[i << 1 | 1]);
minn[i] = min(minn[i << 1], minn[i << 1 | 1]);
}
void build(int i, int l, int r) {
if (l == r) {
maxn[i] = minn[i] = a[l];
return;
}
int mid = (l + r) >> 1;
build(i << 1, l, mid);
build(i << 1 | 1, mid + 1, r);
pushup(i);
}
int querymax(int L, int R, int l, int r, int i) {
if (L <= l && r <= R) {
return maxn[i];
}
int mid = (l + r) >> 1;
int result = INT_MIN;
if (L <= mid) {
result = max(result, querymax(L, R, l, mid, i << 1));
}
if (R > mid) {
result = max(result, querymax(L, R, mid + 1, r, i << 1 | 1));
}
return result;
}
int querymin(int L, int R, int l, int r, int i) {
if (L <= l && r <= R) {
return minn[i];
}
int mid = (l + r) >> 1;
int result = INT_MAX;
if (L <= mid) {
result = min(result, querymin(L, R, l, mid, i << 1));
}
if (R > mid) {
result = min(result, querymin(L, R, mid + 1, r, i << 1 | 1));
}
return result;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
build(1, 1, n);
while(q--){
int l,r;
cin>>l>>r;
cout<<querymax(l,r,1,n,1)-querymin(l,r,1,n,1)<<endl;
}
return 0;
}
P4392 [BOI2007]Sound 静音问题
#include <bits/stdc++.h>
using namespace std;
int n, m, c, a[1000005];
int maxn[1000005 << 2], minn[1000005 << 2];
bool flag = true;
void pushup(int i) {
maxn[i] = max(maxn[i << 1], maxn[i << 1 | 1]);
minn[i] = min(minn[i << 1], minn[i << 1 | 1]);
}
void build(int i, int l, int r) {
if (l == r) {
maxn[i] = minn[i] = a[l];
return;
}
int mid = (l + r) >> 1;
build(i << 1, l, mid);
build(i << 1 | 1, mid + 1, r);
pushup(i);
}
int querymax(int L, int R, int l, int r, int i) {
if (L <= l && r <= R) {
return maxn[i];
}
int mid = (l + r) >> 1;
int result = INT_MIN;
if (L <= mid) {
result = max(result, querymax(L, R, l, mid, i << 1));
}
if (R > mid) {
result = max(result, querymax(L, R, mid + 1, r, i << 1 | 1));
}
return result;
}
int querymin(int L, int R, int l, int r, int i) {
if (L <= l && r <= R) {
return minn[i];
}
int mid = (l + r) >> 1;
int result = INT_MAX;
if (L <= mid) {
result = min(result, querymin(L, R, l, mid, i << 1));
}
if (R > mid) {
result = min(result, querymin(L, R, mid + 1, r, i << 1 | 1));
}
return result;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> c;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
build(1, 1, n);
for (int i = 1; i <= n - m + 1; i++) {
//cout<<i<<' '<<querymax(i, i + m - 1, 1, n, 1)<<' '<<querymin(i, i + m - 1, 1, n, 1)<<endl;
if ((querymax(i, i + m - 1, 1, n, 1) - querymin(i, i + m - 1, 1, n, 1)) <= c) {
cout << i << endl;
flag = false;
}
}
if (flag) {
cout << "NONE" << endl;
}
return 0;
}
(原创题)Game 1:人道寄奴曾住
内带数据生成程序
sj
。
#include<bits/stdc++.h>
using namespace std;
const int SIZE = 2e5+5;
int t[SIZE<<2],a[SIZE];
int n,m;
void pushup(int i) {
t[i]=max(t[i<<1],t[i<<1|1]);
}
void build(int i,int l,int r) {
if(l==r) {
t[i]=a[l];
return;
}
int mid=(l+r)>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
pushup(i);
}
int query(int ql,int qr,int l,int r,int i) {
if(ql<=l && r <= qr) {
return t[i];
}
int mid = (l+r)>>1;
int result = 0;
if(ql <= mid) {
result = max(result,query(ql,qr,l,mid,i<<1));
}
if(qr > mid) {
result = max(result,query(ql,qr,mid+1,r,i<<1|1));
}
return result;
}
void update(int p,int l,int r,int i,int v) {
if(l==r) {
if(t[i]<v) {
t[i]=max(t[i],v);
}
return;
}
int mid=(l+r)>>1;
if(p <= mid) {
update(p,l,mid,i<<1,v);
}
if(p > mid) {
update(p,mid+1,r,i<<1|1,v);
}
pushup(i);
}
void solve() {
memset(a,0,sizeof(a));
memset(t,0,sizeof(t));
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
build(1,1,n);
while(m--) {
int opt,a,b;
cin>>opt>>a>>b;
if(opt==2) {
if(b<a)swap(b,a);
cout<<query(a,b,1,n,1)<<endl;
} else {
update(a,1,n,1,b);
}
}
return;
}
int sj() {
srand(time(0));
for(int i=1; i<=49; i++) {
char buff[114],buff2[514];
sprintf(buff,"data/%d.in",i);
sprintf(buff2,"data/%d.out",i);
freopen(buff,"w",stdout);
int n=rand()%(int(1e5))+1,m=rand()%(int(4000))+1;
cout<<n<<' '<<m<<endl;
for(int j=1; j<=n; j++) {
cout<<rand()%(int(1e5))+1<<' ';
}
cout<<endl;
for(int j=1; j<=m; j++) {
int op = rand()%2+1;
int l,r;
if(op==1) {
l=rand()%(int(n))+1;
r=rand()%(int(1e5))+1;
} else {
l=rand()%(int(n))+1;
r=rand()%(int(n))+1;
}
cout<<op<<' '<<l<<' '<<r<<endl;
}
fclose(stdout);
freopen(buff2,"w",stdout);
freopen(buff,"r",stdin);
solve();
fclose(stdin);
fclose(stdout);
}
return 0;
}
int main(){
solve();
}
P1253 [yLOI2018] 扶苏的问题
#include <bits/stdc++.h>
#define ls (i<<1)
#define rs (i<<1|1)
#define mid ((l+r)>>1)
#define int long long
using namespace std;
struct node{
int maxv,add,cov;
node(){
this->cov = LLONG_MIN;
this->add = 0;
}
} t[4000005];
int a[1000005];
int n,q;
inline void pushup(int i){
t[i].maxv=max(t[ls].maxv,t[rs].maxv);
}
void build(int i,int l,int r){
if(l==r){
t[i].maxv=a[l];
}
else{
build(ls,l,mid);
build(rs,mid+1,r);
pushup(i);
}
}
void pushdown(int i){
if(t[i].cov!=LLONG_MIN){
t[ls].maxv=t[rs].maxv=t[ls].cov=t[rs].cov=t[i].cov;
//t[ls].cov+=t[ls].add;
//t[rs].cov+=t[rs].add;
t[ls].add=t[rs].add=0;
t[i].cov=LLONG_MIN;
}
if(t[i].add){
t[ls].add+=t[i].add;
t[rs].add+=t[i].add;
t[ls].maxv+=t[i].add;
t[rs].maxv+=t[i].add;
t[i].add=0;
}
}
void add(int ql,int qr,int v,int i,int l,int r){
if(ql<=l&&r<=qr){
t[i].maxv+=v;
t[i].add+=v;
return;
}
pushdown(i);
if(ql<=mid){
add(ql,qr,v,ls,l,mid);
}
if(mid<qr){
add(ql,qr,v,rs,mid+1,r);
}
pushup(i);
}
void cover(int ql,int qr,int v,int i,int l,int r){
if(ql<=l&&r<=qr){
t[i].maxv=v;
t[i].cov=v;
t[i].add=0;
return;
}
pushdown(i);
if(ql<=mid){
cover(ql,qr,v,ls,l,mid);
}
if(mid<qr){
cover(ql,qr,v,rs,mid+1,r);
}
pushup(i);
}
int query(int ql,int qr,int i,int l,int r){
if(ql<=l&&r<=qr){
return t[i].maxv;
}
pushdown(i);
int result=LLONG_MIN;
if(ql<=mid){
result=max(result,query(ql,qr,ls,l,mid));
}
if(mid<qr){
result=max(result,query(ql,qr,rs,mid+1,r));
}
return result;
}
signed main(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(q--){
int op,l,r,x;
cin>>op;
if(op==2){
cin>>l>>r>>x;
add(l,r,x,1,1,n);
}
if(op==1){
cin>>l>>r>>x;
cover(l,r,x,1,1,n);
}
if(op==3){
cin>>l>>r;
cout<<query(l,r,1,1,n)<<endl;
}
}
return 0;
}
P2023 [AHOI2009] 维护序列 | LibreOJ#10129. 「一本通 4.3 练习 3」维护序列
#include <bits/stdc++.h>
using namespace std;
long long c[500010];
long long p;
struct sgt{
long long sum[2000010];
long long addv[2000010];
long long mulv[2000010];
void build(int o,int l,int r){
addv[o]=0;
mulv[o]=1;
if(l==r)sum[o]=c[l];
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
build(lson,l,mid);
build(rson,mid+1,r);
sum[o]=(sum[lson]+sum[rson])%p;
}
}
void push_down(int o,int l,int r,int mid,int lson,int rson){
mulv[lson]=(mulv[lson]*mulv[o])%p;
mulv[rson]=(mulv[rson]*mulv[o])%p;
addv[lson]=(addv[lson]*mulv[o])%p;
addv[rson]=(addv[rson]*mulv[o])%p;
sum[lson]=(sum[lson]*mulv[o])%p;
sum[rson]=(sum[rson]*mulv[o])%p;
mulv[o]=1;
addv[lson]=(addv[lson]+addv[o])%p;
addv[rson]=(addv[rson]+addv[o])%p;
sum[lson]=(sum[lson]+(mid-l+1)*addv[o])%p;
sum[rson]=(sum[rson]+(r-mid)*addv[o])%p;
addv[o]=0;
}
void addall(int o,int l,int r,int a,int b,int x){
if(l>=a && r<=b){
addv[o]=(addv[o]+x)%p;
sum[o]=(sum[o]+(r-l+1)*x)%p;
return;
}
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
if(mulv[o]!=1 || addv[o])push_down(o,l,r,mid,lson,rson);
if(a<=mid)addall(lson,l,mid,a,b,x);
if(b>mid)addall(rson,mid+1,r,a,b,x);
sum[o]=(sum[lson]+sum[rson])%p;
}
}
void mulall(int o,int l,int r,int a,int b,int x){
if(l>=a && r<=b){
mulv[o]=(mulv[o]*x)%p;
addv[o]=(addv[o]*x)%p;
sum[o]=(sum[o]*x)%p;
return;
}
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
if(mulv[o]!=1 || addv[o])push_down(o,l,r,mid,lson,rson);
if(a<=mid)mulall(lson,l,mid,a,b,x);
if(b>mid)mulall(rson,mid+1,r,a,b,x);
sum[o]=(sum[lson]+sum[rson])%p;
}
}
long long query(int o,int l,int r,int a,int b){
if(l>=a && r<=b)return sum[o]%p;
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
long long ans=0;
if(mulv[o]!=1 || addv[o])push_down(o,l,r,mid,lson,rson);
if(a<=mid)ans+=query(lson,l,mid,a,b);
if(b>mid)ans+=query(rson,mid+1,r,a,b);
return ans%p;
}
}
} tree;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin>>n>>p;
for(int i=1;i<=n;i++){
cin>>c[i];
}
cin>>m;
tree.build(1,1,n);
for(int i=1;i<=m;i++){
int f;
long long x,y,k;
cin>>f;
if(f==1){
cin>>x>>y>>k;
tree.mulall(1,1,n,x,y,k);
}
else if(f==2){
cin>>x>>y>>k;
tree.addall(1,1,n,x,y,k);
}
else{
cin>>x>>y;
cout<<tree.query(1,1,n,x,y)<<endl;
}
}
return 0;
}
CodeForces718C Sasha and Array
#include <bits/stdc++.h>
#define ls (i<<1)
#define rs (i<<1|1)
#define mid ((l+r)>>1)
#define int long long
using namespace std;
const int MOD = 1e9+7;
struct Matrix{
int a[3][3];
const int size = 2;
Matrix(){
memset(a,0,sizeof(a));
}
Matrix(int aba){
a[aba][aba]=1;
a[aba][aba+1]=0;
a[aba+1][aba]=0;
a[aba+1][aba+1]=1;
}
Matrix(int A,int b,int c,int d){
a[1][1]=A;
a[1][2]=b;
a[2][1]=c;
a[2][2]=d;
}
Matrix operator*(const Matrix &ano) const {
Matrix ans;
for(int i=1;i<=size;i++){
for(int k=1;k<=size;k++){
for(int j=1;j<=size;j++){
ans.a[i][k]=(ans.a[i][k]+a[i][j]*ano.a[j][k])%MOD;
}
}
}
return ans;
}
Matrix operator+(const Matrix aa){
Matrix res;
for(int i=1;i<=size;i++){
for(int j=1;j<=size;j++){
res.a[i][j]=a[i][j]+aa.a[i][j];
res.a[i][j]%=MOD;
}
}
return res;
}
void operator=(const Matrix A){
for(int i=1;i<=size;i++){
for(int j=1;j<=size;j++){
a[i][j]=A.a[i][j];
}
}
}
bool empty(){
return (a[1][1]==0)&&(a[1][2]==0)&&(a[2][1]==0)&&(a[2][2]==0);
}
Matrix operator^(int power){
Matrix res(1);
Matrix base = (*this);
while(power){
if(power&1){
res=res*base;
}
base=base*base;
power>>=1;
}
return res;
}
};
const int SIZE = 1e5+5;
Matrix t[SIZE<<2],tag[SIZE<<2];
int v[SIZE];
const Matrix unit(1);
int n,m;
inline void pushup(int i){
t[i]=t[ls]+t[rs];
}
void build(int i,int l,int r){
tag[i]=unit;
if(l==r){
t[i]=Matrix(1,1,0,0)*(Matrix(1,1,1,0)^(v[l]-1));
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
pushup(i);
}
void pushdown(int i){
if(tag[i].empty()){
return;
}
t[ls]=t[ls]*tag[i];
tag[ls]=tag[ls]*tag[i];
t[rs]=t[rs]*tag[i];
tag[rs]=tag[rs]*tag[i];
tag[i]=unit;
}
void update(int i,int ql,int qr,int l,int r,Matrix x){
if(ql<=l && qr>=r){
t[i]=t[i]*x;
tag[i]=tag[i]*x;
return;
}
pushdown(i);
if(ql<=mid){
update(ls,ql,qr,l,mid,x);
}
if(qr>mid){
update(rs,ql,qr,mid+1,r,x);
}
pushup(i);
}
Matrix query(int i,int ql,int qr,int l,int r){
if(ql<=l && qr>=r){
return t[i];
}
pushdown(i);
Matrix res;
if(ql<=mid){
res = res + query(ls,ql,qr,l,mid);
}
if(qr > mid){
res = res+query(rs,ql,qr,mid+1,r);
}
return res;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>v[i];
}
build(1,1,n);
while(m--){
int op,l,r,x;
cin>>op;
if(op==1){
cin>>l>>r>>x;
update(1,l,r,1,n,Matrix(1,1,1,0)^x);
}
else{
cin>>l>>r;
cout<<(query(1,l,r,1,n).a[1][2]%MOD)<<'\n';
}
}
return 0;
}
P4145 上帝造题的七分钟 2 / 花神游历各国 | LibreOJ#6281. 数列分块入门 5
注:LibreOJ需要改一改输入。亲测可以AC
#include<bits/stdc++.h>
#define ls(i) (i<<1)
#define rs(i) (i<<1|1)
#define mid(l,r) ((l+r)>>1)
using namespace std;
const int SIZE=100010;
#define int long long
int n,m;
int a[SIZE*4],tag[SIZE*4];
inline void pushup(int t) {
a[t]=a[ls(t)]+a[rs(t)];
tag[t]=max(tag[ls(t)],tag[rs(t)]);
}
void build(int l=1,int r=n,int t=1) {
if(l==r) {
cin>>a[t];
tag[t]=a[t];
return;
}
build(l,mid(l,r),ls(t));
build(mid(l,r)+1,r,rs(t));
pushup(t);
}
void update(int L,int R,int l=1,int r=n,int t=1) {
if(R<l||L>r) return;
if(tag[t]==1) return;
if(l==r) {
tag[t]=a[t]=(int)sqrt(a[t]);
return;
}
update(L,R,l,mid(l,r),ls(t));
update(L,R,mid(l,r)+1,r,rs(t));
pushup(t);
}
int ask(int L,int R,int l=1,int r=n,int t=1) {
if(l>=L&&r<=R) {
return a[t];
}
int ret=0;
if(mid(l,r)>=L) ret+=ask(L,R,l,mid(l,r),ls(t));
if(mid(l,r)<R) ret+=ask(L,R,mid(l,r)+1,r,rs(t));
return ret;
}
signed main() {
cin>>n;
build();
cin>>m;
while(m--) {
int k,l,r;
cin>>k>>l>>r;
if(l>r) swap(l,r);
if(k==0) {
update(l,r);
} else {
cout<<ask(l,r)<<'\n';
}
}
return 0;
}
T218729 mod板 线段树
#include<bits/stdc++.h>
#define int long long
#define ls (now<<1)
#define rs (now<<1|1)
#define mid (l+r>>1)
#define MAX(a,b) (a>b?a:b)
using namespace std;
int n,m;
int a[100001];
int tree[100001<<2],maxn[100001<<2];
inline void pushup(int now) {
tree[now]=tree[ls]+tree[rs];
maxn[now]=MAX(maxn[ls],maxn[rs]);
}
void build(int now,int l,int r) {
if(l==r) {
tree[now]=maxn[now]=a[l];
return ;
}
build(ls,l,mid);
build(rs,mid+1,r);
pushup(now);
}
void update_mod(int now,int l,int r,int x,int y,int mod) {
if(maxn[now]<mod) return ;
if(l==r) {
tree[now]%=mod;
maxn[now]%=mod;
return ;
}
if(mid>=x) {
update_mod(ls,l,mid,x,y,mod);
}
if(mid<y) {
update_mod(rs,mid+1,r,x,y,mod);
}
pushup(now);
}
void update_assign(int now,int l,int r,int x,int k) {
if(l==r) {
tree[now]=maxn[now]=k;
return ;
}
if(mid>=x) {
update_assign(ls,l,mid,x,k);
}
else {
update_assign(rs,mid+1,r,x,k);
}
pushup(now);
}
void update_sqrt(int now,int l,int r,int x,int y) {
if(l==r) {
maxn[now]=tree[now]=sqrt(tree[now]);
return ;
}
if(mid>=x&&maxn[ls]>1) {
update_sqrt(ls,l,mid,x,y);
}
if(mid<y&&maxn[rs]>1){
update_sqrt(rs,mid+1,r,x,y);
}
pushup(now);
}
int query(int now,int l,int r,int x,int y) {
if(l>=x&&r<=y) {
return tree[now];
}
int ret=0;
if(mid>=x) {
ret+=query(ls,l,mid,x,y);
}
if(mid<y) {
ret+=query(rs,mid+1,r,x,y);
}
return ret;
}
signed main() {
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i];
cin>>m;
build(1,1,n);
while(m--) {
int op,l,r,k;
cin>>op;
if(op==1) {
cin>>l>>r;
cout<<query(1,1,n,l,r)<<endl;
}
if(op==2) {
cin>>l>>r;
update_sqrt(1,1,n,l,r);
}
if(op==3) {
cin>>l>>r>>k;
update_mod(1,1,n,l,r,k);
}
if(op==4) {
cin>>l>>k;
update_assign(1,1,n,l,k);
}
}
}
P1801 黑匣子
#include <bits/stdc++.h>
#define ls (i<<1)
#define rs (i<<1|1)
#define mid ((l+r)>>1)
using namespace std;
int c = 1;
const int SIZE = 2e6 + 5;
int t[SIZE << 2];
struct node {
int v, id;
bool operator<(const node ano) const {
return v < ano.v;
}
} a[SIZE];
int u[SIZE];
int mm[SIZE];
int m, n, cnt, I = 1;
void pushup(int i) {
t[i] = t[ls] + t[rs];
}
void update(int p, int i, int l, int r) {
if (l == r && l == p) {
t[i]++;
return;
}
t[i]++;
if (p <= mid) {
update(p, ls, l, mid);
} else {
update(p, rs, mid + 1, r);
}
pushup(i);
}
int query(int p, int i, int l, int r) {
if (l == r) {
return l;
}
if (t[ls] >= p) {
return query(p, ls, l, mid);
} else {
return query(p - t[ls], rs, mid + 1, r);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> m >> n;
for (int i = 1; i <= m; i++) {
cin >> a[i].v;
a[i].id = i;
//cout<<a[i].id<<' '<<a[i].v<<endl;
}
sort(a + 1, a + m + 1);
for (int i = 1; i <= m; i++) {
mm[a[i].id] = i;
}
for (int i = 1; i <= n; i++)cin >> u[i];
for (int i = 1; i <= m; i++) {
//cout<<'\t'<<mm[i]<<endl;
update(mm[i], 1, 1, m);
while (u[c] == i) {
cout << a[query(I, 1, 1, m)].v << '\n';
I++;
c++;
}
}
return 0;
}
P3919 【模板】可持久化线段树 1(可持久化数组)
#include <bits/stdc++.h>
#define ls (i<<1)
#define rs (i<<1|1)
#define mid ((l+r)>>1)
using namespace std;
const int SIZE = 1e6+5;
struct{
int l,r,v; // 线段树节点,存了区间方便搞
}t[SIZE*25];
int top; // 历史版本数
int root[SIZE*25]; // 历史版本根节点位置
int a[SIZE]; // 原始数组
int n,m;
int newnode(int i){ // 新建节点
t[++top]=t[i];
return top;
}
int build(int i,int l,int r){ // 建树
i=(++top); // 建立新版本
if(l==r){
// 叶子节点
t[i].v=a[l];
return i; // 返回当前版本
}
t[i].l=build(t[i].l,l,mid); // 向下递归
t[i].r=build(t[i].r,mid+1,r); // 向下递归
return i; // 返回当前版本
}
int update(int i,int l,int r,int p,int val){
// 单点更新,即数组赋值。
i=newnode(i);
if(l==r){// 叶子节点
t[i].v=val; // 直接更新
return i;// 返回当前版本
}
if(p<=mid){// 向下递归
t[i].l=update(t[i].l,l,mid,p,val);
}
else{// 向下递归
t[i].r=update(t[i].r,mid+1,r,p,val);
}
return i;// 返回当前版本
}
int query(int i,int l,int r,int p){
if(l==r){// 叶子节点
return t[i].v; // 直接返回
}
if(p<=mid){// 向下递归
return query(t[i].l,l,mid,p);
}
else{// 向下递归
return query(t[i].r,mid+1,r,p);
}
}
inline void Assign(int i,int version,int p,int val){
// 封装:在某版本下赋值
root[i]=update(root[version],1,n,p,val);
// 记得新建版本
}
inline int Get(int i,int version,int p){
// 封装:在某版本下取值
root[i]=root[version]; //新建版本
return query(root[version],1,n,p);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
root[0]=build(0,1,n);// 建立原树
for(int i=1,vi,op,loci,valuei;i<=m;i++){
cin>>vi>>op>>loci;
if(op==1){
cin>>valuei;
Assign(i,vi,loci,valuei);
}
else{
cout<<Get(i,vi,loci)<<'\n';
}
}
return 0;
}
P3834 【模板】可持久化线段树 2
#include <bits/stdc++.h>
#define ls (i<<1)
#define rs (i<<1|1)
#define mid ((l+r)>>1)
using namespace std;
const int SIZE = 2e5+5;
struct ArckaAKIOI{
int l,r,v;
ArckaAKIOI(){
l=0,r=0,v=0;
}
}t[SIZE*32];
int top;
int root[SIZE];
int a[SIZE],b[SIZE];
int n,m;
int newnode(int i){
t[++top]=t[i];
return top;
}
int build(int i,int l,int r){
i=(++top);
if(l==r){
t[i].v=a[l];
return i;
}
t[i].l=build(t[i].l,l,mid);
t[i].r=build(t[i].r,mid+1,r);
return i;
}
int update(int i,int l,int r,int p,int val){
i=newnode(i);
t[i].v++;
if(l==r){
return i;
}
if(p<=mid){
t[i].l=update(t[i].l,l,mid,p,val);
}
else{
t[i].r=update(t[i].r,mid+1,r,p,val);
}
return i;
}
int query(int i,int l,int r,int ql,int qr){
if(l==r){
return l;
}
int delta = t[t[qr].l].v-t[t[ql].l].v;
if(delta>=i){
return query(i,l,mid,t[ql].l,t[qr].l);
}
else{
return query(i-delta,mid+1,r,t[ql].r,t[qr].r);
}
}
int kkksc03;
void discretization(){
for(int i=1;i<=n;i++){
b[i]=a[i];
}
sort(b+1,b+1+n);
kkksc03 = unique(b+1,b+n+1)-(b+1);
root[0]=build(0,1,kkksc03);
for(int i=1;i<=n;i++){
root[i]=update(root[i-1],1,kkksc03,lower_bound(b+1,b+kkksc03+1,a[i])-b,114514);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
discretization();
while(m--){
int l,r,k;
cin>>l>>r>>k;
cout<<b[query(k,1,kkksc03,root[l-1],root[r])]<<'\n';
}
return 0;
}
SP3946 MKTHNUM - K-th Number
#include <bits/stdc++.h>
#define ls (i<<1)
#define rs (i<<1|1)
#define mid ((l+r)>>1)
using namespace std;
const int SIZE = 100005;
struct ArckaAKIOI{
int l,r,v;
ArckaAKIOI(){
l=0,r=0,v=0;
}
}t[SIZE<<5];
int top;
int root[SIZE<<5];
int a[SIZE],b[SIZE];
int n,m;
int newnode(int i){
t[++top]=t[i];
return top;
}
int build(int i,int l,int r){
i=(++top);
if(l==r){
t[i].v=a[l];
return i;
}
t[i].l=build(t[i].l,l,mid);
t[i].r=build(t[i].r,mid+1,r);
return i;
}
int update(int i,int l,int r,int p,int val){
i=newnode(i);
t[i].v++;
if(l==r){
return i;
}
if(p<=mid){
t[i].l=update(t[i].l,l,mid,p,val);
}
else{
t[i].r=update(t[i].r,mid+1,r,p,val);
}
return i;
}
int query(int i,int l,int r,int ql,int qr){
if(l==r){
return l;
}
int delta = t[t[qr].l].v-t[t[ql].l].v;
if(delta>=i){
return query(i,l,mid,t[ql].l,t[qr].l);
}
else{
return query(i-delta,mid+1,r,t[ql].r,t[qr].r);
}
}
int kkksc03;
void discretization(){
for(int i=1;i<=n;i++){
b[i]=a[i];
}
sort(b+1,b+1+n);
kkksc03 = unique(b+1,b+n+1)-(b+1);
root[0]=build(0,1,kkksc03);
for(int i=1;i<=n;i++){
root[i]=update(root[i-1],1,kkksc03,lower_bound(b+1,b+kkksc03+1,a[i])-b,114514);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
discretization();
while(m--){
int l,r,k;
cin>>l>>r>>k;
cout<<b[query(k,1,kkksc03,root[l-1],root[r])]<<'\n';
}
return 0;
}
P3224 [HNOI2012]永无乡| BZOJ2733 [HNOI2012]永无乡
#include <bits/stdc++.h>
#define mid ((l+r)>>1)
using namespace std;
int n, m, cnt, q;
const int SIZE = 1e6 + 5;
struct {
int fa[SIZE];
void init(int n) {
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
}
int find(int x) {
if (fa[x] == x)return x;
else return fa[x] = find(fa[x]);
}
void merge(int x, int y) {
fa[x] = y;
}
} uf;
struct node {
int l, r, v;
} t[SIZE << 2];
int kkk[SIZE],a[SIZE],root[SIZE];
void newnode(int &i, int l, int r, int p) {
if (!i) {
i = (++cnt);
}
t[i].v++;
if (l == r)return;
if (p <= mid) {
newnode(t[i].l, l, mid, p);
} else {
newnode(t[i].r, mid + 1, r, p);
}
}
void merge(int &a, int &b) {
if (!a) {
a = b;
} else if (!b) {}
else {
t[a].v += t[b].v;
merge(t[a].l, t[b].l);
merge(t[a].r, t[b].r);
}
}
int query(int i,int l,int r,int p){
if(l==r){
return kkk[l];
}
int lsum = t[t[i].l].v;
if(p<=lsum){
return query(t[i].l,l,mid,p);
}
else{
return query(t[i].r,mid+1,r,p-lsum);
}
}
int main() {
cin>>n>>m;
uf.init(n);
for(int i=1;i<=n;i++){
cin>>a[i];
kkk[a[i]]=i;
newnode(root[i],1,n,a[i]);
}
while(m--){
int x,y;
cin>>x>>y;
merge(root[uf.find(y)],root[uf.find(x)]);
uf.merge(uf.find(x),uf.find(y));
}
cin>>q;
for(int i=1,x,y;i<=q;i++){
char op[1145];
cin>>op;
cin>>x>>y;
if(op[0]=='B'){
merge(root[uf.find(y)],root[uf.find(x)]);
uf.merge(uf.find(x),uf.find(y));
}
else{
if(t[root[uf.find(x)]].v<y){
cout<<-1<<'\n';
}
else{
cout<<query(root[uf.find(x)],1,n,y)<<'\n';
}
}
}
return 0;
}
《线段树学习笔记》 AC代码索引的更多相关文章
- zkw线段树学习笔记
zkw线段树学习笔记 今天模拟赛线段树被卡常了,由于我自带常数 \(buff\),所以学了下zkw线段树. 平常的线段树无论是修改还是查询,都是从根开始递归找到区间的,而zkw线段树直接从叶子结点开始 ...
- 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解
什么是线段树 线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值.区间和等问题. 线段树的用处 对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log n). 基础 ...
- JSOI2008 Blue Mary开公司 | 李超线段树学习笔记
题目链接:戳我 这相当于是一个李超线段树的模板qwqwq,题解就不多说了. 代码如下: #include<iostream> #include<cstdio> #include ...
- 仙人掌&圆方树学习笔记
仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图 ...
- SQL反模式学习笔记13 使用索引
目标:优化性能 改善性能最好的技术就是在数据库中合理地使用索引. 索引也是数据结构,它能使数据库将指定列中的某个值快速定位在相应的行. 反模式:无规划的使用索引 1.不使用索引或索引不足 2.使用了 ...
- Mysql数据库学习笔记之数据库索引(index)
什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...
- 线段树学习----C语言
/* 线段树学习:如果一个节点为i,那么他的左孩子为2I+1,右孩子为2i+2: */ #include<stdio.h> #define min(a,b) a<b?a:b; ]; ...
- CF487E Tourists + 圆方树学习笔记(圆方树+树剖+线段树+multiset)
QWQ果然我已经什么都学不会的人了. 这个题目要求的是图上所有路径的点权和!QWQ(我只会树上啊!) 这个如果是好啊 这时候就需要 圆方树! 首先在介绍圆方树之前,我们先来一点简单的前置知识 首先,我 ...
- Treap-平衡树学习笔记
平衡树-Treap学习笔记 最近刚学了Treap 发现这种数据结构真的是--妙啊妙啊~~ 咳咳.... 所以发一发博客,也是为了加深蒟蒻自己的理解 顺便帮助一下各位小伙伴们 切入正题 Treap的结构 ...
- 一篇自己都看不懂的点分治&点分树学习笔记
淀粉质点分治可真是个好东西 Part A.点分治 众所周知,树上分治算法有$3$种:点分治.边分治.链分治(最后一个似乎就是树链剖分),它们名字的不同是由于分治方式的不同的.点分治,顾名思义,每一次选 ...
随机推荐
- 齐博x1内容评论标签的风格制作
评论的标签如下: {qb:comment name="xxxxx" rows='5'} HTML代码片段 {/qb:comment} 评论涉及到的元素有{posturl} 这个是代 ...
- 关于Dockerfile的写法
Dockerfile是用来自定义构建镜像的文件. Dockerfile: FROM nginx RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/ht ...
- python中的if条件语句
# 如果...就... # 1. print('1.') if 1+1 == 2: print('1+1是等于2的') print('1+1还是等于2的') print('1+1就等于2的') # 2 ...
- 1.docker的基本使用
1.简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化.容器是完 ...
- 833(DIV2)——C题题解
题目链接 题目大意: 给定n个数,你可以对数值为0的数改变其为任意值,问最后前缀和为0的个数的最大值. 思路: 这题比较可惜,自己的思路没有问题,但是他少了一些东西.对数组进行前缀和处理,我们可以发现 ...
- Postman使用指导
1. 下载好Postman,不用注册账号,直接离线使用 2. 软件的配置修改: 2.1关闭SSL认证 2.2关闭系统代理 2.3上传证书填写hosthost为服务器地址和端口:crt和key可以通过国 ...
- 基于k8s的发布系统的实现
综述 首先,本篇文章所介绍的内容,已经有完整的实现,可以参考这里. 在微服务.DevOps和云平台流行的当下,使用一个高效的持续集成工具也是一个非常重要的事情.虽然市面上目前已经存在了比较成熟的自动化 ...
- 已经有 MESI 协议,为什么还需要 volatile 关键字?
本文已收录到 GitHub · AndroidFamily,有 Android 进阶知识体系,欢迎 Star.技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交流群. 前言 大家好 ...
- 获取联通光猫PT952G的管理员密码
前言 普通用户的帐号和密码在光猫的背面 输入光猫网关即可跳转到登录界面 但是没有什么权限操作东西,所以我找到了管理员界面 输入 网关+cu.html 即可跳转到管理员界面 例如我这里是http://1 ...
- Docker使用Calico配置网络模式
一.Calico介绍 Calico是一种容器之间互通的网络方案,在虚拟化平台中,比如OpenStack.Docker等都需要实现workloads之间互连,但同时也需要对容器做隔离控制,就像在Inte ...