CF903 D.Almost Difference
来源:互联网 发布:nginx 优化加速 编辑:程序博客网 时间:2024/05/22 02:20
题目:http://codeforces.com/contest/903/problem/D
分析:
一开始做的好麻烦(离散化+前缀和+map),后来看了别人的代码简化了一下(前缀和+map)。
先说下思路,对第i个数,不考虑距离在1之内的情况,对答案的贡献是(i-1)*a[i]-sum,sum是1..i-1的前缀和;
注意: 要用longdouble!若输出用%.0Lf,需要用c++14,当然也可以用 cout << fixed << setprecision(0) << ans 这个输出。
代码:
离散化+前缀和+map
#include <bits/stdc++.h>using namespace std;const int Tmax=200005;int n,p;long double sum[Tmax],data[Tmax],what[Tmax],tmp[Tmax],num[Tmax],ans;map<double,int> lisan;bool equal(double x,double y){ return fabs(x-y)<=0.0000001;}void work(){ int i; num[lisan[data[1]]]++; for(i=2;i<=n;i++) { ans+=data[i]*(i-1)-sum[i-1]; if(equal(what[lisan[data[i]]-1],data[i]-1)==true)//if(what[lisan[data[i]]-1]==data[i]-1) { ans-=1.0*num[lisan[data[i]]-1]; } if(equal(what[lisan[data[i]]+1],data[i]+1)==true)//if(what[lisan[data[i]]+1]==data[i]+1) { ans+=1.0*num[lisan[data[i]]+1]; } num[lisan[data[i]]]+=1.0; //printf("%d ",ans); } //printf("\n"); return;}int main(){ int i; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%Lf",&data[i]); tmp[i]=data[i]; } sort(tmp+1,tmp+1+n); tmp[0]=-10; for(i=1;i<=n;i++) { if(equal(tmp[i],tmp[i-1])==false) { lisan[tmp[i]]=++p; what[p]=tmp[i]; } } //for(i=1;i<=n;i++) printf("%d ",what[i]); ///printf("\n"); for(i=1;i<=n;i++) { sum[i]=sum[i-1]+data[i]; //printf("%d ",sum[i]); } //printf("\n"); work(); cout<<fixed<<setprecision(0)<<ans;//printf("%.0Lf",ans); return 0;}
前缀和+map
#include <bits/stdc++.h>using namespace std;const int Tmax=200005;int n,p;long long int sum,tmp;map<long long int,int> MM;long double ans;int main(){ int i; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%I64d",&tmp); ans+=(i-1)*tmp-sum+MM[tmp+1]-MM[tmp-1]; sum+=tmp; MM[tmp]++; } cout << fixed << setprecision(0) << ans; //printf("%.0Lf",ans); return 0;}
阅读全文
0 0
- CF903 D.Almost Difference
- CF903 D.Almost Difference
- Codeforces 903D Almost Difference
- codeforces 903D. Almost Difference
- codeforces 903D Almost Difference(递推式)
- codeforces Educational Round 34 D Almost Difference
- codeforces 903 D. Almost Difference 线段树
- [Codeforces 903 D. Almost Difference]树状数组+大数模板
- Educational Codeforces Round 34 (Rated for Div. 2) D. Almost Difference(高精度)
- D. Almost Identity Permutations(dp)
- codeforces 888D.Almost Identity Permutations
- CodeForces 888D Almost Identity Permutations
- codeforces 888D Almost Identity Permutations (组合数+错排)
- HDU-5936-Difference(杭州CCPC D题)-二分
- HDU 5936 && 2016CCPC杭州 D: Difference(折半枚举)
- Almost done.
- Linux bootloader squeue AND runlevel info(rc.d init.d daemons S K difference ) RUNLEVEL
- What's the difference between Quartz Core, Core Graphics and Quartz 2D?
- CoordinatorLayout 与ToolBar 和Fab实现滑动隐藏和显示的学习笔记
- 基于TCP的客户端、服务器端socket编程
- Python3 字典(dictionaries)
- Leetcode 283. Move Zeroes
- 梯度算法之梯度上升和梯度下降
- CF903 D.Almost Difference
- 用全局变量编程模拟显示一个数字式时钟(习题7.2)
- 非spring boot (即spring) 使用/集成 Spring cloud Config 分布式配置中心
- 学习笔记7
- windows下caffe的安装与配置
- canvas基本知识介绍
- 26-Remove Duplicates from Sorted Array
- spring boot的Java配置方式
- 卖香蕉的小伙子