待补题,题目传送门
大水题,四个数 1→4,计算有多少个出现过两次的数字就行
python1 2 3 4 5 6 7 8 9 10 11 12 13
| cnt = [0 for _ in range(5)]
a = list(map(int, input().split()))
for i in a: cnt[i] += 1
res = 0
for i in range(1, 5): res += cnt[i] // 2;
print(res)
|
# 题意
对于给定方程 (d + x) % q[t] == r[t]
,已知 d,qt,rt,求 d+x
# 题解
证明
方程等价于: d + x = k * q[t] + r[t]
x = k * q[t] + r[t] - d
因为 x≥0,所以可以得到
k⋅q[t]+r[t]−d≥0
等价于
k≥q[t]d−r[t]m,minn(k)=⌈q[t]d−r[t]⌉
可以写成
k=q[t]d−r[t]+q[t]−1
总结有 ⌈ba⌉ = ba+b−1
python1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| q = [0 for _ in range(110)] r = [0 for _ in range(110)]
n = int(input()) for i in range(1, n + 1): (q[i], r[i]) = list(map(int, input().split()))
z = int(input()) for i in range(z): (t, d) = list(map(int, input().split()))
k = (d - r[t] + q[t] - 1) // q[t] x = k * q[t] + r[t] - d
print(d + x)
|
水题,对于每一个 ai 找到其左边第一个满足 ak=ai 的 k 的值,如果不存在这样的 k,则输出 -1
你需要注意的是,ai 的范围最大是 109,开数组会爆炸,用 dict,不然会爆炸
python1 2 3 4 5 6 7 8 9 10 11 12 13
| place = {} a = [0 for _ in range(20010)]
n = int(input()) a = list(map(int, input().split()))
for i in range(n): if a[i] not in place: print(-1, end = ' ') else: print(place[a[i]], end = ' ') place[a[i]] = i + 1
|
搜索题,没啥好说的搜就是了
python1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| dx = [1, -1, 0, 0] dy = [0, 0, 1, -1]
s = ['' for _ in range(20)] flag = [[0 for _ in range(11)] for _ in range(11)] res = 0
(h, w, k) = map(int, input().split())
def dfs(x, y, t): global res if t == k: res += 1 return for i in range(4): xx = x + dx[i] yy = y + dy[i]
if (xx >= 0 and xx < h and yy >= 0 and yy < w and s[xx][yy] == '.' and flag[xx][yy] == 0): flag[xx][yy] = 1 dfs(xx, yy, t + 1) flag[xx][yy] = 0
for i in range(h): s[i] = input()
for i in range(h): for j in range(w): if s[i][j] == '.': flag[i][j] = 1 dfs(i, j, 0) flag[i][j] = 0 print(res, end = '')
|
# 题意
给你一个由 N 个非负整数组成的序列 A=(A1,A2,...,AN) 和一个正整数 M 。
求下列数值:
1≤l≤r≤N∑((l≤i≤r∑Ai)modM)
# 题解
设 si 表示 (j=1∑iAj) mod M 的值,那么原式可以转化成: 1≤l≤r≤n∑(sr−sl−1)
展开有:1≤i≤n∑0≤j≤i−1∑(si−sj−1)
整理可得:1≤i≤n∑(i∗si−0≤j≤i−1∑sj)
如果直接减,那么如果 sj>si 的话便会减出负数来,这个时候要加上一个 m
用树状数组维护对于每个 i 有多少个 sj>si,然后继续加上这么多 m 就行
c++1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| int n, m, sum[N], ans, res, c[N];
int lowbit(int x) { return x & -x; }
void add(int x, int k) { while (x <= m) c[x] += k, x += lowbit(x); }
int getSum(int x) { int ans = 0; while (x > 0) ans += c[x], x -= lowbit(x); return ans; }
void solve () { cin >> n >> m; for (int i = 1, x; i <= n; i++) { cin >> x; sum[i] = (sum[i - 1] + x) % m; }
for (int i = 1; i <= n; i++) { ans += i * sum[i] - res + (getSum(m) - getSum(sum[i] + 1)) * m; res += sum[i]; add(sum[i] + 1, 1); }
cout << ans << endl; }
|