您的位置:首页 > 其它

暑假集训热身赛

2016-07-22 23:47 323 查看
[b] 完成度 (8 / 10)[/b]

[b]Problem A[/b]

[b]题目大意[/b]

  给定 m,n,询问二元组(x,y)( 1 <= x <= m , 1 <= y <= n) 满足 ( x + y ) % 5 = 0 的组数。

解题分析

  直接枚举x与y的模余

参考程序

#include <cstdio>
#include <algorithm>
using namespace std;

#define maxn 200008
#define len 20
int n;
int a[maxn],b[maxn];
int fa[maxn][len],fb[maxn][len];

void rmq_inita(){
for (int i = 1; i <= n;i++)
fa[i][0] = a[i];
for (int j = 1; (1 << j) <= n;j++)
for (int i = 1;i + (1 << j) - 1 <= n;i++)
fa[i][j] = max(fa[i][j - 1] , fa[i + (1 << j - 1)][j - 1]);
}

int rmqa(int l,int r){
int k = 0;
while (1 << (k+1) <= r - l + 1) k++;
return max(fa[l][k] , fa[r - (1 << k) + 1][k]);
}

void rmq_initb(){
for (int i = 1; i <= n;i++)
fb[i][0] = b[i];
for (int j = 1; (1 << j) <= n;j++)
for (int i = 1;i + (1 << j) - 1 <= n;i++)
fb[i][j] = min(fb[i][j - 1] , fb[i + (1 << j - 1)][j - 1]);
}

int rmqb(int l,int r){
int k = 0;
while (1 << (k+1) <= r - l + 1) k++;
return min(fb[l][k] , fb[r - (1 << k) + 1][k]);
}

int main(){
scanf("%d",&n);
for (int i = 1;i <= n;i++) scanf("%d",&a[i]);
for (int i = 1;i <= n;i++) scanf("%d",&b[i]);
rmq_inita();
rmq_initb();
int L;
long long ans=0;
for (L = 1;L <= n;L++){
int l,r,mid,res1=0,res2=0;
l = L; r = n ;
while (l <= r){
mid = (l + r) / 2;
if (rmqb(L,mid) - rmqa(L,mid) >= 0){
res1 = mid;
l = mid + 1;
}
else
r = mid - 1;
}

l = L; r = n ;
while (l <= r){
mid = (l + r) / 2;
if (rmqa(L,mid) - rmqb(L,mid) >= 0){
res2 = mid;
r = mid - 1;
}
else
l = mid + 1;
}
if (rmqa(L,res1) == rmqb(L,res1) && rmqa(L,res2) == rmqb(L,res2) )ans += res1 - res2 +1;
}
printf("%I64d\n",ans);
return 0;
}


View Code

Problem I

题目大意

题目分析

参考程序

Problem J

题目大意

题目分析

参考程序

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: