BZOJ2441: [中山市选2011]小W的问题
题目: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的问题的更多相关文章
- bzoj2441 [中山市选2011]小W的问题(debug中)
2441: [中山市选2011]小W的问题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 487 Solved: 186[Submit][Statu ...
- 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)
传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...
- bzoj 2441 [中山市选2011]小W的问题
bzoj 2441 [中山市选2011]小W的问题 Description 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个"W"出来.具 ...
- bzoj2441【中山市选】小W的问题
题目描述 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个“W”出来.具体来说,对于五个不同的点(x1, y1), (x2, y2), (x3, y3), ( ...
- BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3028 Solved: 1460[Submit][Sta ...
- BZOJ 2440: [中山市选2011]完全平方数( 二分答案 + 容斥原理 + 莫比乌斯函数 )
先二分答案m,<=m的有m-∑(m/pi*pi)+∑(m/pi*pi*pj*pj)-……个符合题意的(容斥原理), 容斥系数就是莫比乌斯函数μ(预处理)... ----------------- ...
- BZOJ 2440 [中山市选2011]完全平方数 (二分 + 莫比乌斯函数)
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4805 Solved: 2325[Submit][Sta ...
- 【BZOJ 2440】 2440: [中山市选2011]完全平方数 (二分+容斥原理+莫比乌斯函数)
2440: [中山市选2011]完全平方数 Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数 ...
- BZOJ2440: [中山市选2011]完全平方数(莫比乌斯+容斥原理)
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4920 Solved: 2389[Submit][Sta ...
随机推荐
- 函数的非固定参数-Day3
一.函数非固定参数 1.默认函数,我们在传参之前,选给参数指定一个默认的值.默认参数特点是非必须传递的. def test(x,y=2): print(x) print(y) print(" ...
- spring boot使用profile来区分正式环境配置文件与测试环境配置文件
转载请在页首注明作者与出处 一:前言 经常在开发的时候,项目中的配置文件,在个人开发的时候有一套配置文件,在测试环境有一套配置文件,在正式环境有一套配置文件,这个时候如果配置文件复杂,需要改的东西就特 ...
- Error Running Git Empty git --version output:IDEA关联GitHub时出现这个错误
刚刚学习使用idea中,想要把自己的项目上传到github,遇到这样一个问题,先记录下来,到时候解决了在把方法贴出来. ---------------------------------------- ...
- spring boot入门 -- 介绍和第一个例子
"越来越多的企业选择使用spring boot 开发系统,spring boot牛在什么地方?难不难学?心动不如行动,让我们一起开始学习吧!" 使用Spring boot ,可以轻 ...
- ArcGIS API for JavaScript 4.2学习笔记[22] 使用【QueryTask类】进行空间查询 / 弹窗样式
上一篇写道,使用Query类进行查询featureLayer图层的要素,也简单介绍了QueryTask类的使用. 这一篇博文继续推进,使用Query类和QueryTask类进行空间查询,查询USA的著 ...
- Python学习(三):迭代器、生成器、装饰器、递归、算法、正则
1.迭代器 迭代器是访问集合的一种方式,迭代对象从集合的第一个元素开始访问,直到元素被访问结束,迭代器只能往前不能后退,最大的优点是不要求事先准备好整个迭代过程中的元素,这个特点使得它特别适合用于遍历 ...
- java数组去重
java数组去重 1.创建新数组,用于保存比较结果 2.设定随机数组最大最小值 3.开始去重 4.计算去重所需时间 package org.zheng.collection; import java. ...
- java RTTI笔记 之Class学习笔记(摘自java编程思想)
1.java 使用Class对象来执行其RTTI.java 中每个类在编译后都会对应产生一个Class对象(更恰当地说是被保存在一个同名的.class文件中),甚至void和基本类型也都对应一个cla ...
- 解决CUICatalog: Invalid asset name supplied问题
这个问题其实是老问题,产生原因就是因为在使用的时候 [UIImage imageNamed:]时,图片不存在或者传入的图片名为nil.
- PCA主成份分析
1 背景介绍 真实的训练数据总是存在各种各样的问题: 1. 比如拿到一个汽车的样本,里面既有以“千米/每小时”度量的最大速度特征,也有“英里/小时”的最大速度特征,显然这两个特征有一个多余. 2. ...