10 条题解

  • 8
    @ 2024-10-5 15:15:21

    雷迪森安德镇特们,你们嚎! 别紫菜我😕 (蒟蒻恐惧)

    思路

    破题点:"每在等差数列后面加一个数aia_i,若排序后仍能构成等差数列。"

    所以如果新添一个 aia_i,能与前面的构成等差数列,那么 gcd(aiai1,公差d)1gcd(a_i-a_{i-1},公差d) ≠ 1

    但如果两个数相邻且相等,它们不能被分在同一组,所以要特判

    但这些还不够。如果 aia_i 在前面等差数列里出现过也不行,所以还得维护一个 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
上传者