6880. 【2020.11.21提高组模拟】T2 最简单辣快来做(satellite)

63 篇文章 0 订阅

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;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值