首页 > 代码库 > XDOJ_1013_线段更新求和
XDOJ_1013_线段更新求和
http://acm.xidian.edu.cn/problem.php?id=1013
好像树状数组和线段树都可以做,但是不会= =。
直接保存了左右点,记录每次加减的总和,最后更新到原来的高度里就可以了。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int a[100005],sum[100005];int main(){ int n,m,l,r,k; while(~scanf("%d",&n)) { long long summ = 0; memset(sum,0,sizeof(sum)); for(int i = 1;i <= n;i++) scanf("%d",&a[i]); scanf("%d",&m); for(int i = 1;i <= m;i++) { scanf("%d%d%d",&l,&r,&k); sum[l+1] -= k; sum[r+1] += k; } for(int i = 1;i <= n;i++) { sum[i] += sum[i-1]; a[i] += sum[i]; summ += a[i]; } int ave = summ/n; for(int i = 1;i <= n;i++) a[i] -= ave; summ = 0; for(int i = 1;i <= n;i++) summ += (long long)a[i]*a[i]; printf("%lld\n",summ); } return 0;}
XDOJ_1013_线段更新求和
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。