zoukankan      html  css  js  c++  java
  • 洛谷 P2184 贪婪大陆

    题面

        又是一类比较套路的题呢?

        假如我们的地雷都表示成 [l[i],r[i]] ,要求[L,R],那么就相当于要求满足 (l[i]<=R && r[i]>=L)的i的个数。。。。。

        直接求不太好求,看起来又不太能容斥?? 别忘了 l[i]<=r[i] && L<=R 是隐藏条件,于是我们可以得出

        满足 (l[i]<=R && r[i]>=L)的i的个数

        就是

        (l[i]<=R)的i的个数

        减去

        (r[i]<L)的i的个数

    (可以尝试画图验证)

        所以直接树状数组维护前缀和即可。

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=100005;
    
    inline int read(){
        int x=0; char ch=getchar();
        for(;!isdigit(ch);ch=getchar());
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
        return x;
    }
    
    int f[2][N],n,m,l,r,opt;
    
    inline void add(int T,int x){
    	for(;x<=n;x+=x&-x) f[T][x]++;
    }
    
    inline int query(int T,int x){
    	int an=0;
    	for(;x;x-=x&-x) an+=f[T][x];
    	return an;
    }
    
    int main(){
    	for(n=read(),m=read();m;m--){
    		opt=read(),l=read(),r=read();
    		if(opt==1) add(0,l),add(1,r);
    		else printf("%d
    ",query(0,r)-query(1,l-1));
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    双端队列广搜
    多源bfs
    leetcode刷题-67二进制求和
    leetcode刷题-66加一
    leetcode刷题-64最小路径和
    leetcode刷题-62不同路径2
    leetcode刷题-62不同路径
    leetcode刷题-61旋转链表
    leetcode刷题-60第k个队列
    leetcode刷题-59螺旋矩阵2
  • 原文地址:https://www.cnblogs.com/JYYHH/p/11290941.html
Copyright © 2011-2022 走看看