1. 程式人生 > 其它 >星際旅行 20分 CCF CSP 20201209

星際旅行 20分 CCF CSP 20201209

技術標籤: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; }