Codeforces Round #Pi (Div. 2) C. Geometric Progression
2015-08-06 08:50
417 查看
C. Geometric Progression
题意:
给出一个序列找出多少个长度为三子序列的公差为k(a,a*k,a*k*k)
从后向前更新,分别更新当前每个数a出现的次数、i和i以后所有i*k数量的和、累i后i*k*k的所有数量和的和
例如:(k=3,更新到红3情况)
1 3 9 3 9
<----------
前 后 表达式
num[3][2] 0 0 num[3][2]+=num[9][1];
num[3][1] 1 3 num[3][1]+=num[9][0];
num[3][0] 1 2 num[3][0]++;
题意:
给出一个序列找出多少个长度为三子序列的公差为k(a,a*k,a*k*k)
从后向前更新,分别更新当前每个数a出现的次数、i和i以后所有i*k数量的和、累i后i*k*k的所有数量和的和
例如:(k=3,更新到红3情况)
1 3 9 3 9
<----------
前 后 表达式
num[3][2] 0 0 num[3][2]+=num[9][1];
num[3][1] 1 3 num[3][1]+=num[9][0];
num[3][0] 1 2 num[3][0]++;
</pre><p></p><p></p><p><span style="color:#0000ee"><u></u></span></p><p></p><pre name="code" class="cpp">#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<queue> #define ll __int64 #define INF 1e9 #define maxn 1000005 using namespace std; ll a[maxn]; ll b[maxn]; ll ser[maxn]; ll num[maxn][3]; /** num[i][0]存储i的数量 num[i][1]累加当前i,后面i*k的数量 num[i][2]累加i*k后i*k*k的数量 从后往前更新 最后累加num[i][2]即为所求结果 */ int A; int find(ll num){ return lower_bound(ser,ser+A,num)-ser; } int main(){ ll n,k; while(~scanf("%lld%lld",&n,&k)){ A=0; for(int i=0;i<n;i++){ scanf("%lld",&a[i]); b[i]=a[i]; } sort(b,b+n); ser[A++]=b[0]; for(int i=1;i<n;i++) if(b[i]!=ser[A-1]) ser[A++]=b[i]; int p1,p2,p3; memset(num,0,sizeof(num)); for(int i=n-1;i>=0;i--){ p1=find(a[i]); p2=find(a[i]*k); p3=find(a[i]*k*k); if(p2<A&&ser[p2]==a[i]*k){ num[p1][2]+=num[p2][1]; num[p1][1]+=num[p2][0]; } num[p1][0]++; } ll ans=0; for(int i=0;i<A;i++) ans+=num[i][2]; printf("%lld\n",ans); } return 0; }
相关文章推荐
- 深入Python(3): and、or以及and-or
- 天合汽车安全技术(张家港)有限公司
- MongoDB集群——分片
- 软件工程师职场生存技能
- UVALive 4174
- ncb文件
- eclipse中安装freemarker插件及ftl使用freemarker编辑器
- 南邮 OJ 1510 和MM逛南邮
- codeforces 229D Towers DP
- 【网络测试】IPV4协议族
- linq to sql 增删改查
- CoreData基础
- UI04_TargetAction
- ZooKeeper的部署和测试
- 南邮 OJ 1508 Lithium去自习2:赶时间
- 如何删除hyberfil.sys
- PageControl
- Node.js 异步式 I/O 与事件驱动实战
- 南邮 OJ 1507 Lithium去自习1:打伞
- poj-2049-Finding Nemo-BFS