题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2441

首先要注意到x1>x3且x5>x3(要是没有这个设定就是树状数组水题了。。

这题正反做两个V乘起来就是答案了。。

对y排序,每一个点找出在它左上方的点的个数记为sum,然后只要我们每次访问一个点的时候就把它对于在它右边的点的贡献全部删掉,那么询问一个点的答案就是在它左边所有点的sum之和了。

具体写起来比较烦。。

Orz http://blog.csdn.net/u012288458/article/details/48880559

按id开线段树,每个点维护两个域分别表示相同点中最左那个点的id和第一个比它大的点的id

首先这个算点的贡献,要这个点已经被计算过才可以减掉贡献,可以开一个变量来记录当前区间有多少个点已经被计算过。

然后减贡献的时候,可以让这个点右边的所有的点都减掉贡献。然后加上贡献的时候只要也加上左边所有点点数就可以了。

但是这样做的话要注意分开来做。毕竟贡献要全部减完才能来计算答案。。

#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define ll long long
#define low(i) (i&(-i))
#define maxn 200500
#define mm 1000000007
#define inf 2000000000
using namespace std;
struct node{int l,r,len; ll tag,sum;
}t[maxn*];
struct data{int x,x2,y,id;
}a[maxn];
ll c[maxn],f[maxn][];
int n,tot,b[maxn];
int read(){
int x=,f=; char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-; ch=getchar();}
while (isdigit(ch)){x=x*+ch-''; ch=getchar();}
return x*f;
}
bool cmp(data a,data b){
return a.x<b.x;
}
bool cmp2(data a,data b){
return a.y<b.y;
}
void up(int i){
if (t[i].l==t[i].r) return;
t[i].sum=;
t[i].len=t[i*].len+t[i*+].len;
if (t[i*].len) t[i].sum=(t[i].sum+t[i*].sum)%mm;
if (t[i*+].len) t[i].sum=(t[i].sum+t[i*+].sum)%mm;
}
void push(int i,ll val){
t[i].tag=(t[i].tag+val)%mm;
t[i].sum=(t[i].sum+1LL*val*t[i].len)%mm;
}
void Down(int i){
if (t[i].l==t[i].r) return;
if (t[i].tag){
push(i*,t[i].tag); push(i*+,t[i].tag);
t[i].tag=;
}
}
ll query(int i,int L,int R){
if (L>R) return ;
if (t[i].len==) return ;
int l=t[i].l,r=t[i].r,mid=(l+r)/;
Down(i);
if (L<=l&&r<=R) return t[i].sum;
if (R<=mid) return query(i*,L,R);
else if (L>mid) return query(i*+,L,R);
else return (query(i*,L,mid)+query(i*+,mid+,R))%mm;
}
void change(int i,int pos,ll val){
Down(i);
if (t[i].l==t[i].r) {t[i].len=; t[i].sum=(t[i].tag+val)%mm; return;}
int mid=(t[i].l+t[i].r)/;
if (pos<=mid) change(i*,pos,val);
else change(i*+,pos,val);
up(i);
}
void change2(int i,int L,int R,ll val){
if (L>R) return;
Down(i);
int l=t[i].l,r=t[i].r,mid=(l+r)/;
if (L<=l&&r<=R){
push(i,val); return;
}
if (R<=mid) change2(i*,L,R,val);
else if (L>mid) change2(i*+,L,R,val);
else change2(i*,L,mid,val),change2(i*+,mid+,R,val);
up(i);
}
void build(int i,int l,int r){
t[i].l=l; t[i].r=r;
t[i].sum=t[i].tag=t[i].len=;
if (l==r) return;
int mid=(l+r)/;
build(i*,l,mid); build(i*+,mid+,r);
} void solve(){
build(,,n);
sort(a+,a++n,cmp2);
rep(i,,n){
int j=i;
while (j<n&&a[i].y==a[j+].y) j++;
rep(k,i,j) change2(,a[k].x2,n,-);
rep(k,i,j) f[a[k].id][]=query(,,a[k].x-);
rep(k,i,j) change(,a[k].id,a[k].x-);
i=j;
}
}
void solve2(){
build(,,n);
sort(a+,a++n,cmp2);
rep(i,,n){
int j=i;
while (j<n&&a[i].y==a[j+].y) j++;
rep(k,i,j) change2(,,a[k].x-,-);
rep(k,i,j) f[a[k].id][]=query(,a[k].x2,n);
rep(k,i,j) change(,a[k].id,n-a[k].x2+);
i=j;
}
} int main(){
n=read();
rep(i,,n){
a[i].x=read(); a[i].y=read();
b[++tot]=a[i].x;
}
b[++tot]=inf;
sort(b+,b++tot);
sort(a+,a++n,cmp);
rep(i,,n) a[i].x2=upper_bound(b+,b++tot,a[i].x)-b,a[i].x=lower_bound(b+,b++tot,a[i].x)-b,a[i].id=i;
solve();
solve2();
ll ans=;
rep(i,,n) ans=(ans+f[i][]*f[i][]%mm)%mm;
printf("%lld\n",ans);
return ;
}

BZOJ2441: [中山市选2011]小W的问题的更多相关文章

  1. bzoj2441 [中山市选2011]小W的问题(debug中)

    2441: [中山市选2011]小W的问题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 487  Solved: 186[Submit][Statu ...

  2. 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)

    传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...

  3. bzoj 2441 [中山市选2011]小W的问题

    bzoj 2441 [中山市选2011]小W的问题 Description 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个"W"出来.具 ...

  4. bzoj2441【中山市选】小W的问题

    题目描述 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个“W”出来.具体来说,对于五个不同的点(x1, y1), (x2, y2), (x3, y3), ( ...

  5. BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3028  Solved: 1460[Submit][Sta ...

  6. BZOJ 2440: [中山市选2011]完全平方数( 二分答案 + 容斥原理 + 莫比乌斯函数 )

    先二分答案m,<=m的有m-∑(m/pi*pi)+∑(m/pi*pi*pj*pj)-……个符合题意的(容斥原理), 容斥系数就是莫比乌斯函数μ(预处理)... ----------------- ...

  7. BZOJ 2440 [中山市选2011]完全平方数 (二分 + 莫比乌斯函数)

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4805  Solved: 2325[Submit][Sta ...

  8. 【BZOJ 2440】 2440: [中山市选2011]完全平方数 (二分+容斥原理+莫比乌斯函数)

    2440: [中山市选2011]完全平方数 Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数 ...

  9. BZOJ2440: [中山市选2011]完全平方数(莫比乌斯+容斥原理)

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4920  Solved: 2389[Submit][Sta ...

随机推荐

  1. less基础语法

    变量 //->LESS代码 @link-color: #428bca; @link-color-hover: darken(@link-color, 10%); a { color: @link ...

  2. OC学习10——内存管理

    1.对于面向对象的语言,程序需要不断地创建对象.这些对象都是保存在堆内存中,而我们的指针变量中保存的是这些对象在堆内存中的地址,当该对象使用结束之后,指针变量指向其他对象或者指向nil时,这个对象将称 ...

  3. iOS 类似朋友圈的图片浏览器SDPhotoBrowser

    SDPhotoBrowser.Demo 1.在文件SDBrowserImageView.m中有用SDWebImage到网络加载图片 需要的注释去掉即可 #import "ViewContro ...

  4. iOS App稳定性指标及监测

    一个App的稳定性,主要决定于整体的系统架构设计,同时也不可忽略编程的细节,正所谓"千里之堤,溃于蚁穴",一旦考虑不周,看似无关紧要的代码片段可能会带来整体软件系统的崩溃.尤其因为 ...

  5. boost::format(字符串格式化库)

    这段时间学习boost库的使用,撰文一方面留以备用,另一方面就是shared精神. format主要是用来格式化std::string字符串以及配合std::cout代替C语言printf() 使用f ...

  6. arcgis api for js热力图优化篇-不依赖地图服务

    前面我写过一篇文章,介绍如何实现arcgis api的热力图效果,但是依赖arcgis server发布的地图服务来获取热力图的数据源.实际应用中,很多业务数据来源数据库,并不一定是从地图服务来获取的 ...

  7. HttpClient4.5 post请求xml到服务器

    1.加入HttpClient4.5和junit依赖包 <dependencies> <dependency> <groupId>org.apache.httpcom ...

  8. lua 实现tableToString

    function tableToString(studentNum) local str = "{ " str = str.."\n" for k, v in ...

  9. redis中使用 check-and-set 操作实现乐观锁

    WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为. 被 WATCH 的键会被监视,并会发觉这些键是否被改动过了. 如果有至少一个被监视的键在 EXEC 执行之前 ...

  10. android的ADK下载地址

    把下面所有的包下载到temp目录下进行安装. 用代理http://ppdaili.com/https://dl-ssl.google.com/android/repository/repository ...