10 条题解
-
8
雷迪森安德镇特们,你们嚎! 别紫菜我😕 (蒟蒻恐惧)
思路
破题点:"每在等差数列后面加一个数,若排序后仍能构成等差数列。"
所以如果新添一个 ,能与前面的构成等差数列,那么
但如果两个数相邻且相等,它们不能被分在同一组,所以要特判
但这些还不够。如果 在前面等差数列里出现过也不行,所以还得维护一个 set
代码
#include<bits/stdc++.h> using namespace std; const int maxn = 2e6 + 10; const long long mod = 1e9 + 7; void solve(){ int n; cin >> n; vector <int> a; set <int> st; for (int i = 1; i <= n; i++) cin >> a[i]; int sz = 1, d = -1; int ans = 1; st.insert(a[1]); for (int i = 2; i <= n; i++){ int cha = abs(a[i] - a[i - 1]); if (cha == 1 || cha == 0){//雪的教训 sz = 1; ans++; st.clear(); st.insert(a[i]); continue; } if (sz == 1){ sz++; d = cha; st.insert(a[i]); continue; } int td = abs(cha, d); if (td == 1 || st.find(a[i]) != st.end()){ ans ++; sz = 1; st.clear(); st.insert(a[i]); } else { sz++; d = td; st.insert(a[i]); } } cout << ans << endl; } int main(){ freopen("factory.in", "r", stdin); freopen("factory.out", "w", stdout); int test = 1; while (test--) solve(); return 0; }
WARNING
别抄!坑太多了,但思路没错(我猜你找不全)
信息
- ID
- 783
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 83
- 已通过
- 11
- 上传者