问题描述
试题编号: | 202012-5 |
---|---|
试题名称: | 星际旅行 |
时间限制: | 3.0s |
内存限制: | 512.0MB |
问题描述: | 题目描述乔帝要规划一次星际旅行,星际空间可以视为一个 3 维坐标系,乔帝有 n(n≤1,000,000,000) 个动力装置排成一行(下标从 1 到 n )。第 i 个动力装置可以让他的飞船 3 个维度的坐标分别增加 xi,yi,zi 。一开始这些动力装置的所有参数都是 0 。在规划过程中,乔帝可能会对动力装置进行调整,也可能会对一些动力装置的动力进行评估。具体来说,乔帝会进行 m(m≤40000) 次操作,每次操作可能是以下四种操作之一:动力增加:指定一个区间 [L,R] 和三个参数 a,b,c ,令区间内所有动力装置的3维坐标分别增加 a,b,c动力强化:指定一个区间 [L,R] 和一个参数 k ,令区间内所有动力装置的3维坐标分别乘 k动力转向:指定一个区间 [L,R] ,令区间内所有动力装置的 x,y,z 坐标分别变为原来的 y 坐标, z 坐标,x 坐标动力查询:指定一个区间 [L,R] ,询问如果使用区间内所有动力装置各一次能将乔帝送到离起点多远的地方(输出距离的平方除以1,000,000,007的余数)输入格式从标准输入读入数据。第一行包含两个正整数 n,m。接下来 m 行,每行用若干个空格分隔的整数表示一个操作。每行的第一个整数表示这次进行的是哪一种操作,1,2,3,4分别表示动力增加、动力强化、动力转向、动力查询。每行的接下来两个整数表示 L,R,含义如上面所述。每行接下来若干个整数,根据操作类型确定,为a,b,c或k或空。输出格式输出到标准输出。对于每个动力查询操作,输出一行,包含一个整数,表示查询的答案。样例1输入5 5 1 2 4 5 6 7 3 5 5 2 1 2 4 4 1 3 4 2 5 Data样例1输出2750 3960 Data样例1解释一共有5个动力装置。对于第1个操作,令第2,3,4个动力装置的动力变为(5,6,7)。对于第2个操作,令第5个动力装置转向,为(0,0,0)。对于第3个操作,令第1,2个动力装置变为原来的4倍,第一个变为(0,0,0),第二个变为(20,24,28)。对于第4个操作,是查询,送到离起点(0+20+5,0+24+6,0+28+7),距离的平方为2750。对于第5个操作,也是查询,送到离起点(20+5+5+0,24+6+6+0,28+7+7+0),距离的平方为3960。子任务对于 20% 的数据,n,m≤1000;对于另外 20% 的数据,n≤100000,且只包含第1,4种操作;对于另外 20% 的数据,n≤100000,且只包含第1,2,4种操作;对于另外 20% 的数据,n≤100000;对于另外 20% 的数据,没有特殊性质。所有输入的数字都在 [1,1000000000]范围内。所有的数据中 1≤m≤40000。所有的操作满足 1≤L≤R≤n。 |
80分暴力题解
#include <iostream>
#include<vector>
#define ll unsigned long long
#define mod 1000000007
using namespace std;
int kl=0;
typedef struct
{
ll x;
ll y;
ll z;
}node;
vector<node> a(10000000);
int ch,res,f;
inline ll read()
{
res=0,f=1;
ch = getchar();
//printf("%c",ch);
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') {f=-1;
ch = getchar();}
while(ch>='0'&&ch<='9')
{
res*=10;
res+=(ch-'0');
ch=getchar();
}
return f*res;
}
ll lb,rb,xl,yl,zl;
void inspeed()
{
lb=read(),rb=read(),xl=read(),yl=read(),zl=read();
for(int i=lb;i<=rb;i++)
{
a[i].x+=xl;
a[i].y+=yl;
a[i].z+=zl;
}
}
int k;
void mulspeed()
{
lb=read(),rb=read(),k=read();
for(int i=lb;i<=rb;i++)
{
a[i].x=(k*a[i].x)%mod;
a[i].y=(k*a[i].y)%mod;
a[i].z=(k*a[i].z)%mod;
}
}
void tolspeed()
{
lb=read(),rb=read();
for(int i=lb;i<=rb;i++)
{
xl=a[i].x;
a[i].x=a[i].y;
a[i].y=a[i].z;
a[i].z=xl;
}
}
void searchl()
{
lb=read(),rb=read();
xl=yl=zl=0;
for(int i=lb;i<=rb;i++)
{
xl=(xl+a[i].x);
yl=(yl+a[i].y);
zl=(zl+a[i].z);
}
xl=xl%mod,yl=yl%mod,zl=zl%mod;
printf("%lld\n",(xl*xl%mod+yl*yl%mod+zl*zl%mod)%mod);
kl++;
}
int main()
{
ll n,m;
cin>>n>>m;
ll op,lb,rb,k,a,b,c;
for(int i=1;i<=m;i++)
{
op=read();
switch(op)
{
case 1:inspeed();break;
case 2:mulspeed();break;
case 3:tolspeed();break;
case 4:searchl();break;
}
}
return 0;
}