Codeforces Round #297 (Div. 2)
来源:互联网 发布:手机淘宝页头图片 编辑:程序博客网 时间:2024/05/28 05:13
C. Little Girl and Maximum Sum
题目不难,访问次数越多的点让其权重越大即可。要累计每个点的访问次数,因为是区间,所以每次输入l,r,区间内的每个点都要增加一次。倘若利用for循环遍历相加,会出现超时Time limit exceeded on test的情况(如下图代码)
for (i = 0; i<q; i++) { cin >> l >> r; for (j = l - 1; j < r; j++) t[j]++; }
所以,可设置一个数组存储,由于从左往右加,为了避免重复相加,所以每次右端要自减避免下次重复相加。为了好理解,可以将代码展开写一写。行4中的自减原因在于行7和行8的代码,举个例子比如说l=1,r=3若是第一次访问那么t[1]=t[2]=t[3]=1,即区间内的每个元素都只访问了一次。此时如果套用行7,8的代码就会发现t[1]=1,t[2]=t[1]+t[2]=2,t[3]=t[2]+t[3]=3,所以每次输入l,r,都要t[r]--,避免下边t[i] += t[i - 1]造成的多次相加,最好是展开自己动手写一写帮助理解,这也算一个避免计算超时的技巧吧!
for (i = 0; i<q; i++) { cin >> l >> r; t[l - 1]++; t[r]--; } for (i = 1; i<n; i++) t[i] += t[i - 1];完整代码如下
#include <iostream>#include <algorithm>using namespace std;typedef long long ll;ll a[200010], t[200010], ans;int main(){ int n, q, l, r, i; cin >> n >> q; for (i = 0; i<n; i++) cin >> a[i]; sort(a, a + n); for (i = 0; i<q; i++) { cin >> l >> r; t[l - 1]++; t[r]--; } for (i = 1; i<n; i++) t[i] += t[i - 1]; sort(t, t + n); for (i = 0; i<n; i++) ans += a[i] * t[i]; cout << ans<< endl; return 0;}
0 0
- Codeforces Round #297 (Div. 2)
- Codeforces Round #297 (Div. 2)
- Codeforces Round #297 (Div. 2) A(模拟)
- Codeforces Round #297 (Div. 2) B
- Codeforces Round #297 (Div. 2) C
- Codeforces Round #297 (Div. 2) (ABCDE题解)
- Codeforces Round #297 (Div. 2) D
- Codeforces Round #297 (Div. 2) E
- Codeforces Round #102 (Div. 2)
- Codeforces Round #103 (Div. 2)
- Codeforces Round #103 (Div. 2)
- Codeforces Round #104 (Div. 2)
- Codeforces Round #105 (Div. 2)
- Codeforces Round #105 (Div. 2)
- Codeforces Round #107 (Div. 2)
- Codeforces Round #108 (Div. 2)
- Codeforces Round #110 (Div. 2)
- Codeforces Round #122 (Div. 2)
- Java笔记:Java定时器Timer和TimerTask
- Say Hello To Android Studio【android studio 安装步骤概述】
- main(int argc,char *argv[ ],char *env)参数详解
- 历届试题 网络寻路
- 访问控制器的方法
- Codeforces Round #297 (Div. 2)
- windows到linux上回车字符的问题
- 详解C#中MessageBox消息框
- 面试题
- OpenGL编程逐步深入(三)在窗口中显示一个三角形
- 历届试题 大臣的旅费
- 四层负载均衡和七层负载均衡的区别
- angular-leaflet 小例
- 排队规则网卡青涩瞬间