HDU 1698 Just a Hook (线段树区间更新)

来源:互联网 发布:淘宝扑克牌 编辑:程序博客网 时间:2024/04/29 17:48

题目链接

不断的区间更新,最后计算整个区间的最终和。

Java依然要用BufferedReader来输入,否则超时。以后记得这种输入数据量大概在几十万的题,直接用BufferedReader吧。

这题,由于是直接更新掉某个区间的值,而不是在某个区间加上某个值,因此在更新sum和mark两个数组值的时候注意下就行了。

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Scanner;public class Main {static Scanner sc = new Scanner(System.in);static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));static int T,n,q;static int [] sum;static int [] mark;static String [] s = new String[3];static void init(int l, int r, int rt){if(l == r) {sum[rt] = 1;return;}int m = (l + r) >> 1;init(l,m,rt << 1);init(m + 1,r,rt << 1 | 1);sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];}static void pushdown(int rt, int l, int r){int m = (l + r) >> 1;//左右两个子树的mark都跟这个点的mark值一样//再更新左右的summark[rt << 1] = mark[rt]; sum[rt << 1] = mark[rt]*(m-l+1);mark[rt << 1 | 1] = mark[rt];sum[rt << 1 | 1] = mark[rt]*(r-m);mark[rt] = 0;//最后把改点的mark去掉}static void pushup(int rt){sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];}static void update(int rt, int l, int r, int i, int j, int val){if(l >= i && r <= j){sum[rt] = (r-l+1)*val;mark[rt] = val;return;}if(mark[rt] != 0) pushdown(rt,l,r);//这点的子树要更新int m = (l + r) >> 1;if(i <= m) update(rt<<1,l,m,i,j,val);if(j > m) update(rt<<1|1,m+1,r,i,j,val);pushup(rt);//左右可能更新过,因此要把新的左右给加回来}static int query(int rt, int l, int r, int i, int j){if(l >= i && r <= j){return sum[rt];}if(mark[rt] != 0) pushdown(rt,l,r);//这点的子树都需要更新int m = (l + r) >> 1;int ans = 0;if(i <= m) ans += query(rt<<1,l,m,i,j);if(j > m) ans += query(rt<<1|1,m+1,r,i,j);return ans;}public static void main(String[] args) throws IOException {T = Integer.parseInt(bf.readLine());for(int t = 1; t <= T; t++){n = Integer.parseInt(bf.readLine());sum = new int[4*n+1];mark = new int[4*n+1];init(1,n,1);q = Integer.parseInt(bf.readLine());int x,y,z;for(int i = 0; i < q; i++){s = bf.readLine().split(" ");x = Integer.parseInt(s[0]); y = Integer.parseInt(s[1]); z = Integer.parseInt(s[2]);update(1,1,n,x,y,z);}System.out.println("Case "+t+": The total value of the hook is "+query(1,1,n,1,n)+".");}}}