题目: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. ArcGIS API for JavaScript 4.3 与ArcGIS Server联动使用【地图服务】

    [前言] 有好些网友问我怎么使用Server发布的地图服务了,其实非常的简单. 我在这里先声明:不提供Server软件,需要的请自行使用互联网搜索资源: 不阐述Server如何发布各各种服务,但是我会 ...

  2. bzoj 1492: [NOI2007]货币兑换Cash

    Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...

  3. lesson - 2 笔记 yum /single /rescue /

    一. yum  作用:                     yum 命令是在Fedora 和RedHat 以及SUSE 中基于rpm 的软件包管理器,它可以使系统管理人员交互和自动化地更新与管理R ...

  4. 初识JavaScript(一)

    初识JavaScript(一) 最近由于工作的需要的原因,我从一个写后台的现在让我转到写前端,再加上我的js部分特别的差,所以我现在开始学习js部分的知识. 我的第一篇博文就这样开始写了.俗话说,千里 ...

  5. Tomcat安装和目录简介

    要知道动态的网页必须要有服务器的支撑! 1.知名的java web服务器 Tomcat:Apache组织发布,免费开源的,轻量级 JBoss.WebLogic是商用的,价格较高,但相对于开源的更加稳定 ...

  6. js控制图片自动缩放,实现铺满盒子,不变形,完全局中

    此js一般用于控制图片铺满盒子,但是比例不变,并且绝对局中原理:判断图片的高宽与盒子高宽的大小的关系,然后通过比例来控制图片的缩放及定位<!DOCTYPE html PUBLIC "- ...

  7. eclipse 更换 JDK 版本后报错

    在实际开发过程中,可能由于项目的需要,我们需要更换 JDK 的版本.但是更换后会报错,如下: Java compiler level does not match the version of the ...

  8. 让你彻底弄清offset

    很多初学者对于JavaScript中的offset.scroll.client一直弄不明白,虽然网上到处都可以看一张图(图1),但这张图太多太杂,并且由于浏览器差异性,图示也不完全正确. 图一 不知道 ...

  9. requireJS(版本是2.1.15)学习教程(一)

    一:为什么要使用requireJS? 很久之前,我们所有的JS文件写到一个js文件里面去进行加载,但是当业务越来越复杂的时候,需要分成多个JS文件进行加载,比如在页面中head内分别引入a.js,b. ...

  10. 使用performance monitor 查看 每一个cpu core的cpu time

    使用performance monitor 查看 每一个cpu core的cpu time: 打开performance monitor,添加 counter 如下 运行一段cpu bound 的代码 ...