目录
树状数组模板
import java.util.Scanner;
public class Main {
static int N=100010;
static int t[]=new int[N];
static int tr[]=new int[N];
static int n,m;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
for(int i=1;i<=n;i++) t[i]=sc.nextInt();
for(int i=1;i<=n;i++) add(i,t[i]);
while(m-->0) {
int k,a,b;
k=sc.nextInt();
a=sc.nextInt();
b=sc.nextInt();
if(k==0) System.out.println(query(b)-query(a-1));
else add(a, b);
}
}
public static int query(int x) {
int res=0;
for(int i=x;i>0;i-=lowbit(i)) res+=tr[i];
return res;
}
public static void add(int x, int v) {
for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=v;
}
public static int lowbit(int x) {
return x&-x;
}
}
import java.util.Scanner;
public class Main{
static int N=32010;
static int n;
static int tr[]=new int[N];
static int level[]=new int[N];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n=sc.nextInt();
for(int i=0;i<n;i++) {
int x,y;
x=sc.nextInt();
y=sc.nextInt();
//想从1开始
x++;
//先查再加 是算这个点之前 不能包含这个点
level[query(x)]++;
add(x);
}
for(int i=0;i<n;i++) System.out.println(level[i]);
}
public static int query(int x) {
int res=0;
for(int i=x;i>0;i-=lowbit(i)) res+=tr[i];
return res;
}
public static void add(int x) {
for(int i=x;i<=N;i+=lowbit(i)) tr[i]++;
}
public static int lowbit(int x) {
return x&-x;
}
}
线段树模板
import java.util.Scanner;
public class Main {
static int N=100010;
static int n,m;
static int w[]=new int[N];
static class Node{
int l,r,sum;
public Node() {
super();
}
public Node(int l, int r, int sum) {
super();
this.l = l;
this.r = r;
this.sum = sum;
}
public int getL() {
return l;
}
public void setL(int l) {
this.l = l;
}
public int getR() {
return r;
}
public void setR(int r) {
this.r = r;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
}
static Node[] tr=new Node[4*N];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n=sc.nextInt();m=sc.nextInt();
for(int i=1;i<=n;i++) w[i]=sc.nextInt();
build(1,1,n);
int k,a,b;
while(m-->0) {
k=sc.nextInt();a=sc.nextInt();b=sc.nextInt();
if(k==0) System.out.println(query(1,a,b));
else modify(1,a,b);
}
}
//用子节点信息更新当前节点信息
public static void pushup(int u) {
tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
//在一段区间上初始化线段树
public static void build(int u, int l, int r) {
if(l==r) tr[u]= new Node(l,r,w[r]);
else {
tr[u]=new Node();
tr[u].setL(l);tr[u].setR(r);
int mid=l+r>>1;
//左儿子
build(u<<1, l, mid);
//右儿子
build(u<<1|1, mid+1, r);
pushup(u);
}
}
//查询
public static int query(int u, int l, int r) {
if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum;
int mid=(tr[u].l+tr[u].r)>>1;
int sum=0;
if(l<=mid) sum=query(u<<1, l, r);
if(r>=mid+1) sum+=query(u<<1|1, l, r);
return sum;
}
//修改
public static void modify(int u, int x, int v) {
if(tr[u].l==tr[u].r) tr[u].sum+=v;
else {
int mid=(tr[u].l+tr[u].r)>>1;
if(x<=mid) modify(u<<1, x, v);
else modify(u<<1|1, x, v);
pushup(u);
}
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
static int N=100010;
static int n,m;
static int w[]=new int[N];
static class Node{
int l,r,maxv;
public Node(int l, int r) {
super();
this.l = l;
this.r = r;
}
}
static Node[] tr=new Node[4*N];
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
String[] s = br.readLine().split(" ");
n=Integer.parseInt(s[0]);m=Integer.parseInt(s[1]);
s = br.readLine().split(" ");
for(int i=1;i<=n;i++) w[i]=Integer.parseInt(s[i-1]);
build(1,1,n);
int l,r;
while(m-->0) {
s = br.readLine().split(" ");
l=Integer.parseInt(s[0]);r=Integer.parseInt(s[1]);
//System.out.println(query(1,l,r));
bw.write(query(1, l, r)+"\n");
}
bw.flush();
bw.close();
br.close();
}
public static void build(int u, int l, int r) {
if (l == r) {
tr[u] = new Node(l, r);
tr[u].maxv=w[r];
}
else
{
tr[u] = new Node(l, r);
int mid = l + r >> 1;
build(u << 1, l, mid); build(u << 1 | 1, mid + 1, r);
tr[u].maxv = Math.max(tr[u << 1].maxv, tr[u << 1 | 1].maxv);
}
}
public static int query(int u, int l, int r) {
if (tr[u].l >= l && tr[u].r <= r) return tr[u].maxv;
int mid = tr[u].l + tr[u].r >> 1;
int maxv = Integer.MIN_VALUE;
if (l <= mid) maxv = Math.max(maxv, query(u << 1, l, r));
if (r > mid) maxv = Math.max(maxv, query(u << 1 | 1, l, r));
return maxv;
}
}