一维的情况:

排序后维护一个单调指针即可,时间复杂度$O(n\log n)$。

二维的情况:

旋转坐标系后转化为二维数点问题,扫描线+树状数组维护即可,时间复杂度$O(n\log n)$。

三维的情况:

将后两维旋转坐标系,对于每个x,预处理出横坐标为x的点的后两维的二维前缀和。

枚举一个点,再枚举另一个点的x,在相应坐标的二维前缀和里查询正方形内点的个数即可,时间复杂度$O(nm)$。

#include<cstdio>
#include<algorithm>
#define N 300010
using namespace std;
int n,m,i,D;long long ans;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
namespace task1{
int a[N],i,j;
void solve(){
for(i=1;i<=n;i++)read(a[i]);
sort(a+1,a+n+1);
for(i=j=1;i<=n;ans+=i-j,i++)while(a[i]-a[j]>D)j++;
}
}
namespace task2{
int m,k,i,x,y,z,bit[N],q[N],X,Y,b[N];
struct P{int x,y,z,t;P(){}P(int _x,int _y,int _z,int _t){x=_x,y=_y,z=_z,t=_t;}}a[N];
inline bool cmp(const P&a,const P&b){return a.x==b.x?a.t<b.t:a.x<b.x;}
inline int lower(int x){
int l=1,r=m,t,mid;
while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline void add(int x,int y){for(;x<=m;x+=x&-x)bit[x]+=y;}
inline int ask(int x){int t=0;for(;x;x-=x&-x)t+=bit[x];return t;}
void solve(){
for(m=0,z=D,i=1;i<=n;i++){
read(x),read(y),X=x+y,Y=x-y;
a[++m]=P(X,Y,0,i),b[m]=Y;
a[++m]=P(X+z,Y-z,Y+z,n+1),b[m]=Y-z;
a[++m]=P(X-z,Y-z,Y+z,0),b[m]=Y+z;
}
for(sort(a+1,a+m+1,cmp),sort(b+1,b+m+1),i=1;i<=m;i++){
if(a[i].t&&a[i].t<=n)ans+=ask(lower(a[i].y));
else{
a[i].y=lower(a[i].y),a[i].z=lower(a[i].z)+1;
if(a[i].t)add(a[i].y,-1),add(a[i].z,1);else add(a[i].y,1),add(a[i].z,-1);
}
}
ans=(ans-n)/2;
}
}
namespace task3{
int i,j,k,x,y,z,X,Y,a[N][3],s[76][152][152];
inline int ask(int x,int y){return s[j][max(min(x,150),0)][max(min(y,150),0)];}
void solve(){
for(i=1;i<=n;i++){
read(x),read(y),read(z),X=y+z,Y=y-z+75;
a[i][0]=x,a[i][1]=X,a[i][2]=Y;
s[x][X][Y]++;
}
for(i=1;i<=75;i++)for(j=1;j<=150;j++)for(k=1;k<=150;k++)s[i][j][k]+=s[i][j-1][k]+s[i][j][k-1]-s[i][j-1][k-1];
for(i=1;i<=n;i++)for(j=1;j<=75;j++)if(abs(a[i][0]-j)<=D){
x=D-abs(a[i][0]-j);
ans+=ask(a[i][1]+x,a[i][2]+x)-ask(a[i][1]-x-1,a[i][2]+x)-ask(a[i][1]+x,a[i][2]-x-1)+ask(a[i][1]-x-1,a[i][2]-x-1);
}
ans=(ans-n)/2;
}
}
int main(){
read(m),read(n),read(D),read(i);
if(m==1)task1::solve();
if(m==2)task2::solve();
if(m==3)task3::solve();
return printf("%lld",ans),0;
}

  

BZOJ1807 : [Ioi2007]Pairs 彼此能听得见的动物对数的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. android-监听网络状态

    1.注册一个广播接收器,监听网络状态private void Start() { IntentFilter filter = new IntentFilter(); filter.addAction( ...

  3. Android 监听wifi广播的两种方式

    1.XML中声明 <receiver android:name=".NetworkConnectChangedReceiver" >             <i ...

  4. ASCII字符集中的功能/控制字符

       ASCII字符集中的功能/控制字符     Function/Control Code/Character in ASCII Version: 2011-02-15 Author: gree ...

  5. Vijos1881闪烁的繁星 [线段树]

    P1881闪烁的繁星  背景 繁星闪烁着--深蓝的太空何曾听得见他们对语沉默中微光里他们深深的互相颂赞了 描述 繁星, 漫天的繁星.繁星排成一列, 我数一数呀, 一共有N只小星星呢. 星星们是听话的好 ...

  6. 关于Unity游戏开发方向找工作方面的一些个人看法

     这是个老生常谈,却又是谁绕不过去的话题,而对于每个人来说,所遇到的情况又不尽相同,别人的求职方式和路线不一定适合你,即使是背景很相似的两个人,有时候机遇也很重要. 我本人的工作经验只有一年,就业方式 ...

  7. 大冰--寻人启事--one

    看得懂的,都不是命运,说得清的,都不叫爱情. 忘得了的,都不是遗憾,听得见的,都不是伤心. 躲的开的,都不是缘分,猜得透的,都不叫人生.

  8. <转>技术团队新官上任之基层篇

    发表于2013-09-04 17:17| 10455次阅读| 来源<程序员>| 35 条评论| 作者高博 <程序员>杂志2013年9月刊技术团队管理EMC高博CTO 摘要:从技 ...

  9. Android之Notification介绍

    Notification就是在桌面的状态通知栏.这主要涉及三个主要类: Notification:设置通知的各个属性. NotificationManager:负责发送通知和取消通知 Notifica ...

随机推荐

  1. WPF 元素绑定

    1.什么是数据绑定数据绑定是一种关系,WPF程序从源对象中提取一些信息,并根据这些信息设置目标对象的属性,目标属性作为依赖项属性.源对象可以是任何内容,可以是另一个wpf内容,甚至是自行创建的纯数据对 ...

  2. Nmap备忘单:从探索到漏洞利用 Part1

    在侦查过程中,信息收集的初始阶段是扫描. 侦查是什么? 侦查是尽可能多的收集目标网络的信息.从黑客的角度来看,信息收集对攻击非常有帮助,一般来说可以收集到以下信息: 电子邮件.端口号.操作系统.运行的 ...

  3. 暑假热身 B. 下载测速

    最近,nono终于结束了每年一次的为期12个月的冬眠,醒来的第一件事就是——看电影!!nono发现最近一年出现了各种很好很强大的电影,例如这个.这个.还有这个. 于是nono直接把这些电影全部扔进了下 ...

  4. 【GoLang】GoLang 微服务、开源库等参考资料

    参考资料: GoLang书籍: https://github.com/dariubs/GoBooksGo名库: https://github.com/Unknwon/go-rock-libraries ...

  5. 【Network】一张图看懂 Reactor 与 Proactor 模型的区别

    首先来看看Reactor模式,Reactor模式应用于同步I/O的场景.我们以读操作为例来看看Reactor中的具体步骤:读取操作:1. 应用程序注册读就需事件和相关联的事件处理器2. 事件分离器等待 ...

  6. spring事物传播属性

    PROPAGATION_REQUIRED Support a current transaction; create a new one if none exists.  支持一个当前事务;如果不存在 ...

  7. sharepoint读取启用了追加功能的多行文本的历史版本记录

    当建立多行文本栏时,有个功能就是"追加对现有文本所做的更改",这个功能启用后,这个多行文本就只运行追加内容而不允许修改以前提交的内容.常常被应用在多个用户之间的协作.问题的追踪等记 ...

  8. IDEA 14快捷键

    1.ctrl+alt+左箭头.右箭头:返回到上次浏览的代码处(相当于Eclipse的alt+左右箭头) 编辑类: Ctrl+Space 基本代码实例(类.方法.变量) Ctrl + Shift + S ...

  9. java Long的iniValue出错

    Long l1 = 2500000000L; l1.intValue() 的值是负数 这里 System.out.println(Integer.MAX_VALUE); // 2147483647最大 ...

  10. 46. 对称子字符串的最大长度(ToDo)

    [题目] 输入一个字符串,输出该字符串中对称的子字符串的最大长度.比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4. [分析] 可能很多人都写过判断一个字符串 ...