yuwj  

关于我没有好好写题和补题的代价,自己为自己的行为负全责
真的不知道干嘛去了,反正,这套题只签了一道题,嗯,很菜
所以,现在好好补题了,也不玩些有的没的了
//1001 二进制枚举

1003

双指针选择连续区间,取最大值

点击查看代码
/*
exp:
分块枚举所有连续相同区间 -> 双指针

for(int i = 1, j = 0; i <= n; i = j + 1){
    while(j <= n && check ) j++;
}
*/
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;

void solve(){
    int n; cin >> n;
    vector<i64> a(n+1), b = a;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++) cin >> b[i];

    i64 ans = 0;
    for(int i = 1, j = 0; i <= n; i = j + 1){
        while(j + 1 <= n && a[j+1] + b[j+1] == a[i] + b[i]) j++;
        
        i64 tmp = 0;
        for(int k = i; k <= j; k++){
            tmp += (j - i + 1) * a[k];
        }

        ans = max(tmp, ans);
    }
    cout << ans << '\n';
}

int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t;
    for(cin>>t;t--;){
        solve();
    }
    return 0;
}

1002

ST表、二分、前缀和
基本的组合easy题
但是代码细节很多,re,tle,wa...常态化了
(此代码出处:https://www.cnblogs.com/TianTianChaoFangDe/p/18822660)

点击查看代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int N = 1e5 + 10, C = 40;
 
i64 a[N], lg[N];
 
void solve(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;i64 x;
    cin >> n >> x;
    for (int i = 1; i <= n; i++){
        cin >> a[i];
    }
    vector<i64> b(n+1, 0), pre(n+1, 0);
    for (int i = 2; i <= n; i++) b[i] = llabs(a[i] - a[i-1]);
    
    for (int i = 2; i <= n; i++)pre[i] = pre[i-1] + b[i];
    
    if(pre[n] <= x){
        cout << 0 << "\n";
        return;
    }

    for (int i = 2; i <= n; i++){
        lg[i] = lg[i >> 1] + 1;
    }
    vector<array<i64, C>> st(n+1);
    for (int i = 1; i <= n; i++){
        st[i][0] = a[i];
    }

    for (int j = 1; j <= lg[n]; j++){
        for (int i = 1; i + (1 << j) - 1 <= n; i++){
            st[i][j] = max(st[i][j-1], st[i + (1 << (j-1))][j-1]);
        }
    }
    
    auto getmx = [&](int l, int r) -> i64 {
        int s = lg[r - l + 1];
        return max(st[l][s], st[r - (1 << s) + 1][s]);
    };
    
    auto check = [&](int len) -> bool {
        for (int L = 1; L + len - 1 <= n; L++){
            int R = L + len - 1;
            i64 mx = getmx(L, R);
            i64 tmp = pre[n] - (pre[R] - pre[L]);
            if(L > 1) {
                tmp -= llabs(a[L] - a[L-1]);
                tmp += llabs(mx - a[L-1]);
            }
            if(R < n) {
                tmp -= llabs(a[R+1] - a[R]);
                tmp += llabs(a[R+1] - mx);
            }
            if(tmp <= x) return true;
        }
        return false;
    };
    
    int l = 0, r = n + 1;
    while(l < r) {
        int mid = (l + r) / 2;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    cout << (l == n+1 ? -1 : l) << "\n";
}
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int t;
    cin >> t;
    while(t--){
        solve();
    }
    return 0;
}

1008

结合律,完全是一样的,所以计数问题

点击查看代码
#include<bits/stdc++.h>

const int M = 1e9 + 7;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int T;
    std::cin >> T;
    while (T--) {
        int n;
        std::cin >> n;
        int ans = 1, sum = 0, y = 0;
        for (int i = 1; i <= n; i++) {
            int x;
            std::cin >> x;
            sum = (sum + 1ll * x * y) % M;
            int t = (1ll * i * (i - 1) / 2) % M;
            if (i > 1) ans = 1ll * ans * t % M;
            y = (y + x) % M;
        }
        std::cout << sum << " " << ans << "\n";
    }
}
posted on 2025-04-13 12:22  xiaowang524  阅读(28)  评论(0)    收藏  举报