LGR-156-Div.3 题解
LGR-156-Div.3 题解
洛谷网校 8 月普及组月赛 I & MXOI Round 1 & 飞熊杯 #2
第一次AK一个比赛!而且排名这么靠前!!!
T1 宝箱
思路
注意到答案有两种情况。1.从原点走到
代码
int myabs(int x) {
return x < 0 ? -x : x;
}
int a, b, ans = 0x7fffffff;
int main() {
read(a), read(b);
ans = min(ans, myabs(a - 0) + myabs(a - b));
ans = min(ans, myabs(b - 0) + myabs(b - a));
write(ans);
return 0;
}
T2 方格
思路
注意到每个点好朋友的个数即与它的数字相同的点的个数减去与它相邻且数字相同的点的个数。又注意到 long long
。时间复杂度:
代码
const int MAXN = 2005;
ll n, m, a[MAXN][MAXN];
ll t[20], ans;
int main() {
read(n), read(m);
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++) {
read(a[i][j]);
t[a[i][j]] ++;
}
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++) {
ans += t[a[i][j]] - 1;
if (i > 1 && a[i - 1][j] == a[i][j])
ans --;
if (i < n && a[i + 1][j] == a[i][j])
ans --;
if (j > 1 && a[i][j - 1] == a[i][j])
ans --;
if (j < m && a[i][j + 1] == a[i][j])
ans --;
}
write(ans);
return 0;
}
T3 涂色
思路
注意到答案为涂色后层数 long long
。时间复杂度:
代码
const ll MAXN = 200005, MAXK = 500005;
ll n, q, k, sum, ans;
ll h[MAXN], l[MAXN], t[MAXK];
int main() {
read(n), read(m), read(q), read(k);
for (ll i = 1, op, x; i <= q; i ++) {
read(op), read(x);
if (op == 1) h[x] ++; // 统计
else l[x] ++;
}
for (ll i = 1; i <= n; i ++) h[i] %= k; // mod
for (ll i = 1; i <= m; i ++) {
l[i] %= k; // mod
t[l[i]] ++; // 桶
}
for (ll i = 1; i <= n; i ++)
ans += m - t[(k - h[i]) % k]; // 查桶
write(ans);
return 0;
}
T4 城市
思路
设点
时间复杂度:
代码
ll tot, ver[MAXN << 1], nxt[MAXN << 1], head[MAXN], edge[MAXN << 1];
ll n, q, sum[MAXN], siz[MAXN], ans, nowans; // 模数大,不开long long见祖宗
void add(ll x, ll y, ll z) {
ver[++ tot] = y;
nxt[tot] = head[x];
head[x] = tot;
edge[tot] = z;
}
void dfs1(ll x, ll fa) {
siz[x] = 1; // 子树大小
for (ll i = head[x], y; i; i = nxt[i]) {
y = ver[i];
if (y == fa) continue;
dfs1(y, x);
siz[x] += siz[y];
sum[x] = 1ll * (sum[x] + sum[y] + (1ll * edge[i] * siz[y]) % mod) % mod;
}
}
void dfs2(ll x, ll fa) {
for (ll i = head[x], y; i; i = nxt[i]) {
y = ver[i];
if (y == fa) continue;
sum[y] = 1ll * (sum[x] + 1ll * (siz[1] - 2ll * siz[y]) % mod * edge[i] % mod) % mod;
// 转移方程
sum[y] = (sum[y] % mod + mod); // 注意处理负数情况
dfs2(y, x);
}
}
int main() {
read(n), read(q);
for (ll i = 1, u, v, c; i < n; i ++) {
read(u), read(v), read(c);
add(u, v, c);
add(v, u, c);
}
dfs1(1, 0); // 两次dfs
dfs2(1, 0);
for (ll i = 1; i <= n; i ++)
ans = 1ll * (ans % mod + sum[i] % mod) % mod; // 不加点的答案
for (ll i = 1, k, w; i <= q; i ++) {
read(k), read(w);
nowans = 1ll * (ans % mod + 2ll * (sum[k] % mod + n % mod * w % mod) % mod) % mod;
// 处理加点后的答案
write(nowans);
putchar('\n');
}
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/17659657.html,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】