第一题: 买酱油,买五瓶送两瓶,买三瓶送一瓶。10元/瓶。给出钱数,问最多能买多少瓶酱油。
第二题:教师取放钥匙,结构体排序,重载运算符。
第三题:文件操作,字符串处理,查询。
第四题:有向图的搜索。能达到点v的点数 + 点v可达到的点数 == 总点数n - 1。询问有多少个这样的点。暴力深搜每个点,记录可达信息
第五题:听说特判1能得八十分。用树状数组+特判1优化就满分了。好像还可以优雅地暴力解题,分块+莫队。但我不会。
第三题把读到的信息去掉所有空格,就是一个串。对于要查询的字符串例如address,变成 键"address": 这样就不会和值中的address重了。只得了60分这题。
第一题:(100)
#include
#include
#include
#include
#include
#include
#include
#include
第二题:(100)
#include
#include
#include
#include
#include
#include
#include
#include
第三题:(60)
#include
#include
#include
#include
#include
#include
#include
#include
第四题:(100)
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
using namespace std;
const int N = 1007;
vector e[N]; //动态数组邻接表存图
bool mp[N][N]; //mp[i][j] i 到 j是否通
bool vis[N];
void dfs(int u, int cur) {
vis[u] = 1;
mp[u][cur] = mp[cur][u] = 1;
for (int i = e[u].size() - 1; i >= 0; --i) {
int v = e[u][i];
if (!vis[v])
dfs(v, cur);
}
}
int main()
{
int n, m, cnt = 0;
scanf("%d%d", &n, &m);
for (int i = 0; i
第五题:
#include
#include
using namespace std;
const int N = 1e6 + 7;
typedef long long LL;
LL bit[N];
int n, m, a[N];
inline int lowbit(int x) {
return x & -x;
}
void add(int pos, int val) {
for (int i = pos; i <= n; i += lowbit(i))
bit[i] += val;
}
LL sum(int x) {
LL res = 0;
for (int i = x; i > 0; i -= lowbit(i)) {
res += bit[i];
}
return res;
}
int main()
{
while(~scanf("%d%d", &n, &m)) {
memset(bit, 0, sizeof bit);
for (int i = 1; i <= n; ++i) {
scanf("%d", a + i);
add(i, a[i]);
}
while(m-- > 0) {
int opt, l, r, val;
scanf("%d", &opt);
if(opt == 1) {
scanf("%d%d%d", &l, &r, &val);
if(val == 1) continue; //虽有整数都是1的倍数,优化
for(int i = l; i <= r; ++i) if(a[i] >= val && a[i] % val == 0) {
add(i,a[i] / val - a[i]);
a[i] /= val;
}
}
else if(opt == 2) {
scanf("%d%d", &l, &r);
printf("%lld\n", sum(r) - sum(l - 1));
}
}
}
return 0;
}