牛客算法周周练18小阳的贝壳

自己的代码超时了,看到题解要使用线段树,不会。

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <stdio.h>
int maxFun(int a, int b)
{
    
    
    return a>b?a:b;
}




int gcd(int a,int b)
{
    
    
    int temp;
 if(a<b)         //用a来存大数
 {
    
    
  temp=a;
  a=b;
  b=temp;
 }
 while(b!=0)
 {
    
    
  temp=a%b;
  a=b;
  b=temp;
 }
 return a;
}

using namespace std;



void printv(vector<int> b)
{
    
    
    for(int i=0;i<b.size();i++)
    {
    
    
        cout << b[i] << " ";
    }
    cout << endl;
}
int main()
{
    
    
    int n, m;
    while(scanf("%d %d",&n, &m) != EOF)
    {
    
    
    
     vector<int> b;
    for(int i =0;i<n;i++)
    {
    
    
        int temp;
        scanf("%d", &temp);
        b.push_back(temp);
    }
    
    for(int i =0;i<m;i++)
    {
    
    
        int choice;
        scanf("%d", &choice);
        if(1 == choice)
        {
    
    
            int l, r;
            scanf("%d %d", &l, &r);
            int x;
            scanf("%d", &x);
            l--;r--;
            for(int j = l;j<=r;j++)
            {
    
    
                b[j] += x;
            }
        }
        else if(2 == choice)
        {
    
    
            int l, r;
            scanf("%d %d", &l, &r);
            l--;r--;
            if(l == r)
            {
    
    
                printf("%d\n", 0);continue;
            }
            int maxsub = -1;
            for(int j = l+1;j<=r;j++)
            {
    
    
                maxsub = maxFun(maxsub, abs(b[j]-b[j-1]));
            }
            printf("%d\n", maxsub);
        }
        else if(3 == choice)
        {
    
    
            int l, r;
            scanf("%d %d", &l, &r);
            l--;r--;
            vector<int> tmp;
            for(int j = r;j>=l;j--)
            {
    
    
                tmp.push_back(b[j]);
            }
            if(tmp.size() == 1)
            {
    
    printf("%d\n", tmp[0]);
                continue;
            }
            else if(tmp.size() == 2)
            {
    
    
                printf("%d\n", gcd(tmp[0], tmp[1]));
                continue;
            }
            int gcdval = gcd(tmp[0], tmp[1]);
            for(int  j = 2;j<tmp.size();j++)
            {
    
    
                gcdval = gcd(gcdval, tmp[j]);
            }
            printf("%d\n", gcdval);
        }
    }
        }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_32862515/article/details/107800326
今日推荐