zoukankan      html  css  js  c++  java
  • 洛谷 P2184 贪婪大陆(树状数组)

    传送门


    解题思路

    一直往扫描线方面想,结果自己没想出来,还是运用的不够灵活。
    其实很简单,对于查询区间[l,r],答案为左端点小于等于r的区间数-右端点小于l的区间数。
    维护两个树状数组即可。

    AC代码

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<iomanip>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn=1e5+5;
    int n,m,d[3][maxn];
    inline int lowbit(int x){
    	return x&(-x);
    }
    inline void update(int id,int x){
    	for(int i=x;i<=n;i+=lowbit(i)){
    		d[id][i]++;
    	}
    }
    inline int query(int id,int x){
    	if(x==0) return 0;
    	int res=0;
    	for(int i=x;i>=1;i-=lowbit(i)){
    		res+=d[id][i];
    	}
    	return res;
    }
    int main(){
    	ios::sync_with_stdio(false);
    	cin>>n>>m;
    	for(int i=1;i<=m;i++){
    		int op,l,r;
    		cin>>op>>l>>r;
    		if(op==1){
    			update(1,l);
    			update(2,r);
    		}else{
    			cout<<query(1,r)-query(2,l-1)<<endl;
    		}
    	}
        return 0;
    }
    
  • 相关阅读:
    20170612测试
    vijos1453曼哈顿距离
    vijos1153 猫狗大战
    vijos1037搭建双塔
    dijkstra+priority_queue+vector
    BZOJ1507: [NOI2003]Editor
    dinic模板
    旅行-树形DP
    51nod1799-二分答案
    51nod1791-合法括号子段
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/15381392.html
Copyright © 2011-2022 走看看