关于我没有好好写题和补题的代价,自己为自己的行为负全责
真的不知道干嘛去了,反正,这套题只签了一道题,嗯,很菜
所以,现在好好补题了,也不玩些有的没的了
//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";
}
}

浙公网安备 33010602011771号