Description
Ω
城的布局可以看作一个
w
×
h
的网格。在
Ω
城的上空有
n
个卫星,第
i
个卫星的高度在网格
(
x
i
, y
i
) 上空高度为 h
i
的位置。 (在本题中,你不需要思考这些卫星为什么可以同步运转) 你作为 Ω
城的市长小
ω
,需要建造一个通信中心。通信中心的位置如果在
(
p, q
)
,它与第
i
个卫星的通 信代价为 h
i
·
a
|
p x
i
|
·
b
|
q y
i
|
。 现在你有 q
个建造通信中心的方案,你需要对每个方案,求出它与所有卫星通信代价之和(答案对
M
取
模)。
Input
从文件
satellite.in
中读入数据。 第一行输入七个正整数 n, q, w, h, M, a, b
。 接下来 n
行,每行输入三个正整数
h
i
, x
i
, y
i
,表示第
i
个卫星的参数。 接下来 q
行,每行输入两个正整数
p
i
, q
i
,表示第
i
个建造方案的参数。
Output
输出到文件
satellite.out
中。 输出 q
行,表示每种方案的答案。
Sample Input
4 1 9 9 100000000 2 3
1 3 4
2 1 9
1 3 5
2 4 6
5 5
Sample Output
2620
第
4
页 共
9
页
模拟赛
T2
最简单辣快来做(
satellite
)
【样例
1
解释】
与
4
个卫星的通信代价分别为
12
,
2592
,
4
,
12
,总和为
2620
。
【样例
2
】
见选手目录下的
satellite/satellite2.in
与
satellite/satellite2.ans
。
Data Constraint
对于所有数据,保证 1 ≤ n ≤ 2000 , 1 ≤ q ≤ 2 × 10 5 , 10 8 ≤ M ≤ 10 9 , 1 ≤ a, b, h i < M , 1 ≤ x i , p i ≤ w ,
1
≤
y
i
, q
i
≤
h
,
1
≤
w, h
≤
10
9
。
•
对于第
1 ~ 8
组数据,保证
n
≤
1000
,
nq
≤
100000
。
•
对于第
9 ~ 12
组数据,保证
n
≤
1000
,
w, h
≤
2000
。
•
对于第
13 ~ 18
组数据,保证
n
≤
1000
。
•
对于第
19 ~ 20
组数据,没有特殊限制。
对于编号为奇数的测试点,保证
a, b
与
M
互质
Solutoin
考虑到n只有2000,因此把所有的点的横坐标、纵坐标分别抽出来,横竖相连的这些点才有用,对于每个询问点,二分出其所在的相对位置,预处理出其相对位置上下左右四个方向的所有点的答案,最后再乘以当前点的真实坐标和上下左右最近的参考点的坐标的贡献即可。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define I int
#define ll long long
#define F(i,a,b) for(I i=a;i<=b;i++)
#define Fd(i,a,b) for(I i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof a)
#define N 2010
using namespace std;
I n,Q,M,a,b,x,y,z,tw,th,na,nb,l,r,mid,lx,rx,ly,ry,w[N],h[N],sw[N],sh[N],ans,f[N][N],g[N][N],u[N][N],v[N][N];
struct node{I x,y,z;}s[N];
I R(I &x){
x=0;I w=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') w=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*=w;
}
I cmp(node p,node q){return p.x<q.x||q.x==p.x&&q.y<p.y;}
I ksm(I x,I k){
I s=1;
for(;k>0;k>>=1,x=1ll*x*x%M) if(k&1) s=1ll*s*x%M;
return s;
}
I main(){
freopen("satellite.in","r",stdin);
freopen("satellite.out","w",stdout);
R(n),R(Q),R(tw),R(th),R(M),R(a),R(b);
F(i,1,n){R(z);s[i]=node{R(x),R(y),z};w[i]=x,h[i]=y;}
sort(s+1,s+1+n,cmp);
sort(w+1,w+1+n),sort(h+1,h+1+n);
tw=th=0;
F(i,1,n) if(w[i]!=w[i-1]){
w[++tw]=w[i];
sw[tw]=ksm(a,w[tw]-w[tw-1]);
}
F(i,1,n) if(h[i]!=h[i-1]){
h[++th]=h[i];
sh[th]=ksm(b,h[th]-h[th-1]);
}
F(i,1,n){
for(l=1,r=tw,mid=l+r>>1;l<=r;mid=l+r>>1) (s[i].x>=w[mid])?l=(x=mid)+1:r=mid-1;
for(l=1,r=th,mid=l+r>>1;l<=r;mid=l+r>>1) (s[i].y>=h[mid])?l=(y=mid)+1:r=mid-1;
f[x][y]=g[x][y]=u[x][y]=v[x][y]=s[i].z;
}
F(i,1,tw){
F(j,1,th){
na=sw[i],nb=sh[j];
f[i][j]=1ll*(f[i][j]+1ll*f[i-1][j]*na%M)%M;
f[i][j]=1ll*(f[i][j]+1ll*f[i][j-1]*nb%M)%M;
f[i][j]=1ll*(f[i][j]-1ll*f[i-1][j-1]*na%M*nb%M+M)%M;
}
Fd(j,th,1){
na=sw[i],nb=sh[j+1];
v[i][j]=1ll*(v[i][j]+1ll*v[i-1][j]*na%M)%M;
v[i][j]=1ll*(v[i][j]+1ll*v[i][j+1]*nb%M)%M;
v[i][j]=1ll*(v[i][j]-1ll*v[i-1][j+1]*na%M*nb%M+M)%M;
}
}
Fd(i,tw,1){
F(j,1,th){
na=sw[i+1],nb=sh[j];
u[i][j]=1ll*(u[i][j]+1ll*u[i+1][j]*na%M)%M;
u[i][j]=1ll*(u[i][j]+1ll*u[i][j-1]*nb%M)%M;
u[i][j]=1ll*(u[i][j]-1ll*u[i+1][j-1]*na%M*nb%M+M)%M;
}
Fd(j,th,1){
na=sw[i+1],nb=sh[j+1];
g[i][j]=1ll*(g[i][j]+1ll*g[i+1][j]*na%M)%M;
g[i][j]=1ll*(g[i][j]+1ll*g[i][j+1]*nb%M)%M;
g[i][j]=1ll*(g[i][j]-1ll*g[i+1][j+1]*na%M*nb%M+M)%M;
}
}
F(i,1,Q){
R(x),R(y);
ans=lx=ly=0,rx=tw+1,ry=th+1;
for(l=1,r=tw,mid=l+r>>1;l<=r;mid=l+r>>1) (x>=w[mid])?l=(lx=mid)+1:r=mid-1;
for(l=1,r=tw,mid=l+r>>1;l<=r;mid=l+r>>1) (x<=w[mid])?r=(rx=mid)-1:l=mid+1;
for(l=1,r=th,mid=l+r>>1;l<=r;mid=l+r>>1) (y>=h[mid])?l=(ly=mid)+1:r=mid-1;
for(l=1,r=th,mid=l+r>>1;l<=r;mid=l+r>>1) (y<=h[mid])?r=(ry=mid)-1:l=mid+1;
if(lx==rx&&ly==ry){
ans=1ll*(f[lx][ly]+
1ll*g[lx+1][ly+1]*sw[lx+1]%M*sh[ly+1]%M+
1ll*u[lx+1][ly]*sw[lx+1]%M+
1ll*v[lx][ly+1]*sh[ly+1]%M)%M;
}
else if(lx==rx&&ly!=ry){
I lf=ksm(b,y-h[ly]),rg=ksm(b,h[ry]-y);
ans=1ll*(1ll*f[lx][ly]*lf%M+
1ll*v[lx][ry]*rg%M+
1ll*u[lx+1][ly]*sw[lx+1]%M*lf%M+
1ll*g[lx+1][ly+1]*sw[lx+1]%M*rg%M)%M;
}
else if(lx!=rx&&ly==ry){
I up=ksm(a,x-w[lx]),dn=ksm(a,w[rx]-x);
ans=1ll*(1ll*f[lx][ly]*up%M+
1ll*v[lx][ly+1]*sh[ly+1]%M*up%M+
1ll*u[rx][ly]*dn%M+
1ll*g[rx][ly+1]*sh[ly+1]%M*dn%M)%M;
}
else{
I up=ksm(a,x-w[lx]),lf=ksm(b,y-h[ly]),dn=ksm(a,w[rx]-x),rg=ksm(b,h[ry]-y);
ans=1ll*(1ll*f[lx][ly]*up%M*lf%M+
1ll*v[lx][ry]*up%M*rg%M+
1ll*u[rx][ly]*dn%M*lf%M+
1ll*g[rx][ry]*dn%M*rg%M)%M;
}
printf("%d\n",ans);
}
return 0;
}