hdu5288 多校联合第一场第一题
来源:互联网 发布:91视频解析网站源码 编辑:程序博客网 时间:2024/04/30 11:29
据说是简单题,可是对于我这种菜比却怎么想也没有想到,后来看了题解才明白,原来我一直把区间理解错了,看来敲题之前还真的不能玩游戏。
题意:给你几个数字,找出所有区间的f(i,j)之和,其中i,j代表位置,我一直以为是数字。。。
假如有5个数1 2 6 3 4,那么f(2,3)就是2和6这两个数字的f值,结果为1,一开始我以为f(2,3)就是从2一直到6,就是2 3 4 5 6有几个没有因子的数字。
既然看懂了题意,就懂得了怎么去解,一个数字所能贡献的答案就是从这个数字开始,直到左边第一个因数之间有几个数字乘以从这个数字开始,到右边第一个因数之间有几个数字的积,因为如果区间超过这个范围,那么这个数字就是有因数的,就不算在f(i,j)里面了,那么在这个范围里面区间(要求包括这个数字,区间的左端点在这个数字左边,右端点在这个区间的右边)的个数就是这个数字所贡献的答案。
设一个l[i],r[i]分别计算这个区间左右第一个因子的位置,直接暴力求l[i],r[i],果断TLE。
正解:因为数字最大为10000,开一个vector,记录每个数字出现的位置,然后从1到100枚举每一个数,如果是a[i]的因子,那么去vector[a[i]]里面找这个数字的位置,如果比l[i]大,并且比i小,更新l[i],如果比r[i]小,比i大,更新r[i],注意还要计算与这个因子相乘正好等于a[i]的数字,做以上操作
AC代码
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <cmath>#define maxn 100010#define mod 1000000007using namespace std;int l[maxn],r[maxn]; //记录左边和右边最靠近i且能被a[i]整除的数字的位置int a[maxn];vector<int> vec[maxn]; //记录每个数出现的位置int main(){ int n; while(scanf("%d",&n)!=EOF) { long long ans = 0; for(int i = 0; i < maxn; i++) //清空初始化 vec[i].clear(); for(int i = 1; i <= n; i++) { scanf("%d",&a[i]); l[i] = 0; //初始化l[i]为0,r[i]为n+1 r[i] = n+1; vec[a[i]].push_back(i); //存放位置 } for(int i = 1; i <= n; i++) { int m = sqrt(a[i]) + 1; for(int j = 1; j <= m; j++) { if(a[i]%j == 0) { int tem = a[i]/j; for(int k = 0; k < vec[j].size(); k++) { if(vec[j][k] < i&&vec[j][k] > l[i]) l[i] = vec[j][k]; if(vec[j][k] > i&&vec[j][k] < r[i]) r[i] = vec[j][k]; } for(int k = 0; k < vec[tem].size(); k++) { if(vec[tem][k] < i&&vec[tem][k] > l[i]) l[i] = vec[tem][k]; if(vec[tem][k] > i&&vec[tem][k] < r[i]) r[i] = vec[tem][k]; } } } } for(int i = 1; i <= n; i++) { ans += (r[i] - i)*(i - l[i]); ans = ans%mod; } printf("%lld\n",ans); }}
0 0
- hdu5288 多校联合第一场第一题
- hdu5288 OO’s Sequence 二分 多校联合第一场
- 2014多校联合第一场
- 多校联合第一场 数学
- 2015年多校联合训练第一场OO’s Sequence(hdu5288)
- HDU1010 && 多校联合第一场H题
- hdu 5288||2015多校联合第一场1001题
- HDU5288.OO’s Sequence(多校第一题)
- hdu 4602 partition 2013多校联合训练第一场
- 多校联合赛 第一场
- 2014多校联合第一场 1004 Task
- 2014多校联合第一场 1002 Jump
- hdu5289||2015多校联合第一场1002贪心+RMQ
- HDU 5289 Assignment(多校联合第一场1002)
- [RMQ+二分] 2015多校联合第一场 Assignment
- hdu5289 2015多校联合第一场1002 Assignment
- 2015多校联合第一场hdu5288OO’s Sequence
- 2015多校联合第一场5289Assignment RMQ+二分
- Dapper,大规模分布式系统的跟踪系统
- Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分
- Andrew机器学习课程笔记(1)——梯度下降、逻辑回归
- win32和x64平台的切换
- BZOJ 1036 树的统计
- hdu5288 多校联合第一场第一题
- CentOS更改yum源与更新系统
- Hive安装以及部署(Ubuntu-MySql)
- 网站通用百度地图调用示例,只需填入座标和百度密钥即可。内容可自己更换。
- java 虚拟机的理解
- 《移动APP测试实战》
- Google 发布 Android 性能优化典范
- BZOJ 1001 狼抓兔子
- 【java】五子棋小游戏