牛客小白月赛5

I  -   区间(类似于线段树的题目)

题目描述

    Apojacsleam喜欢数组。

    他现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次操作:

        操作一:将a[L]-a[R]内的元素都加上P

        操作二:将a[L]-a[R]内的元素都减去P

    最后询问a[l]-a[r]内的元素之和?

    请认真看题干及输入描述。

输入描述:

输入共M+3行:

第一行两个数,n,M,意义如“题目描述”

第二行n个数,描述数组。

第3-M+2行,共M行,每行四个数,q,L,R,P,若q为1则表示执行操作2,否则为执行操作1

第4行,两个正整数l,r

输出描述:

一个正整数,为a[l]-a[r]内的元素之和

示例1

输入

复制

10 5
1 2 3 4 5 6 7 8 9 10
1 1 5 5
1 2 3 6
0 2 5 5 
0 2 5 8
1 4 9 6
2 7

输出

复制

23

说明

题解:先把2  -  7 之间的区间的和计算出来,然后将区间离线化,遍历一遍区间,如果有重叠的部分在进行相应的操作。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[1000005];
struct fun{
    int id,l,r,p;
}f[1000005];

bool cmp(fun x,fun y){
    if(x.l!=y.l)   return x.l<y.l;
    else   return x.r<y.r;
}
ll solve(int l,int r,int id,int p){
    int k=r-l+1;
    if(id!=1)   return (1ll*k*p);
    else   return -1*(1ll*k*p);
}
int main(){
    int n,m,l,r;ll ans=0;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)   scanf("%lld",&a[i]);
    for(int i=0;i<m;i++){
        scanf("%d %d %d %d",&f[i].id,&f[i].l,&f[i].r,&f[i].p);
    }
    scanf("%d %d",&l,&r);
    for(int i=l;i<=r;i++)   ans+=1ll*a[i];

    for(int i=0;i<m;i++){
        if((f[i].l>=l&&f[i].l<=r)&&f[i].r>r){  // 右
            ans+=solve(f[i].l,r,f[i].id,f[i].p);
        }
        else if((f[i].l>=l&&f[i].l<=r)&&(f[i].r>=l&&f[i].r<=r)){  // 中
            ans+=solve(f[i].l,f[i].r,f[i].id,f[i].p);
        }
        else if(f[i].l<l&&(f[i].r>=l&&f[i].r<=r)){    // 左
            ans+=solve(l,f[i].r,f[i].id,f[i].p);
        }
        else if(f[i].l<l&&f[i].r>r){    // 包含
            ans+=solve(l,r,f[i].id,f[i].p);
        }
    }
    printf("%lld\n",ans);
    return 0;
}

J -  时间(time)

链接:https://www.nowcoder.com/acm/contest/135/J
来源:牛客网
 

题目描述

         Apojacsleam是一个喜欢特殊时刻的人。

        他定义了一个时刻,若电子表显示ab:ba(24小时制),则该时刻为“回文时刻”(可以有前导零)。例如00:00就是回文时刻。

        给定一个时刻,求此时刻的上一个和下一个回文时刻。

J题附加:00:00就是24:00,没有24:00这一时刻

J题附加:输入可能有前导0,输出不含前导0,例如10:1的意思是10:01,而10:10的输出为10:10 

输入描述:

两个正整数,用“:”隔开,表示小时和分钟,保证输入时间合法。

输出描述:

两行,两个时刻(不含前导0),用“:”隔开,表示上一个时刻和下一个时刻

示例1

输入

复制

09:33

输出

复制

5:50
10:1

示例2

输入

复制

23:32

输出

复制

22:22
0:0

题解:模拟就好了。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
    int a,b;
    scanf("%d:%d",&a,&b);
    int c=a,d=b;
    while(1){
        b--;
        if(b<0){
            b=59;
            a-=1;
            if(a<0){
                a=23;
            }
        }
        if(a%10==b/10&&a/10==b%10){
            printf("%d:%d\n",a,b);
            break;
        }
    }
    while(1){
        d++;
        if(d>59){
            d=0;
            c++;
            if(c>23){
                c=0;
            }
        }
        if(c%10==d/10&&c/10==d%10){
            printf("%d:%d\n",c,d);
            break;
        }
    }
    return 0;
}

D - 阶乘

链接:https://www.nowcoder.com/acm/contest/135/D
来源:牛客网

题目描述

输入描述:

输入数据共一行,一个正整数n,意义如“问题描述”。

输出描述:

输出一行描述答案:

一个正整数k,表示S的末尾有k个0

示例1

输入

复制

10

输出

复制

7

说明

  鸣谢真·dalao Tyxao

题解:暴力

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;

int main(){
    ll n;
    scanf("%lld",&n);
    ll ans=0,sum=0;
    for(ll i=1;i<=n;i++){
        ll h=i;
        while(h%5==0){
            h/=5;
            sum++;
        }
      //  printf("sum===%lld\n",sum);
        ans+=sum;
    }
    printf("%lld\n",ans);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值