2015 Hdu 多校赛第四场

考虑到第四场题目难度过大,加了两道水题
结果就只做出这两道水题
XM

Hdu 5327 Olympiad

链接

Olympiad

题意

统计区间[a,b]内满足各位数字不同的数的个数

分析

多区间查询,若每次都计算个数效率非常低,可以预处理,先标记[1,100000]内每个数是否满足条件,再用s[i]累计区间[1,i]的满足条件的总个数
计算[a,b]的个数,只需用s[b]-s[a-1]即可

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
const int N=100000;
int s[N+10];
void init()
{

for(int i=1;i<=N;i++){
bool flag[10]={false};
int t=i;
while(t){
if(flag[t%10])
break;
flag[t%10]=true;
t/=10;
}
s[i]=s[i-1];
if(!t)
s[i]++;
}
}
int main()
{

init();
int T;
scanf("%d",&T);
while(T--){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",s[r]-s[l-1]);
}
return 0;
}

Hdu 5328 Problem Killer

链接

Problem Killer

题意

给定长度为n的数列,求最长的区间[l,r]满足
区间[l,r]形成的数列必须为等差数列或者等比数列

分析

等差数列公差相等,等比数列公比相等
可以求出原数列所有相邻两项的差和比,
然后求最长的连续相等序列的长度

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<stdio.h>
#define max(a,b) a>b?a:b
const int N=1000000;
int n;
double a[N+10],b[N+10],c[N+10];
int solve(double x[])
{

int l=1,cnt=0;
while(l<n){
int r=l;
while(r<n&&x[r]==x[l])
r++;
cnt=max(cnt,r-l);
l=r;
}
return cnt;
}
int main()
{

int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf",&a[i]);
for(int i=1;i<n;i++){
b[i]=a[i+1]-a[i];
c[i]=a[i+1]/a[i];
}
int ans=0;
ans=max(ans,solve(b));
ans=max(ans,solve(c));
printf("%d\n",ans+1);
}
return 0;
}