Codeforces Round #433 (Div. 1, based on Olympiad of Metropolises) C. Boredom(主席树)
来源:互联网 发布:甬航数据交互平台 编辑:程序博客网 时间:2024/05/19 16:27
题目链接:http://codeforces.com/contest/853/problem/C
查二维平面里有多少点,按行维护主席树,然后每次查一个区间,做差就可以求出二维平面里的点了,然后剩下的容斥一哈就行了,具体是把周围一圈剪掉,然后把四个角加上就好了,比较简单
代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN=2e5+5;const int M=MAXN*40;int n,q,tot;int a[MAXN];int T[MAXN],lson[M],rson[M],c[M];int build(int l,int r){int root=tot++;c[root]=0;if(l!=r){int mid=(l+r)>>1;lson[root]=build(l,mid);rson[root]=build(mid+1,r);}return root;}int update(int root,int pos,int val){int newroot=tot++,tmp=newroot;c[newroot]=c[root]+val;int l=1,r=n;while(l<r){int mid=(l+r)>>1;if(pos<=mid){lson[newroot]=tot++;rson[newroot]=rson[root];newroot=lson[newroot];root=lson[root];r=mid;}else{rson[newroot]=tot++;lson[newroot]=lson[root];newroot=rson[newroot];root=rson[root];l=mid+1;}c[newroot]=c[root]+val;}return tmp;}int query(int root,int L,int R,int l,int r){if(L>R)return 0;if(L<=l&&r<=R)return c[root];int mid=(l+r)>>1;int ret=0;if(L<=mid)ret+=query(lson[root],L,R,l,mid);if(mid<R)ret+=query(rson[root],L,R,mid+1,r);return ret;}int Q(int l,int r,int L,int R){if(l>r)return 0;return query(T[r],L,R,1,n)-query(T[l-1],L,R,1,n);}int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);tot=0;scanf("%d%d",&n,&q);T[0]=build(1,n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++){T[i]=update(T[i-1],a[i],1);}while(q--){int l,r,d,u;ll cnt=0,ans=0;scanf("%d%d%d%d",&l,&r,&d,&u);cnt=Q(1,l-1,1,n);//printf("%d\n",cnt);ans-=cnt*(cnt-1)/2;cnt=Q(d+1,n,1,n);//printf("%d\n",cnt);ans-=cnt*(cnt-1)/2;cnt=Q(1,n,u+1,n);//printf("%d\n",cnt);ans-=cnt*(cnt-1)/2;cnt=Q(1,n,1,r-1);//printf("%d\n",cnt);ans-=cnt*(cnt-1)/2;cnt=Q(1,l-1,1,r-1);//printf("%d\n",cnt);ans+=cnt*(cnt-1)/2;cnt=Q(1,l-1,u+1,n);//printf("%d\n",cnt);ans+=cnt*(cnt-1)/2;cnt=Q(d+1,n,1,r-1);//printf("%d\n",cnt);ans+=cnt*(cnt-1)/2;cnt=Q(d+1,n,u+1,n);//printf("%d\n",cnt);ans+=cnt*(cnt-1)/2;//printf("%lld\n",ans);ans+=1LL*n*(n-1)/2;printf("%lld\n",ans);}return 0;}
阅读全文
0 0
- Codeforces Round #433 (Div. 1, based on Olympiad of Metropolises) C. Boredom(主席树)
- Codeforces Round #433 (Div. 1, based on Olympiad of Metropolises) C. Boredom
- Codeforces Round #433(Div. 1,based on Olympiad of Metropolises)A Planning B Jury Meeting C Boredom
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) C Planning
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) A,B,C
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) A—C题解
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)C. Planning
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) C. Planning(并查集)
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) A. Fraction
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) B. Maxim Buys an Apartment
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)题解
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) D. Jury Meeting(贪心)
- Jury Meeting Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)(贪心,预处理?)
- Windows 更新安装 Windows 7 SP1失败错误代码80073712解决方法:
- FP-growth算法发现频繁项集(一)——构建FP树
- Python 中 变量的 is 和 == 符号的作用
- codeforces 603E(LCT+优先队列)
- 链表的常见操作入门(一)
- Codeforces Round #433 (Div. 1, based on Olympiad of Metropolises) C. Boredom(主席树)
- OpenGL2.0 和 OpenGL3.0 的不同与共同点
- JSP知识点汇总(一)
- 负载均衡
- zookeeper注册服务信息---获取IP地址及空闲端口(nodejs typescrip)
- 使用AppBarLayout+CollapsingToolbarLayout实现自定义工具栏折叠效果
- 对抗自编码
- 简单快速了解Vue.js的开发流程
- 优化mysql查询的方法