zoukankan      html  css  js  c++  java
  • [SCOI2007]降雨量

    Description

    BZOJ1067
    Luogu2461

    Solution

    这个题的思路其实还是很好想的,就是细节有点多...

    Code

    #include <cstdio>
    #include <algorithm>
    
    const int N = 5e4 + 10;
    const int INF = 0x7fffffff;
    
    int y[N], h[N];
    int n, m;
    int mx[N<<2];
    
    #define mid ((l+r)>>1)
    #define lson o<<1, l, mid
    #define rson o<<1|1, mid+1, r
    void build(int o, int l, int r) {
    	if (l == r) {
    		mx[o] = h[l];
    		return;
    	}
    	build(lson);
    	build(rson);
    	mx[o] = std::max(mx[o<<1], mx[o<<1|1]);
    }
    
    int query(int o, int l, int r, int ql, int qr) {
    	if (ql <= l && r <= qr) {
    		return mx[o];
    	}
    	int ans = 0;
    	if (ql <= mid) ans = std::max(ans, query(lson, ql, qr));
    	if (qr > mid) ans = std::max(ans, query(rson, ql, qr));
    	return ans;
    }
    
    int main() {
    	scanf("%d", &n);
    	for (int i = 1; i <= n; ++i) {
    		scanf("%d%d", &y[i], &h[i]);
    	}
    	build(1, 1, n);
    	scanf("%d", &m);
    	for (int i = 1, l, r; i <= m; ++i) {
    		scanf("%d%d", &l, &r);
    		int py = std::lower_bound(y+1, y+n+1, l) - y; // lower_bound查到的是不小于的 
    		int px = std::lower_bound(y+1, y+n+1, r) - y;
    		if (y[px] == r) {
    			if (y[py] == l) {
    				if (h[py] < h[px]) {
    					puts("false"); // x比y高 
    				} else {
    					int max = -INF;
    					if (py + 1 <= px - 1) max = query(1, 1, n, py+1, px-1);
    					if (max >= h[px]) puts("false"); // z比x高 
    					else puts(r-l == px-py ? "true" : "maybe"); // 中间年份全部已知 
    				}
    			} else {
    				int max = -INF;
    				// printf("%d %d
    ", y[py], y[px]);
    				if (py <= px - 1) max = query(1, 1, n, py, px-1);
    				// printf("%d
    ", max);
    				if (max >= h[px]) puts("false"); // z比x高 
    				else puts("maybe"); // x比z高但y未知 
    			}
    		} else {
    			if (y[py] == l) {
    				int max = -INF;
    				if (py + 1 <= px - 1) max = query(1, 1, n, py+1, px-1);
    				if (max >= h[py]) puts("false"); // z比y高 
    				else puts("maybe"); // x未知 
    			} else {
    				puts("maybe"); // x和y都未知 
    			}
    		}
    	}
    	return 0;
    }
    

    Note

    lower_bound是不小于x的第一个数啊!!!!!!
    分类讨论要有条理!!
    不要query之后不写max = 啊!!!!!!

  • 相关阅读:
    虚树
    最小树形图
    分块
    斜率优化
    单调队列优化DP
    树套树
    2-SAT
    莫队
    单调队列
    单调栈
  • 原文地址:https://www.cnblogs.com/wyxwyx/p/bzoj1067.html
Copyright © 2011-2022 走看看