星際旅行 20分 CCF CSP 20201209
阿新 • • 發佈:2021-02-09
技術標籤:CCF
我仔細算了一下,第一個20%的資料應該是過了,第二個20%的資料,就算是n,m取最大,使用的記憶體也不會超過5MB,
這個258.6MB的使用,讓我很迷,記憶體洩漏?無限遞迴?但我在我的程式碼根本看不出錯誤,服氣了。
思路:
設定一個Cmd陣列儲存所有命令(除了),一個Poi陣列儲存
#include<bits/stdc++.h>
#define Mod 1000000007
using namespace std;
enum{ADD,ENH,TUR,QUE
};
struct node
{
int type;
int l,r;
long long a,b,c,k;
node(){
};
node(int type,int l,int r,int a ,int b,int c,int k)
{
this->type=type;
this->l=l;
this->r=r;
this->a=a;
this->b=b;
this->c=c;
this->k=k;
}
};
struct po{
long long x,y,z;
int next_cmd;
po(){
};
po(int a,int b,int c)
{
this->x=a;
this-> y=b;
this->z=c;
}
po operator + (const po &a)
{
return po((this->x+a.x)%Mod,(this->y+a.y)%Mod,(this->z+a.z)%Mod);
}
po operator *(int k)
{
return po((this->x*k)%Mod,(this->y*k)%Mod,(this->z*k)%Mod);
}
};
po operator ! (po &a)
{
return po(a.y,a.z,a.x);
}
vector< node> Cmd;
int cmd_size;
po CountPoint(po & a,int num)
{
for(int i=a.next_cmd;i<cmd_size;i++)
{
if(Cmd[i].l<=num&&Cmd[i].r>=num)
{
switch(Cmd[i].type)
{
case ADD:
a=a+po(Cmd[i].a,Cmd[i].b,Cmd[i].c);
break;
case ENH:
a=a*Cmd[i].k;
break;
case TUR:
a=!a;
break;
}
}
}
a.next_cmd=cmd_size;
return a;
}
long long CountDistance(po &a)
{
return ((a.x*a.x)%Mod+(a.y*a.y)%Mod+(a.z*a.z)%Mod)%Mod;
}
int main()
{
int n,m;
cin>>n>>m;
po Poi[n+5]={0};
int type,l,r,a,b,c,k;
while(m--)
{
cin>>type>>l>>r;
type--;
switch(type)
{
case ADD:
cin>>a>>b>>c;
Cmd.push_back(node(type,l,r,a,b,c,0));
break;
case ENH:
cin>>k;
Cmd.push_back(node(type,l,r,0,0,0,k));
break;
case TUR:
Cmd.push_back(node(type,l,r,0,0,0,0));
break;
case QUE:
cmd_size=Cmd.size();
po dis=po(0,0,0);
for(int i=l;i<=r;i++)
{
dis=dis+CountPoint(Poi[i],i);
}
cout<<CountDistance(dis)<<endl;
break;
}
}
return 0;
}