Codeforces 296C Greg and Array】的更多相关文章

数据结构题.个人认为是比较好的数据结构题.题意:给定一个长度为n的数组a,然后给定m个操作序列,每个操作:l, r, x将区间[l, r]内的元素都增加a,然后有k个查询,查询形式是对于操作序列x,y是将第x个操作到第y个操作执行一遍.然后求最后的数组的元素值. 1.线段树解法:维护两棵线段树,一棵用于维护执行的操作序列的执行次数,一棵用于维护数组a的值.复杂度O(nlogn). 2.扫描区间.对于数组和操作序列分别维护一个数组lx[],ly[].ly[i]表示区间[i, m]中每个操作执行的次…
传送门 A. Greg and Array time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input output standard output Greg has an array a = a1, a2, ..., an and m operations. Each operation looks as: li, ri, di, (1 ≤ li ≤ ri ≤ n). To a…
Greg and Array CodeForces 296C 差分数组 题意 是说有n个数,m种操作,这m种操作就是让一段区间内的数增加或则减少,然后有k种控制,这k种控制是说让m种操作中的一段区域内的操作来实际进行,问进行完k种控制后,这n个数变成了啥. 解题思路 我开始使用了最简单的差分,就是把m种操作存到结构体数组中,然后在读取k中控制时,按照要求执行之前结构体数组中的一段区间内的操作,但是这样超时了.后来一想,如果直接知道m种操作每种操作的次数不就行了,于是我们需要两个数组,一个是用来记…
A. Greg and Array Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/295/problem/A Description Greg has an array a = a1, a2, ..., an and m operations. Each operation looks as: li, ri, di, (1 ≤ li ≤ ri ≤ n). To apply operation …
题目连接:Codeforces 442C Artem and Array 题目大意:给出一个数组,每次删除一个数.删除一个数的得分为两边数的最小值,假设左右有一边不存在则算作0分. 问最大得分是多少. 解题思路:首先将连续的a,b,c,a > b && c > b的情况将c掉,获得min(a,b)分,这样处理后数组变成一个递増再递减的序列,除了最大和第二大的取不到.其它数字均能够得分. 例子:4 10 2 2 8 #include <cstdio> #include…
Codeforces Round #504 D. Array Restoration 题目描述:有一个长度为\(n\)的序列\(a\),有\(q\)次操作,第\(i\)次选择一个区间,将区间里的数全部改为\(i\),序列\(a\)的每个位置至少被改一次.得到最终的序列,然后将序列里的某些位置变成\(0\),输出一种可能的置零之前的最终序列,或无解. solution 求出每种数字最长的染色区间,按这个区间染色,记下没出现的数字.染色后如果存在\(0\)联通块,则用没出现的数字从大到小染色(一个联…
CodeForces 295B Greg and Graph 题解 \(Floyd\) 算法是一种基于动态规划的算法,以此题为例介绍最短路算法中的 \(Floyd\) 算法. 我们考虑给定一个图,要找出 \(i\) 号点到 \(j\) 号点的最短路径.则该最短路径只有两种可能: \(i\) 号点直接到达 \(j\) 号点的路径中产生最短路径 \(i\) 号点经过一些中间点到达 \(j\) 号点的路径中产生最短路径 我们添加一个点 \(k\),使得 \(i\) 号点到 \(j\) 号点再添加后产生…
题目大意:输入n,m,k.n个数,m个区间更新标记为1~m.n次操作,每次操作有两个数x,y表示执行第x~y个区间更新. 题解:通过差分来表示某个区间更新操作执行的次数.然后用线段树来更新区间. #include<bits/stdc++.h> using namespace std; ; typedef long long ll; ll arr[N]; ll tt[N],cnt[N]; struct stu{ ll value,add; }tree[N+N+N]; ll l1[N],r1[N]…
题目链接:http://codeforces.com/problemset/problem/295/A 我的做法,两次线段树 #include <cstdio> #include <cstring> const int N = 100005; long long sumv[N * 3]; long long add[N * 3]; long long a[N]; struct opera { int l, r; long long d; } op[N]; void pushdown…
线段树的区间更新与区间求和...一颗这样的线段树用两次... 先扫描1~k...用线段树统计出每个操作执行的次数... 那么每个操作就变成了 op. l  , op.r , op.c= times* op.c 清空线段树..将初始的a1,a2~~an放入..用每个操作来更新值~~ Program: #include<iostream> #include<stdio.h> #include<string.h> #include<set> #include &l…