B
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const LL INF = 1e18 + 10;
LL n, m, k;
LL num[qq];
int main(){
scanf("%lld%lld%lld", &n, &m, &k);
for(int i = 1; i <= n; ++i) {
scanf("%lld", num + i);
}
double dis = k * 1.0 / 1000;
sort(num + 1, num + 1 + n);
LL minx = ceil(dis / (num[n] + m) * 60 * 60), maxn = ceil(dis / (num[1] + m) * 3600);
printf("%lld %lld\n", minx, maxn);
return 0;
}
C
观察(ai, aj)可知就两种关系ai <= aj,ai > aj,最初我的思路是分两部分,第一部分固定ai,统计所有ai > aj的贡献,第二部分固定aj,统计所有ai <= aj的贡献,本以为multiset可以完成这个操作,问了学长才知道不可以,得写任意平衡树,弱鸡不会啊,看题解才发现这个顺序是无意义的,排序之后统计出所有情况即可
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int qq = 1e5 + 10;
int num[qq];
int getNum(int x) {
if(x == 0) return 10;
int ans = 1;
int tmp = x;
while(tmp > 0) {
ans *= 10;
tmp /= 10;
}
return ans - x;
}
int getDigit(int x) {
if(x == 0) return 1;
int ans = 0;
while(x > 0) {
ans++;
x /= 10;
}
return ans;
}
int main() {
int n; scanf("%d", &n);
LL b = 0;
for(int i = 0; i < n; ++i) {
scanf("%d", num + i);
b += 1LL * (n - i - 1) * (getDigit(num[i]));
}
LL a = 0;
sort(num, num + n);
for(int i = n - 1; i > 0; --i) {
int k = lower_bound(num, num + i, getNum(num[i])) - num;
int x = (i - k), y = (i - x);
a += (getDigit(num[i]) + 1LL) * x;
a += (getDigit(num[i]) * 1LL) * y;
}
// printf("%lld %lld\n", a, b);
printf("%lld\n", a - b);
}
D
n^2的预处理n^3的枚举
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 505 + 10;
const LL INF = 1e18 + 10;
char ct[qq][qq];
int X[qq][qq], O[qq][qq];
int x[4], y[4];
int dx[4] = {1, -1, 1, -1};
int dy[4] = {1, 1, -1, -1};
int n, m;
int Dfs(int s, int e) {
for(int i = 0; i < 4; ++i) {
x[i] = s, y[i] = e;
}
int ans = 1;
int cnt = 0;
while(1) {
bool f = true;
cnt++;
for(int i = 0; i < 4; ++i) {
x[i] += dx[i];
y[i] += dy[i];
if(x[i] < 1 || x[i] > n || y[i] < 1 || y[i] > m) f = false;
}
if(ct[x[0]][y[0]] != 'O' || ct[x[1]][y[1]] != 'O') f = false;
if(ct[x[2]][y[2]] != 'X' || ct[x[3]][y[3]] != 'X') f = false;
if(!f) break;
if((x[0] - x[1] + 1) == (O[x[0]][y[0]] - O[x[1] - 1][y[1]]) && (x[2] - x[3] + 1) == (X[x[2]][y[2]] - X[x[3] - 1][y[3]])) {
ans = max(ans, cnt * 2 + 1);
}
}
return ans;
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) {
scanf("%s", ct[i] + 1);
}
for(int j = 1; j <= m; ++j) {
for(int i = 1; i <= n; ++i) {
X[i][j] = X[i - 1][j];
O[i][j] = O[i - 1][j];
if(ct[i][j] == 'X') X[i][j]++;
else O[i][j]++;
}
}
int maxn = 0;
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= m; ++j) {
if(ct[i][j] == 'O') continue;
maxn = max(maxn, Dfs(i, j));
}
}
printf("%d\n", maxn);
return 0;
}