Codeforces 846 C Four Segments(前缀和+枚举)
2017-09-07 12:42
369 查看
题目地址
题意:给你一个序列,定义一种运算sum(a,b)=num[a]+…+num[b-1],注意sum(a,a)=0。让你求出最大的res=sum(0, delim0) - sum(delim0, delim1) + sum(delim1, delim2) - sum(delim2, n) 时的delim0,delim1,delim2。
思路:用前缀和去节省每一次求区间和的时间,因为当a,b相同时sum操作是为0的,所以最不理想的时候res中减操作的时候就为0。所以我们就可以去枚举delim0以及delim2,那delim1的话就是在过程中求出一个区间和为最下的非正数的范围就好了。然后每次记录与之前进行比较,取最大值得时候的delim0,delim1,delim2。
题意:给你一个序列,定义一种运算sum(a,b)=num[a]+…+num[b-1],注意sum(a,a)=0。让你求出最大的res=sum(0, delim0) - sum(delim0, delim1) + sum(delim1, delim2) - sum(delim2, n) 时的delim0,delim1,delim2。
思路:用前缀和去节省每一次求区间和的时间,因为当a,b相同时sum操作是为0的,所以最不理想的时候res中减操作的时候就为0。所以我们就可以去枚举delim0以及delim2,那delim1的话就是在过程中求出一个区间和为最下的非正数的范围就好了。然后每次记录与之前进行比较,取最大值得时候的delim0,delim1,delim2。
#include <iostream> #include <cstring> #include <string> #include <queue> #include <vector> #include <map> #include <set> #include <stack> #include <cmath> #include <cstdio> #include <algorithm> #include <iomanip> #define N 5010 #define M 555005 #define LL __int64 #define inf 0x3f3f3f3f3f3f3f3f #define lson l,mid,ans<<1 #define rson mid+1,r,ans<<1|1 #define getMid (l+r)>>1 #define movel ans<<1 #define mover ans<<1|1 using< 4000 /span> namespace std; const LL mod = 1000000007; LL num , sum ; long long solve(int l, int r) { return sum[r - 1] - sum[l - 1]; } int main() { cin.sync_with_stdio(false); int n; int a, b, c; while (cin >> n) { sum[0] = 0; for (int i = 1; i <= n; i++) { cin >> num[i]; sum[i] = sum[i - 1] + num[i]; } LL ans = -inf; for (int i = 0; i <= n; i++) { LL k = sum[i]; int pos = i; for (int j = i; j <= n; j++) { if (sum[j] < k) { pos = j; k = sum[j]; } LL cnt = solve(1, i + 1) - solve(i + 1, pos + 1) + solve(pos + 1, j + 1) - solve(j + 1, n + 1); if (cnt >= ans) { a = i; b = pos; c = j; ans = cnt; } } } cout << a << " " << b << " " << c << endl; } return 0; }
相关文章推荐
- Codeforces-846C - Four Segments - 枚举 + 前缀和
- Codeforces 846C Four Segments【思维+预处理+前缀和枚举】
- CodeForces - 846C Four Segments 暴力+枚举
- Educational Codeforces Round 28 Four Segments 前缀和 + 思维
- Codeforces 828B Black Square【暴力枚举+二维前缀和】
- codeforces 846D (二分+二维前缀和)Monitor
- codeforces 612D The Union of k-Segments (前缀和处理区间)
- codeforces 234C C. Weather(枚举+前缀后缀预处理)
- Codeforces 846 D Monitor(类似求面积的前缀和)
- CodeForces - 877B Nikita and string (前缀和后缀,任意删除)
- codeforces 425B Sereja and Table (枚举、位图)
- Codeforces Beta Round #14 (Div. 2) C. Four Segments 水题
- Codeforces 651D Image Preview【二分+枚举】
- CodeForces 631 A A. Interview【枚举】
- 【Codeforces 608B】Hamming Distance Sum(前缀和)
- Codeforces 228E The Road to Berland is Paved With Good Intentions 枚举dfs判断可行性 || 并查集
- Codeforces 193D Two Segments 解题报告
- Codeforces 106 D. Treasure Island(前缀和预处理)
- codeforces_612D. The Union of k-Segments(排序)
- codeforces_652D. Nested Segments(树状数组、二分)