This commit is contained in:
Zengtudor 2024-08-03 08:03:06 +08:00
parent e5d7d52bf5
commit 1f0738cd58
12 changed files with 307 additions and 0 deletions

BIN
day1/P5686/P5686 Executable file

Binary file not shown.

73
day1/P5686/P5686.cpp Normal file
View File

@ -0,0 +1,73 @@
#include <bits/stdc++.h>
#define int long long
const int MAX_N = 5*100'000;
const int MOD = 1'000'000'000 + 7;
int a[MAX_N],b[MAX_N];
int prefix_a[MAX_N],prefix_b[MAX_N];
int n;
int cnt=0;
signed main(){
std::cin.sync_with_stdio(false);
std::cin.tie(0);
prefix_a[0]=0;
prefix_b[0]=0;
std::cin>>n;
for (int i=1;i<=n;i++) {
std::cin>>a[i];
prefix_a[i] = (a[i] + prefix_a[i-1])%MOD;
}
for(int i=1;i<=n;i++){
std::cin>>b[i];
prefix_b[i] = (b[i] + prefix_b[i-1])%MOD;
}
for (int l=1; l<=n; l++) {
for (int r=l;r<=n;r++) {
// int sum_a = ;
// int sum_b = ;
cnt = (cnt + (((prefix_a[r]-prefix_a[l-1]+MOD)%MOD)*((prefix_b[r]-prefix_b[l-1]+MOD)%MOD)))%MOD;
}
}
std::cout<<cnt<<"\n";
}
// #include <iostream>
// #include <vector>
// using namespace std;
// const int MOD = 1e9 + 7;
// int main() {
// int n;
// cin >> n;
// vector<int> a(n), b(n);
// for (int i = 0; i < n; ++i) {
// cin >> a[i];
// }
// for (int i = 0; i < n; ++i) {
// cin >> b[i];
// }
// vector<long long> prefix_a(n + 1, 0), prefix_b(n + 1, 0);
// for (int i = 1; i <= n; ++i) {
// prefix_a[i] = (prefix_a[i - 1] + a[i - 1]) % MOD;
// prefix_b[i] = (prefix_b[i - 1] + b[i - 1]) % MOD;
// }
// long long result = 0;
// for (int l = 1; l <= n; ++l) {
// for (int r = l; r <= n; ++ r) {
// long long sum_a = (prefix_a[r] - prefix_a[l - 1] + MOD) % MOD;
// long long sum_b = (prefix_b[r] - prefix_b[l - 1] + MOD) % MOD;
// result = (result + sum_a * sum_b) % MOD;
// }
// }
// cout << result << endl;
// return 0;
// }

67
day1/P5686/P5686.md Normal file
View File

@ -0,0 +1,67 @@
# [CSP-S2019 江西] 和积和
## 题目背景
JXCSP-S T2
## 题目描述
给定两个下标从 $1$ 到 $n$ 编号的序列 $a_i,b_i$,定义函数 $S(l,r)(1\le l\le r\le n)$ 为:
$$\sum_{i=l}^r a_i\times \sum_{i=l}^r b_i$$
请你求出下列式子的值:
$$\sum_{l=1}^n \sum_{r=l}^n S(l,r)$$
由于答案可能很大,你只需要给出答案模 $10^9+7$ 后的结果。
## 输入格式
第一行一个正整数 $n$ 表示序列长度。
第二行 $n$ 个正整数表示 $a_i$。
第三行 $n$ 个正整数表示 $b_i$。
## 输出格式
仅一行一个整数表示答案模 $10^9+7$ 后的结果。
## 样例 #1
### 样例输入 #1
```
3
2 3 4
3 4 5
```
### 样例输出 #1
```
244
```
## 样例 #2
### 样例输入 #2
```
5
11 22 33 44 55
12 34 56 78 90
```
### 样例输出 #2
```
201542
```
## 提示
【数据范围】
对于 $20\%$ 的数据:$n\le 10$ , $a_i,b_i\le 10$
对于 $40\%$ 的数据:$n\le 200$ , $a_i,b_i\le 100$
对于 $70\%$ 的数据:$n\le 3000$ , $a_i,b_i\le 10^5$
对于 $100\%$ 的数据:$3\le n\le 5\times 10^5$ , $1\le a_i,b_i\le 10^9$。

72
day1/PreSim/总结.md Normal file
View File

@ -0,0 +1,72 @@
# 区间最值求和
## 题目描述
给一个长度 $n$ 的序列 $a$,求:
$$
\sum_{l=1}^n\sum_{r=l}^n max(a[l...r])
$$
## 输入格式
第一行1个整数 $n$
第二行 $n$ 个整数 $a[1,2,...,n]$
## 输出格式
输出1个整数代表答案
## 样例 #1
### 样例输入 #1
```
4
2 1 3 4
```
### 样例输出 #1
```
30
```
## 样例 #2
### 样例输入 #2
```
5
4 5 7 2 4
```
### 样例输出 #2
```
87
```
## 样例 #3
### 样例输入 #3
```
见下发样例
```
### 样例输出 #3
```
见下发样例
```
## 提示
对于所有数据,$1\le n,a[i]\le 10^6$
subtask1(20pts)$n \le 5000$
subtask2(20pts)$a[i]\le 50$
subtask4(60pts):无特殊限制

BIN
day1/U234197/U234197 Executable file

Binary file not shown.

27
day1/U234197/U234197.cpp Normal file
View File

@ -0,0 +1,27 @@
#include <algorithm>
#include<bits/stdc++.h>
#include <iostream>
#include <ostream>
const int MAX_N{1000'000};
int n;
int a[MAX_N];
int cnt{0};
int main(){
std::cin.sync_with_stdio(false);
std::cin.tie(0);
std::cin>>n;
for(unsigned i=0;i<n;i++){
std::cin>>a[i];
}
for(unsigned l{0};l<n;l++){
int max_num = INT_MIN;
for (unsigned r{l};r<n;r++) {
max_num = std::max(a[r],max_num);
cnt+=max_num;
}
}
std::cout<<cnt<<"\n";
}

24
day1/U234197/U234197.md Normal file
View File

@ -0,0 +1,24 @@
当然,我可以帮你解释这一段 LaTeX 代码:
\[
\sum_{l=1}^n\sum_{r=l}^n \max(a[l...r])
\]
这是一个嵌套求和表达式,分为以下几部分:
1. **外层求和** \(\sum_{l=1}^n\):表示对 \(l\) 从 1 到 \(n\) 进行求和。
2. **内层求和** \(\sum_{r=l}^n\):在每个固定的 \(l\) 值下,表示对 \(r\) 从 \(l\) 到 \(n\) 进行求和。
3. **最大值函数** \(\max(a[l...r])\):表示在数组 \(a\) 的子数组 \(a[l] \) 到 \(a[r]\) 之间取最大值。
组合在一起,这个表达式的意思是:
对于数组 \(a\) 中的所有可能的子数组 \(a[l...r]\)(其中 \(1 \leq l \leq r \leq n\)),求这些子数组的最大值的和。
逐步解释如下:
1. 选定左端点 \(l\) 从 1 到 \(n\)。
2. 对于每个 \(l\),选定右端点 \(r\) 从 \(l\) 到 \(n\)。
3. 计算子数组 \(a[l] \) 到 \(a[r]\) 的最大值。
4. 将所有这些最大值相加。
总的来说,这个表达式代表的是将所有可能的子数组的最大值进行累加的结果。

BIN
day1/U234197/tempCodeRunnerFile Executable file

Binary file not shown.

View File

@ -0,0 +1,27 @@
#include <algorithm>
#include<bits/stdc++.h>
#include <iostream>
#include <ostream>
const int MAX_N{1000'000};
int n;
int a[MAX_N];
unsigned cnt{0};
int main(){
std::cin.sync_with_stdio(false);
std::cin.tie(0);
std::cin>>n;
for(unsigned i=0;i<n;i++){
std::cin>>a[i];
}
for(unsigned l{0};l<n;l++){
int max_num = INT_MIN;
for (unsigned r{l};r<n;r++) {
max_num = std::max(a[r],max_num);
cnt+=max_num;
}
}
std::cout<<cnt<<"\n";
}

BIN
day1/learn/test_cpp_io Executable file

Binary file not shown.

View File

@ -0,0 +1,6 @@
#include <bits/stdc++.h>
int main(){
std::cin.sync_with_stdio(false);
std::cin.tie(0);
}

11
day2/U458258/U458258.cpp Normal file
View File

@ -0,0 +1,11 @@
#include <bits/stdc++.h>
using namespace std;
int times;
int main(){
cin>>times;
for (int i=1; i<=times; i++) {
}
}