A.NANA与字符串
字符串中只有a, b两个字符
因此左右两端字符相同子串一定是题目中所定义的回文串
求长度为偶数的回文串等于求两端字符相同但奇偶性不同的子串数量
求长度为奇数的回文串等于求两端字符和奇偶性都相同的字串数量
将不同字符不同奇偶性进行计数后进行排列组合
注意单个字符算长度为奇数的子串
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;
#define IO \
ios::sync_with_stdio(false); \
std::cin.tie(0); \
std::cout.tie(0)
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << std::endl
#define testOut(a) std::cerr << "\033[32m" << a << "\033[0m" << std::endl
void solve() {
string s;
cin >> s;
int a1 = 0, a2 = 0, b1 = 0, b2 = 0;
for (int i = 0; i < s.size(); i++) {
a1 += (s[i] == 'a' && (i & 1));
a2 += (s[i] == 'a' && !(i & 1));
b1 += (s[i] == 'b' && (i & 1));
b2 += (s[i] == 'b' && !(i & 1));
}
int ans = a1 * a2 + b1 * b2;
cout << ans << ' ';
ans = a1 * (a1 - 1) / 2 + a2 * (a2 - 1) / 2 + b1 * (b1 - 1) / 2 + b2 * (b2 - 1) / 2;
cout << ans + s.size();
}
signed main() {
IO;
int T;
T = 1;
//cin >> T;
while (T--) {
solve();
}
return 0;
}
C.NANA去上课
将中核看成0,北边为-1到-5,南边为1到5
从0开始,记录下每次走完之后的状态
算出和下一个点之间的距离
最后加上状态的绝对值
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;
#define IO \
ios::sync_with_stdio(false); \
std::cin.tie(0); \
std::cout.tie(0)
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << std::endl
#define testOut(a) std::cerr << "\033[32m" << a << "\033[0m" << std::endl
void solve() {
int n;
cin >> n;
int st = 0, ans = 0;
for (int i = 0; i < n; i++) {
char dir;
int d;
cin >> dir >> d;
if (dir == 'N') {
d = -d;
ans += abs(st - d);
st = d;
}
else {
ans += abs(st - d);
st = d;
}
}
cout << ans + abs(st);
}
signed main() {
IO;
int T;
T = 1;
//cin >> T;
while (T--) {
solve();
}
return 0;
}
D.NANA在夜市
从终点开始bfs
如果能到达就标记
把被标记的点放入队列
判断他四周的点能否到达他的位置,以此类推
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;
#define IO \
ios::sync_with_stdio(false); \
std::cin.tie(0); \
std::cout.tie(0)
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << std::endl
#define testOut(a) std::cerr << "\033[32m" << a << "\033[0m" << std::endl
char mp[1010][1010];
bool f[1010][1010];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
void solve() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> mp[i];
}
queue<pair<int, int>> q;
q.push({n - 1, m - 1});
f[n - 1][m - 1] = true;
int ans = 1;
while (q.size()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int ax = x + dx[i];
int ay = y + dy[i];
if (ax < 0 || ax > n || ay < 0 || ay > m || f[ax][ay]) {
continue;
}
if ((i == 0 && mp[ax][ay] == 'L') || (i == 1 && mp[ax][ay] == 'R') || (i == 2 && mp[ax][ay] == 'U') ||(i == 3 && mp[ax][ay] == 'D')) {
q.push({ax, ay});
f[ax][ay] = true;
ans++;
}
}
}
cout << ans;
}
signed main() {
IO;
int T;
T = 1;
//cin >> T;
while (T--) {
solve();
}
return 0;
}
F.NANA的排名
将每个人的最低分求出后存入cnt数组的对应位置
记录每个分数的人数
然后利用后缀和查询比v[i]+r[i]成绩大的人数来求得排名
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;
#define IO \
ios::sync_with_stdio(false); \
std::cin.tie(0); \
std::cout.tie(0)
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << std::endl
#define testOut(a) std::cerr << "\033[32m" << a << "\033[0m" << std::endl
int l[N], r[N], v[N], cnt[610];
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> l[i] >> r[i];
v[i] = 0;
for (int j = 0; j < 5; j++) {
int x;
cin >> x;
v[i] += x;
}
cnt[v[i] + l[i]]++;
}
for (int i = 600; i >= 1; i--) {
cnt[i] += cnt[i + 1];
}
for (int i = 1; i <= n; i++) {
cout << cnt[v[i] + r[i] + 1] + 1 << endl;
}
}
signed main() {
IO;
int T;
T = 1;
//cin >> T;
while (T--) {
solve();
}
return 0;
}
G.NANA看天鹅舞会
取黑白天鹅中的较小值组成黑白对
剩下的除以2乘B
如果鹅数为奇数则减C
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;
#define IO \
ios::sync_with_stdio(false); \
std::cin.tie(0); \
std::cout.tie(0)
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << std::endl
#define testOut(a) std::cerr << "\033[32m" << a << "\033[0m" << std::endl
void solve() {
int w, b, A, B, C;
cin >> w >> b >> A >> B >> C;
int ans = min(w, b) * A;
ans += (abs(w - b) / 2 * B);
ans -= ((abs(w - b) & 1) * C);
cout << ans;
}
signed main() {
IO;
int T;
T = 1;
//cin >> T;
while (T--) {
solve();
}
return 0;
}
I.NANA做胡辣汤
滑动窗口
每次求出长度为k的区间中未处理好的食材的和
更新ans
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;
#define IO \
ios::sync_with_stdio(false); \
std::cin.tie(0); \
std::cout.tie(0)
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << std::endl
#define testOut(a) std::cerr << "\033[32m" << a << "\033[0m" << std::endl
int a[N], f[N];
void solve() {
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
cin >> f[i];
}
int sum = 0;
for (int i = 0; i < n; i++) {
if (f[i]) {
sum += a[i];
}
}
for (int i = 0; i < k; i++) {
if (!f[i]) {
sum += a[i];
}
}
int ans = sum;
for (int i = k; i < n; i++) {
if (!f[i - k]) {
sum -= a[i - k];
}
if(!f[i]) {
sum += a[i];
}
ans = max(sum, ans);
}
cout << ans;
}
signed main() {
IO;
int T;
T = 1;
//cin >> T;
while (T--) {
solve();
}
return 0;
}
J.NANA与她的朋友们
双指针
将n个朋友的身价进行排序
定义l, r分别指向头和尾
对于指针l,如果k足够做加法使最小值变成指针l指向值的下一个值,就将l指向的值和其前面所有值变成下一个值
对于指针r同理
如果k不够减就尽可能缩小最大值与最小值的差
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;
#define IO \
ios::sync_with_stdio(false); \
std::cin.tie(0); \
std::cout.tie(0)
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << std::endl
#define testOut(a) std::cerr << "\033[32m" << a << "\033[0m" << std::endl
int a[N];
void solve() {
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
int l = 0, r = n - 1;
while (l <= r) {
if ((a[l + 1] - a[l]) * (l + 1) <= k) {
k -= ((a[l + 1] - a[l]) * (l + 1));
a[0] = a[l + 1];
l++;
}
else {
break;
}
if ((a[r] - a[r - 1]) * (n - r) <= k) {
k -= ((a[r] - a[r - 1]) * (n - r));
a[n - 1] = a[r - 1];
r--;
}
else {
break;
}
}
int ans = a[n - 1] - a[0];
if (l <= r) {
ans -= (k / (n - r));
}
cout << ans;
}
signed main() {
IO;
int T;
T = 1;
//cin >> T;
while (T--) {
solve();
}
return 0;
}
K.NANA在郑州
打表
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;
#define IO \
ios::sync_with_stdio(false); \
std::cin.tie(0); \
std::cout.tie(0)
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << std::endl
#define testOut(a) std::cerr << "\033[32m" << a << "\033[0m" << std::endl
int v[] = {1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4};
void solve() {
int n;
cin >> n;
int sum = 0;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
for (int j = 0; j < s.size(); j++) {
sum += (v[s[j] - 'a']);
}
}
cout << sum + n - 1;
}
signed main() {
IO;
int T;
T = 1;
//cin >> T;
while (T--) {
solve();
}
return 0;
}