#include<iostream>
using namespace std;
typedef long long LL;
LL L, R;
LL f(LL x) {
return x - x / 4 - (x % 4 >= 2);
}
int main(void) {
cin >> L >> R;
cout << f(R) - f(L - 1) << endl;
return 0;
}
题:更小的数
思路:
一眼区间,状态定义:为第个字符到第个字符是否可以翻转。
状态转移方程:
代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N = 5010;
int dp[N][N], ans;
char str[N];
int main(void) {
cin >> (str + 1);
int n = strlen(str + 1);
for (int len = 1; len < n; len++) {
for (int i = 1; i + len <= n; i++) {
int j = i + len;
if (str[i] < str[j]) dp[i][j] = 0;
else if (str[i] > str[j]) dp[i][j] = 1;
else dp[i][j] = dp[i + 1][j - 1];
ans += dp[i][j];
}
}
cout << ans << endl;
return 0;
}
题:颜色平衡树(考场%)
思路:
考场上写了个后序遍历,骗了%的分。
当为叶子节点时,必定是颜色平衡树。
当不为叶子节点时,统计左子树和右子树的各颜色数量,加上当前节点颜色,遍历一次判断是否为颜色平衡树。
时间复杂度:
水了%的分。
题:买瓜(搜索:我也不确定考场上能不能全过)
思路:
搜索剪枝,剪枝策略如下:
剩余的瓜全买也不足
当前的重量大于
当前的瓜数大于等于答案
当前状态如果取到 和目前最优解一样的瓜数 也达不到重量
代码:
代码就不写了,爆搜剪枝慢慢调试罢了。
题:异或和之和(考场%)
思路:
这题也是骗了%,理解了题意就能骗,说白了就是一个前缀异或和,轻松水分。
异或前缀和公式:
求解:
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
#define debug(a) cout << #a << " = " << a << endl
#define PI acos(-1)
#define lowbit(x) (x&-x)
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-8;
const int dx[4] = { -1, 0, 1, 0 };
const int dy[4] = { 0, -1, 0, 1 };
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a * b / gcd(a, b); }
const int N = 1e5 + 10;
int T, n, a[N], s[N], ans;
void solve(void) {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
s[i] = a[i] ^ s[i - 1];
}
for (int l = 1; l <= n; l++) {
for (int r = l; r <= n; r++) {
ans += s[r] ^ s[l - 1];
}
}
cout << ans << endl;
}
signed main(void) {
IOS;
T = 1;
//cin >> T;
while (T--) {
solve();
}
return 0;
}