线段树——poj1823

来源:互联网 发布:欧陆风云4 mac dlc 编辑:程序博客网 时间:2024/06/10 00:00

题目:http://poj.org/problem?id=1823

大意是住宾馆,有三种操作,1是从第i个房间要连续入住m个人;2是从第i个房间要连续退房i个人;3是查询最大连续空房间数

很简单的线段树

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.StreamTokenizer;class Tree{int ll, rr, mid;int max, cr, cl;int occ;}public class Main {Tree tree[];public Main(){tree = new Tree[32767];for (int i = 0; i < tree.length; i++)tree[i] = new Tree();}void push_down(int rt, int sign){tree[rt].occ = -1;tree[rt << 1].occ = tree[rt << 1|1].occ = sign;int r = rt << 1;if (sign == 1){tree[r].cl = tree[r].cr = tree[r+1].cl = tree[r+1].cr = 0;tree[r].max = tree[r+1].max = 0;}else{int len = tree[r].rr - tree[r].ll + 1;tree[r].cl = tree[r].cr = len;tree[r].max = len;len = tree[r+1].rr - tree[r+1].ll + 1;tree[r+1].cl = tree[r+1].cr =  len;tree[r+1].max = len;}}void build(int rt, int ll, int rr){tree[rt].ll = ll;tree[rt].rr = rr;tree[rt].max = tree[rt].cl = tree[rt].cr = rr - ll + 1;tree[rt].occ = 0;tree[rt].mid = (rr + ll) >> 1;if (ll < rr){build(rt << 1, ll, tree[rt].mid);build(rt << 1 | 1, tree[rt].mid + 1, rr);}}void update(int rt, int ll, int rr, int sign){if (tree[rt].ll == ll && tree[rt].rr == rr){tree[rt].occ = sign;int len = tree[rt].rr - tree[rt].ll + 1;if (sign == 1) len = 0;tree[rt].max = tree[rt].cl = tree[rt].cr = len;return ;}if (tree[rt].occ == 1){push_down(rt, 1);}if (tree[rt].occ == 0){push_down(rt, 0);}if (rr <= tree[rt].mid){update(rt << 1, ll, rr, sign);}elseif (ll > tree[rt].mid){update(rt << 1 | 1, ll, rr, sign);}else {update(rt << 1, ll, tree[rt].mid, sign);update(rt << 1|1, tree[rt].mid+1, rr, sign);}if (tree[rt].occ == -1){if (tree[rt << 1].occ == 0){tree[rt].cl = tree[rt << 1].cl + tree[rt << 1 | 1].cl;}else tree[rt].cl = tree[rt << 1].cl;if (tree[rt << 1 |1].occ == 0){tree[rt].cr = tree[rt << 1|1].cr + tree[rt << 1].cr;}else tree[rt].cr = tree[rt << 1|1].cr;int len = tree[rt << 1].cr + tree[rt << 1|1].cl;tree[rt].max = Math.max(len, Math.max(tree[rt << 1].max, tree[rt<< 1|1].max));}else{int len ;if (sign == 1){len = 0;}else{len = tree[rt].rr - tree[rt].ll + 1;}tree[rt].max = tree[rt].cl = tree[rt].cr = len;}if (tree[rt << 1].occ == tree[rt << 1|1].occ) tree[rt].occ = tree[rt << 1].occ;}int getMax(){return tree[1].max;}public static void main(String[] args) throws IOException {// TODO Auto-generated method stubStreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));st.nextToken();int n = (int) st.nval;st.nextToken();int p = (int) st.nval;Main ma = new Main();int sign;int ll, rr;ma.build(1, 1, n);for (int i = 0; i < p; i++){st.nextToken();sign = (int) st.nval;if (sign == 3)System.out.printf("%d\n", ma.getMax());else{st.nextToken();ll = (int) st.nval;st.nextToken();rr = (int) st.nval;rr = ll + rr - 1;if (sign == 2) sign = 0;ma.update(1, ll, rr, sign);}}}}


0 0
原创粉丝点击