线段树——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
- 线段树——poj1823
- 【线段树专题】poj1823
- poj1823线段树
- 线段树入门学习(三)懒操作(兼解POJ1823) JAVA
- poj1823 - hotel
- 【POJ1823】Hotel
- 线段树—hdu1166
- 线段树— Billboard
- 数据结构专题——线段树线段树
- JD2943——线段树、树套树、分块(线段树裸题)
- JD2715 忠诚2——线段树(线段树裸题)
- POJ 2155 树套树—线段树套线段树
- Hotel——线段树
- 线段树——入门
- 数据结构——线段树
- 数据结构——线段树
- 线段树——vijos1083
- 数据结构——线段树
- MFC 刷新指定控件
- 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题
- Android Activity生命周期(图文)
- linux的shell脚本
- EXT4.0 (1~3章)学习资料
- 线段树——poj1823
- python tornado window 平台安装
- C++下string用法总结
- MongoDB权限管理之用户名和密码的操作
- poj1330 LCA离线tarjan算法 复杂度O(n+q)
- EXT4.0 (4~9章)学习资料
- ExtJs4学习笔记一--基础知识
- 组播性能
- table tr 多选