标签:树状 int REP 1191F CodeForces Tokitsukaze 数组 集合 include
大意: 给定$n$个平面点, 定义集合$S(l,r,a)$表示横坐标$[l,r]$纵坐标$[a,\infty]$内的所有点. 求可以得到多少种不同的集合.
从上往下枚举底层最右侧点, 树状数组统计贡献.
#include <iostream> #include <algorithm> #include <cstdio> #define REP(i,a,n) for(int i=a;i<=n;++i) using namespace std; typedef long long ll; const int N = 1e6+10, INF = 0x3f3f3f3f; int n, c[N], vis[N], b[N]; struct _ { int x,y; bool operator < (const _&rhs) const { if (y!=rhs.y) return y>rhs.y; return x<rhs.x; } } a[N]; int ID(int x) { return lower_bound(b+1,b+1+*b,x)-b; } int qry(int x) { int r = 0; for (; x; x^=x&-x) r+=c[x]; return r; } int qry(int l, int r) { return qry(ID(r))-qry(ID(l-1)); } void add(int x) { x = ID(x); if (!vis[x]) { vis[x] = 1; for (; x<=*b; x+=x&-x) ++c[x]; } } int main() { scanf("%d", &n); REP(i,1,n) { scanf("%d%d",&a[i].x,&a[i].y); b[++*b]=a[i].x; b[++*b]=a[i].x-1; } b[++*b]=0,b[++*b]=INF; sort(b+1,b+1+*b),*b=unique(b+1,b+1+*b)-b-1; sort(a+1,a+1+n); ll ans = 0; REP(i,1,n) { int j=i; while (j<n&&a[j+1].y==a[i].y) ++j; REP(k,i,j) { int L = qry(1,a[k].x-1); int R = qry(a[k].x+1,k==j?INF:a[k+1].x-1); ans += (ll)(L+1)*(R+1); add(a[k].x); } i = j; } printf("%lld\n", ans); }
标签:树状,int,REP,1191F,CodeForces,Tokitsukaze,数组,集合,include 来源: https://www.cnblogs.com/uid001/p/11183907.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。