等差区间(写的很脑残)——中国(北方)大学生程序设计训练赛(第一周)F
2017-03-06 20:23
344 查看
等差区间
的数组 a[1],a[2],…,a
,我们进行 q 次询问,每次询问区间 a[l],a[l+1],…,a[r−1],a[r],数字从小到大排列后,是否会形成等差数列。等差数列的定义为,数列相邻两项(后一项减去前一项)的差值相等。
每组输入数据第一行输入两个正整数n和q
第二行输入n个正整数 a[1],a[2],…,a
。最后输入q行,每行两个数字l,r(1≤l≤r≤n),表示询问区间 a[l],…,a[r]。
1≤n,q≤105,1≤a[i]≤106
3 1 5 2 4
1 3
4 5
1 4
3 4
2 2
Yes
No
Yes
Yes
我去,简直瞎了,对了半天的文件,最后发现某数组开小了
测试了半天的数据
以及答案
QaQ
Description
已知一个长度为 n的数组 a[1],a[2],…,a
,我们进行 q 次询问,每次询问区间 a[l],a[l+1],…,a[r−1],a[r],数字从小到大排列后,是否会形成等差数列。等差数列的定义为,数列相邻两项(后一项减去前一项)的差值相等。
Input
本题有多组输入数据。每组输入数据第一行输入两个正整数n和q
第二行输入n个正整数 a[1],a[2],…,a
。最后输入q行,每行两个数字l,r(1≤l≤r≤n),表示询问区间 a[l],…,a[r]。
1≤n,q≤105,1≤a[i]≤106
Output
对于每组询问输出一行,如果形成等差数列,输出“Yes ”,否则输出“No”(不含引号)。Sample Input
5 53 1 5 2 4
1 3
4 5
1 4
3 4
2 2
Sample Output
YesYes
No
Yes
Yes
Source
lsh我去,简直瞎了,对了半天的文件,最后发现某数组开小了
//============================================================================ // Name : tree.cpp // Author : Qihan // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <bits/stdc++.h> using namespace std; #define pi acos(-1.0) #define Lowbit(x) (x & (-x)) #define lson l,mid,rt << 1 #define rson mid + 1,r,rt << 1 | 1 #define inf 0x3f3f3f const int maxn = (100000 + 10); const int mol = 1000000007; typedef long long int LLI; typedef pair<int,int> PII; struct Node{ int l,r; int mins,maxs,pre; }tree[maxn << 2]; int a[maxn],p = 0; int last[maxn * 10]; int b[maxn]; void pushup(int rt){ tree[rt].maxs = max(tree[rt << 1].maxs,tree[rt << 1 | 1].maxs); tree[rt].mins = min(tree[rt << 1].mins,tree[rt << 1 | 1].mins); tree[rt].pre = max(tree[rt << 1].pre,tree[rt << 1 | 1].pre); } void Build(int l,int r,int rt){ if(l > r) return; tree[rt].l = l; tree[rt].r = r; if(l == r){ tree[rt].maxs = a[p]; tree[rt].mins = a[p]; tree[rt].pre = b[p]; p ++; return ; } int mid = (l + r) >> 1; Build(l ,mid,rt << 1); Build(mid + 1,r,rt << 1 | 1); pushup(rt); } int QueryMax(int l,int r,int rt){ if(l <= tree[rt].l && r >= tree[rt].r){ return tree[rt].maxs; } int mid = (tree[rt].l + tree[rt].r) >> 1,maxs = -1; if(l <= mid) maxs = max(QueryMax(l,r,rt << 1),maxs); if(r > mid) maxs = max(QueryMax(l,r,rt << 1 | 1),maxs); return maxs; } int QueryBMax(int l,int r,int rt){ if(l <= tree[rt].l && r >= tree[rt].r){ return tree[rt].pre; } int mid = (tree[rt].l + tree[rt].r) >> 1,maxs = -1; if(l <= mid) maxs = max(QueryBMax(l,r,rt << 1),maxs); if(r > mid) maxs = max(QueryBMax(l,r,rt << 1 | 1),maxs); return maxs; } int QueryMin(int l,int r,int rt){ if(l <= tree[rt].l && r >= tree[rt].r){ return tree[rt].mins; } int mid = (tree[rt].l + tree[rt].r) >> 1,mins = 10000000; if(l <= mid) mins = min(mins,QueryMin(l,r,rt << 1)); if(r > mid) mins = min(mins,QueryMin(l,r,rt << 1 | 1)); return mins; } struct Node2{ int l,r; int Gcd; }tree2[maxn << 2]; void Build2(int l,int r,int rt){ if(l > r) return ; tree2[rt].l = l; tree2[rt].r = r; if(l == r){ tree2[rt].Gcd = a[p ++]; return; } int mid = (tree2[rt].l + tree2[rt].r) >> 1; Build2(l,mid,rt <&l 4000 t; 1); Build2(mid + 1,r, rt << 1 | 1); tree2[rt].Gcd = __gcd(tree2[rt << 1].Gcd,tree2[rt << 1 | 1].Gcd); } int QueryGcd(int l,int r,int rt){ if(l <= tree2[rt].l && r >= tree2[rt].r){ return tree2[rt].Gcd; } int mid = (tree2[rt].l + tree2[rt].r) >> 1,Gcd = -1; if(l <= mid) Gcd = QueryGcd(l,r,rt << 1); if(r > mid){ int RGcd = QueryGcd(l,r,rt << 1 | 1); if(Gcd == -1) Gcd = RGcd; else Gcd = __gcd(Gcd,RGcd); } return Gcd; } int main() { // freopen("/home/qihan/Documents/in1","r",stdin); // freopen("/home/qihan/Documents/out1","w",stdout); int n,m,ca = 1; while(~scanf("%d%d",&n,&m)){ // printf("Case : %d\n",ca ++); // printf("----------------------------------------\n"); for(int i = 0;i < n;i ++) scanf("%d",&a[i]); memset(last,-1,sizeof(last)); for(int i = 0;i < n;i ++){ b[i] = last[a[i]]; last[a[i]] = i + 1; } p = 0; Build(1,n,1); for(int i = 0;i < n - 1;i ++) a[i] = abs(a[i + 1] - a[i]); p = 0; Build2(1,n - 1,1); // printf("----\n"); for(int i = 1;i <= m;i ++){ // printf("\t%d ",i); int l,r; scanf("%d%d",&l,&r); if(l == r){ printf("Yes\n"); continue; } int maxs = QueryMax(l,r,1); int mins = QueryMin(l,r,1); int Bmax = QueryBMax(l,r,1); int Gcd = QueryGcd(l,r - 1,1); if(maxs == mins) printf("Yes\n"); else if(Bmax < l && maxs - mins == (LLI)Gcd * (r - l)) printf("Yes\n"); else printf("No\n"); } } return 0; }
测试了半天的数据
以及答案
QaQ
相关文章推荐
- 中国(北方)大学生程序设计训练赛(第一周)(Problem F: 等差区间-线段树+等差数列平方和公式)
- 中国(北方)大学生程序设计训练赛(第一周)E. water problem
- 中国(北方)大学生程序设计训练赛(第一周)(Problem B: 埃蒙的时空航道-最小割转dp+贪心)
- 中国(北方)大学生程序设计训练赛(第一周)-D (二分)
- 中国(北方)大学生程序设计训练赛(第一周)-F(线段树)
- 中国(北方)大学生程序设计训练赛(第一周)(Problem D: 数学题-二分+双指针)
- 中国(北方)大学生程序设计训练赛(第一周)
- 中国(北方)大学生程序设计训练赛(第一周)E. water problem
- 中国(北方)大学生程序设计训练赛(第一周) (D E)
- 矩阵快速幂-中国(北方)大学生程序设计训练赛(第一周)Water Problem
- 中国(北方)大学生程序设计训练赛(第一周)-A(生成树计数)
- 中国(北方)大学生程序设计训练赛(第一周)(Problem E: Water Problem-矩阵快速幂)
- 中国(北方)大学生程序设计训练赛(第二周)(Problem B: A Boring Game-乱搞)
- 中国(北方)大学生程序设计训练赛(第二周)(Problem C: A Water Problem-dp)
- 中国(北方)大学生程序设计训练赛(第二周) (A B D G)
- 中国(北方)大学生程序设计训练赛(第二周)(Problem G: Connected Components-并查集)
- 中国(北方)大学生程序设计训练赛(第三周)(Interesting sequence-找规律)
- 中国(北方)大学生程序设计训练赛(第二周)(Problem A: Common Substrings-hash)
- 中国(北方)大学生程序设计训练赛(第三周)(List likes playing card-期望)
- 赛码"BestCoder"杯中国大学生程序设计冠军赛1001——Movie