Greg and Array CodeForces 296C 差分数组

题意

是说有n个数,m种操作,这m种操作就是让一段区间内的数增加或则减少,然后有k种控制,这k种控制是说让m种操作中的一段区域内的操作来实际进行,问进行完k种控制后,这n个数变成了啥。

解题思路

我开始使用了最简单的差分,就是把m种操作存到结构体数组中,然后在读取k中控制时,按照要求执行之前结构体数组中的一段区间内的操作,但是这样超时了。后来一想,如果直接知道m种操作每种操作的次数不就行了,于是我们需要两个数组,一个是用来记录m种操作它们需要进行的次数,另一个就是原来数组中的值。

详细看代码实现

代码实现

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
struct node{
ll l, r, x;
}op[maxn];
ll num[maxn], ca[maxn];//这个存储原数组值的差分
ll qujian[maxn]; //存储每种操作的次数
int n, m, k;
int main()
{
cin>>n>>m>>k;//注意这里一定要用cin和cout来进行输入输出,题目要求
for(int i=1; i<=n; i++)
{
cin>>num[i];
ca[i]=num[i]-num[i-1];
}
for(int i=1; i<=m; i++)
{
cin>>op[i].l>>op[i].r>>op[i].x;//把m中操作按照顺序存到结构体数组中
}
ll x, y;
for(int i=1; i<=k; i++)
{
cin>>x>>y;
qujian[x]++;
qujian[y+1]--;
}
ll tmp=0;
for(int i=1; i<=m; i++)
{
tmp+=qujian[i];
ca[op[i].l]+=tmp*op[i].x;
ca[op[i].r+1]-=tmp*op[i].x;
}
tmp=0;
for(int i=1; i<=n; i++)
{
tmp+=ca[i];
cout<<tmp<<" ";
}
cout<<endl;
return 0;
}

最新文章

  1. 基础的jdbc连接数据库操作
  2. ztree + ashx +DataTable +Oracle
  3. JSBInding+Bridge.NET:把C#编译为Js
  4. 五、BLE(下)
  5. 什么是Java实例初始化块
  6. pyqt2_官网教程
  7. AngularJS学习笔记之directive&mdash;scope选项与绑定策略
  8. HDOJ 2058 The sum problem
  9. WPF笔记(1.6 数据绑定)——Hello,WPF!
  10. Linux iptables简单配置
  11. Android 4.4环境搭建——Android SDK下载与安装
  12. HDInsight-Hadoop现实(两)传感器数据分析
  13. redis的sentinel主从切换(failover)与Jedis线程池自动重连
  14. hdu 5521 最短路
  15. markdown语法(看这张图就够了)
  16. cygwin vim can&#39;t write .viminfo
  17. 2.html基础标签:无序+有序+自定义列表
  18. Java 基础 引用数据类型 ArrayList集合
  19. oracle-scn
  20. 3、Docker容器管理

热门文章

  1. bzoj5020 &amp; loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开
  2. 基于VUE多人聊天项目
  3. 【GDOI2014模拟】网格
  4. Intraweb IIS发布,数据连接问题
  5. 面试题常考&amp;必考之--js中的数组去重和字符串去重
  6. bootstrap datetimepicker 位置错误
  7. [CSP-S模拟测试]:matrix(DP)
  8. Presenter 层
  9. window下启动redis服务
  10. Linux中相关知识(atexit(),fork(),粘滞位)