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
说明![](https://i-blog.csdnimg.cn/blog_migrate/81a31ab73767102bbe934f52a8ca3377.png)
题解:先把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;
}