CCF- CSP 202012-5星际旅行 80分骗分题解

CCF- CSP 202012-5星际旅行 80分骗分题解

题目链接:202012-5星际旅行

思路:

  • 题目条理比较清晰,对于这种第五题,我们在考试时尽可能拿更多的分(第5题拿满分我不敢奢望hhhh),在此只提出一些应该注意的小细节
  • 数据类型采用unsigned long long数据范围比long long更大,如果只采用long long 最后只有70分
  • 多次采用取模运算,在操作2乘法计算完后,进行取模操作,否则只有20分
  • 在操作4后,求得指定区间内的坐标和后,进行取模运算
  • 在计算平方和时:1.计算完单一坐标的平方后取模,2.计算完所有的坐标的平方和后取模

具体代码:

#include
#include
using namespace std;
typedef unsigned long long ULL;
const ULL N = 1e5+10,mod = 1e9+7;
ULL n,m;
struct node{
    ULL x,y,z;
}node[N];
int main()
{
    cin>>n>>m;
    while(m--)
    {
        ULL x;
        cin>>x;
        if(x==1)
        {
            ULL l,r,a,b,c;
            cin>>l>>r>>a>>b>>c;
            for(ULL i=l;i<=r;i++)
            {
                node[i].x+=a;
                node[i].y+=b;
                node[i].z+=c;
            }
        }
        else if(x==2)
        {
            ULL l,r,k;
            cin>>l>>r>>k;
            for(ULL i=l;i<=r;i++)
            {
                node[i].x*=k;
                node[i].x = node[i].x%mod;
                node[i].y*=k;
                node[i].y = node[i].y%mod;
                node[i].z*=k;
                node[i].z = node[i].z%mod;
            }
        }
        else if(x==3)
        {
            ULL l,r;
            cin>>l>>r;
            for(ULL i=l;i<=r;i++)
            {
                ULL x_ = node[i].x;
                ULL y_ = node[i].y;
                ULL z_ = node[i].z;
                node[i].x = y_;
                node[i].y = z_;
                node[i].z = x_;
            }
        }
        else if(x==4)
        {
            ULL l,r;
            cin>>l>>r;
            ULL x_ = 0,y_ = 0,z_ = 0;
            for(ULL i=l;i<=r;i++)
            {
                x_+=node[i].x;
                y_+=node[i].y;
                z_+=node[i].z;
            }
            x_ = x_%mod;
            y_ = y_%mod;
            z_ = z_%mod;
            
            ULL s = (x_*x_%mod+y_*y_%mod+z_*z_%mod)%mod;
            cout<<s<<endl;
        }
    }
}

你可能感兴趣的:(CCF-CSP,c++,算法,csp)