【tyvj1473】校门外的树3
2016-03-29 18:46
260 查看
tyvj1473
这道题可以用两个树状数组来做把每次更新的端点分别插入两个树状数组,在查询区间时,之前更新的区间会对当前查询区间产生影响的条件是
更新的末端点大于查询的始端点且更新的始端点小于等于查询的末端点,那么由于如果某次更新的始端点大于查询的末端点,那么这次更新的末端点也大于查询的末端点
因而我们所求的就是
已更新线段的末端点不小于查询的始端点的个数 - 已更新线段的始端点大于查询的末端点的个数
能用树状数组就不用线段树咯。。。毕竟10分钟A掉的题目就不麻烦写几种方法了
hzwer学长的线段树代码附上
hzwer学长博客
这道题可以用两个树状数组来做把每次更新的端点分别插入两个树状数组,在查询区间时,之前更新的区间会对当前查询区间产生影响的条件是
更新的末端点大于查询的始端点且更新的始端点小于等于查询的末端点,那么由于如果某次更新的始端点大于查询的末端点,那么这次更新的末端点也大于查询的末端点
因而我们所求的就是
已更新线段的末端点不小于查询的始端点的个数 - 已更新线段的始端点大于查询的末端点的个数
能用树状数组就不用线段树咯。。。毕竟10分钟A掉的题目就不麻烦写几种方法了
include<cstdio> using namespace std; const int maxn = 50000 + 10; int n, m, c1[maxn], c2[maxn]; int lowbit(int x) { return x&-x; } void add1(int x){ while(x <= n){ c1[x]++; x += lowbit(x); } } void add2(int x){ while(x <= n){ c2[x]++; x += lowbit(x); } } int sum1(int x){ int cnt = 0; while(x > 0){ cnt += c1[x]; x -= lowbit(x); } return cnt; } int sum2(int x){ int cnt = 0; while(x > 0){ cnt += c2[x]; x -= lowbit(x); } return cnt; } int main(){ scanf("%d %d", & 4000 amp;n, &m); int k, l, r; while(m--){ scanf("%d %d %d",&k, &l, &r); if(k == 1){ add1(l); add2(r); } else printf("%d\n",( sum2(n)-sum2(l-1) ) - ( sum1(n)-sum1(r) )); } return 0; }
hzwer学长的线段树代码附上
#include<cstdio> #include<iostream> using namespace std; int n,m; struct data{ int l,r; int left,right; }tr[200001]; void build(int k,int s,int t) { tr[k].left=s;tr[k].right=t; if(s==t)return; int mid=(s+t)>>1; build(k<<1,s,mid); build(k<<1|1,mid+1,t); } void insertl(int k,int x,int y) { int l=tr[k].left,r=tr[k].right; if(l==x&&y==r){tr[k].l++;return;} int mid=(l+r)>>1; if(y<=mid)insertl(k<<1,x,y); else if(x>mid)insertl(k<<1|1,x,y); else { insertl(k<<1,x,mid); insertl(k<<1|1,mid+1,y); } } void insertr(int k,int x,int y) { int l=tr[k].left,r=tr[k].right; if(l==x&&y==r){tr[k].r++;return;} int mid=(l+r)>>1; if(y<=mid)insertr(k<<1,x,y); else if(x>mid)insertr(k<<1|1,x,y); else { insertr(k<<1,x,mid); insertr(k<<1|1,mid+1,y); } } int askl(int k,int x) { int l=tr[k].left,r=tr[k].right; if(l==r)return tr[k].l; int mid=(l+r)>>1; if(x<=mid)return tr[k].l+askl(k<<1,x); else return tr[k].l+askl(k<<1|1,x); } int askr(int k,int x) { int l=tr[k].left,r=tr[k].right; if(l==r)return tr[k].r; int mid=(l+r)>>1; if(x<=mid)return tr[k].r+askr(k<<1,x); else return tr[k].r+askr(k<<1|1,x); } int main() { int total=0,ans; scanf("%d%d",&n,&m); build(1,0,n); for(int i=1;i<=m;i++) { int t,a,b; scanf("%d%d%d",&t,&a,&b); if(t==1){ insertl(1,0,a-1); insertr(1,b+1,n); total++; } else { ans=askr(1,a)+askl(1,b); printf("%d\n",total-ans); } } return 0; }
hzwer学长博客
相关文章推荐
- iOS UIScrollView之轮转图片
- POJ1546
- Android面试必备
- hdu2608 数论,规律
- 面试题 多线程 顺序操作
- 稀疏表示介绍(中)
- JS模块化编程(二)
- android.view.InflateException: Binary XML file line #7: Error inflating class(OOM)
- 抽象类的方法能否被static修饰,java关键字 native有什么作用?
- apache使用jk插件集成tomcat_apachez
- 第5周项目1:三角形类雏形(1)
- android 单线程多任务断点排队下载(支持多界面刷新)
- 项目15-游戏中的角色类(1)
- 第四周项目四:用地贵方法求解
- 【USACO题库】1.2.2 Transformations方块转换
- 【转】Java 线程安全
- 插入Mysql异常之Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
- Android ZXing二维码、条形码的生成和解析
- RTP,RTCP协议浅析
- HDU 5615 Jam's math problem(十字相乘判定)