主要是记录一下线段树的写法,包括建树、区间查询、单点更新
以后就统一用这个写法了,很清楚
HDU1754(线段树单点查询+单点更新)
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <map>
#include <set>
#include <queue>
#include <vector>
#define mod 1000000007
#define INF 0x3f3f3f3f
#define fuck() (cout << "----------------------------------------" << endl)
using namespace std;
const int maxn = 2000000 + 5;
int a[maxn];
int sum[maxn * 4];
void bulid(int o, int l, int r)
{
if(l == r)
{
sum[o] = a[l];
return;
}
int m = (l + r) / 2;
bulid(o*2, l, m);
bulid(o*2+1, m+1, r);
sum[o] = max(sum[o*2], sum[o*2+1]);
}
int query(int o, int l, int r, int ql, int qr)
{
if(ql <= l && qr >= r)
return sum[o];
int m = (l + r) / 2;
int ans1 = 0, ans2 = 0;
if(ql <= m) ans1 = query(o*2,l,m,ql,qr);
if(qr > m) ans2 = query(o*2+1,m+1,r,ql,qr);
return max(ans1, ans2);
}
void update(int o, int l, int r, int pos, int val)
{
if(l == pos && r == pos)
{
sum[o] = val;
return;
}
int m = (l + r) / 2;
if(pos <= m)
update(2*o,l,m,pos,val);
else
update(2*o+1,m+1,r,pos,val);
sum[o] = max(sum[o*2],sum[o*2+1]);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m) == 2)
{
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
bulid(1,1,n);
while(m--)
{
char op;
getchar();
scanf("%c",&op);
if(op == 'Q')
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",query(1,1,n,l,r));
}
else
{
int x,y;
scanf("%d%d",&x,&y);
update(1,1,n,x,y);
}
}
}
return 0;
}
hihocoder 1078(线段树区间更新+区间查询)
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
const int maxn = 1e5 + 5;
using namespace std;
int sum[maxn * 4];
int lazy[maxn * 4];
int a[maxn];
void pushdown(int l, int r, int o){
if(lazy[o]){
int m = (l + r) / 2;
sum[o*2] = (m-l+1)*lazy[o];
sum[o*2+1] = (r-m)*lazy[o];
lazy[o*2] = lazy[o];
lazy[o*2+1] = lazy[o];
lazy[o] = 0;
}
return;
}
void build(int l, int r, int o){
lazy[o] = 0;
if(l == r){
sum[o] = a[l];
return;
}
int m = (l + r) / 2;
build(l,m,o*2);
build(m+1,r,o*2+1);
sum[o] = sum[o*2] + sum[o*2+1];
return ;
}
void update(int l, int r, int o, int ql, int qr, int c){
if(ql <= l && qr >= r){
sum[o] = (r - l + 1) * c;
lazy[o] = c;
return;
}
int m = (l + r) / 2;
pushdown(l, r, o);
if(ql <= m)
update(l,m,o*2,ql,qr,c);
if(qr > m)
update(m+1,r,o*2+1,ql,qr,c);
sum[o] = sum[o*2] + sum[o*2+1];
return;
}
int query(int l, int r, int o, int ql, int qr){
if(ql <= l && qr >= r){
return sum[o];
}
int m = (l + r) / 2;
pushdown(l, r, o);
int ans = 0;
if(ql <= m)
ans += query(l,m,o*2,ql,qr);
if(qr > m)
ans += query(m+1,r,o*2+1,ql,qr);
return ans;
}
int main(){
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
build(1,n,1);
int q;
scanf("%d",&q);
while(q--){
int op;
scanf("%d",&op);
if(op == 1){
int l, r, c;
scanf("%d%d%d",&l,&r,&c);
update(1,n,1,l,r,c);
}
else{
int l, r;
scanf("%d%d",&l,&r);
printf("%d\n",query(1,n,1,l,r));
}
}
}