1 solutions
-
0
洛谷 P2184 贪婪大陆
难度: 蓝
算法: 树状数组,线段树
这道题就相当于增加一个区间和查询一个区间内有多少个区间。
开两个数组,记为 和 。 分别记录该点的左端点个数和右端点个数。
对于增加区间 ,令 ,。
对于查询 ,我们发现:
在区间 中的区间,左端点不大于 ,右端点不小于 。统计答案时只需要把左端点不大于 的区间数减去右端点小于 的区间数即可。
使用树状数组维护单点修改,区间查询操作。
代码见下(35 行):
#include<bits/stdc++.h> #define lowbit(a) a&-a using namespace std; int n,q,op,l,r,le[100010],ri[100010],s1,s2; void add(int u,int t){ while(u<=n){ if(t==1) le[u]++; else ri[u]++; u+=lowbit(u); } } int que(int u,int t){ int ans=0; while(u){ if(t==1) ans+=le[u]; else ans+=ri[u]; u-=lowbit(u); } return ans; } int main(){ scanf("%d%d",&n,&q); while(q--){ scanf("%d%d%d",&op,&l,&r); if(op==1){ add(l,1); add(r,2); } else{ s1=que(r,1); s2=que(l-1,2); printf("%d\n",s1-s2); } } }
- 1
Information
- ID
- 117
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- 7
- Tags
- # Submissions
- 49
- Accepted
- 10
- Uploaded By