Codeforces Round #333 (Div. 2) B C D
2015-11-25 21:42
344 查看
B. Approximating a Constant Range
题意:
给定n个数,满足任意相邻的元素之间的差值不超过1,求最长区间使得区间内最大值和最小值的差值不超过1?思路:
要利用题目给出的性质,|a[i+1]−a[i]|≤1,先求出b[i]=|a[i+1]−a[i]| ,那么如果去掉b数组中的0的话,显然出现两个连续的1或者−1,就会使得区间的最大和最小值差值超过1,所以扫一遍维护几个值就行了!也有比较复杂的做法,RMQ或者线段树都可以做,但是更加适用于一般的情况。
C. The Two Routes
题意:
给一个图,任意两点之间的路不是铁路就是公路,火车只能走铁路,汽车只能走公路,并且不能在除了1,n两点之外的任意点同时到达,求火车和汽车同时出发最后都到达n的最短时间是?思路:
就是脑筋急转弯啦。。。注意到1->n之间不是铁路就是公路,所以必定有一辆车可以花费1直接到达,另外的直接最短路就行了!D. Lipshitz Sequence
题意:
给一个数组,询问[L,R] 内所有子数组的H(l,r)的和。思路:
首先证明下,在区间[l,r] 内出现H最大值的地方必定是相邻的两个元素,因为H这个式子不看取下界的话,其实就是平面上两点的斜率。假设H最大值的地方不一定是相邻的两个元素i ,j ,那么看图就知道了吧,也就是i与j 之间必定存在k,可以画出一个三角形,其中一条边(ik 或者kj)的斜率较大,所以这样证明下去,就能得到结论了。
然后就是求所有子数组的H值之和,同样考虑b[i]=|a[i+1]−a[i]|,所以可以预处理出b[i] 作为最大值向两侧所能延伸到的地方,注意因为避免处理相同的值的时候出现重复计数,所以就选左边第一个大于等于b[i] 的数的位置,右边第一个大于b[i] 的数的位置,后面直接扫一遍就OK了!
注意处理边界问题。。。边界什么的太烦了。。。。QAQ
代码:
#include <cstdio> #include <cstring> #include <queue> #include <algorithm> #include <iostream> #include <cmath> #include <map> #include <vector> #include <set> #include <string> #define PB push_back #define FT first #define SD second #define MP make_pair #define INF 0x3f3f3f3f using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> P; const int N=5+1e5,MOD=7+1e9; int a ,b ; int L ,R ; int stack ; void init(int n) { for(int i = 1;i < n;i ++) { b[i] = abs(a[i+1] - a[i]); } int top = 0; for(int i = 1;i < n;i ++) { while(top && b[stack[top]] < b[i]) top--; if(top == 0) L[i] = 1; else L[i] = stack[top]+1; stack[++top] = i; // cout << stack[top] << endl; } top = 0; for(int i = n-1;i >= 1;i --){ while(top && b[stack[top]] <= b[i]) top--; if(top == 0) R[i] = n; else R[i] = stack[top]-1; stack[++top] = i; } } int main() { int n,q; scanf("%d%d",&n,&q); for(int i = 1;i <= n;i ++){ scanf("%d",&a[i]); } init(n); while(q--){ int l,r; LL ans = 0; scanf("%d%d",&l,&r); r--; for(int i = l;i <= r;i ++){ ans += 1LL*b[i]*(i-max(L[i],l) + 1)*(min(R[i],r)-i + 1);//边界处理 } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces 407C Codeforces Round #239 (Div. 1)C
- CodeForces 449A - Jzzhu and Chocolate
- CodeForces 449 B. Jzzhu and Cities
- Codeforces Round #265 (Div. 2)
- Codeforces #310 div2 C. Case of Matryoshkas
- 状态压缩DP codeforces 244 Problem C. The Brand New Function 和 codeforces 165 E. Compatible Numbers
- codeforces 16 Problem E fish
- Codeforces Round332 部分题解
- Codeforces round #247 for Div. 2
- Codeforces Round #246 (Div. 2)
- Codeforces #264(div 2)D.Gargari and Permutations
- Codeforces Round #236 (Div. 2)------A,B
- codeforces 257 div2 B
- Codeforces Gym100571A Cursed Query
- Codeforces Gym100342E Minima
- Codeforces Gym100342J Triatrip
- Codeforces Gym100286B Blind Walk (dfs)