文章目录

  • T1 night
    • 题意
    • 思路
    • 代码
  • T2 dawn
    • 题意
    • 思路
    • 注意
    • 代码
  • T3 light
    • 题意
    • 思路
    • 代码

chy2003 大爷出的题。

本来这套题一眼看上去对我这种蒟蒻挺友好的,但是,反正每次只要是我自我感觉蛮良好的时候,最后成绩都挺惨的。

期望得分 240 ,实际得分 175 。

T1 night

题意

有一些 m(m≤20)m(m\le 20)m(m≤20) 位二进制数 aia_iai​ 和一个 bbb ,假如 b∗2kb*2^kb∗2k 在二进制下是 1 的位 aia_iai​ 都是 1,那么 aia_iai​ 可以减去 bbb 。

有多组询问,每次问有多少个 aia_iai​ 能够通过一些减 b∗2kb*2^kb∗2k 的操作得到 xxx 。

思路

首先确定这题是一个状压 DP。 dp[i]dp[i]dp[i] 表示 iii 能由多少个数操作得到。

那么现在问题在于去重,因为有的 iii 可能可以由 jjj 通过多次减操作得到,但是 jjj 只能对 iii 有 1 的贡献。

先讲我的 O(m2∗2m)O(m^2*2^m)O(m2∗2m) 的做法,非常 naive。记 dp[i][j]dp[i][j]dp[i][j] ,在 dp[i]dp[i]dp[i] 的基础上多记一位 jjj 表示这个 iii 是由 i+b∗2ji+b*2^ji+b∗2j 减去 b∗2jb*2^jb∗2j 得到的。然后卡常能卡到 2 秒 真是可惜 。

然后是 O(m∗2m)O(m*2^m)O(m∗2m) 做法。只需要记 dp[i]dp[i]dp[i] ,然后改变循环的顺序。先枚举 b∗2kb*2^kb∗2k 中的 kkk ,也就是强行规定先做 kkk 小的操作。那么操作的顺序问题显然就迎刃而解了。

代码

#include<bits/stdc++.h>
using namespace std;
const int M = 21, S = 1<<20;
int T, n, m, c, b, q;
int f[S];template<class T>inline void read(T &x){x = 0; bool fl = 0; char c = getchar();while (!isdigit(c)){if (c == '-') fl = 1; c = getchar();}while (isdigit(c)){x = (x<<3)+(x<<1)+c-'0'; c = getchar();}if (fl) x = -x;
}int main()
{for (read(T); T--; ){read(n); read(m);memset(f, 0, sizeof(f));for (int i = 1; i <= n; ++ i){int x; read(x);f[x]++;}b = 1;for (read(c); c--; ){int x; read(x);b |= 1<<x;}for (; b < (1<<m); b <<= 1)for (int i = (1<<m)-1; i >= 1; -- i)if ((i&b) == b)f[i^b] += f[i];for (read(q); q--; ){int x; read(x);printf("%d\n", f[x]);}}return 0;
}

T2 dawn

题意

有一棵树,求 kkk 条路径的排列,使这 kkk 条路径的交为 xxx 到 yyy 的简单路径。

注意:假如选两条路径,那么 (1,2),(1,3)(1,2),(1,3)(1,2),(1,3) 和 (1,3),(1,2)(1,3),(1,2)(1,3),(1,2) 是两种不同的方案,但是 (1,2),(1,3)(1,2),(1,3)(1,2),(1,3) 和 (2,1),(3,1)(2,1),(3,1)(2,1),(3,1) 是两种相同的方案。

思路

相当于在两棵子树各选 kkk 个点,两两对应形成路径,答案为 (siz[x]∗siz[y])k(siz[x]*siz[y])^k(siz[x]∗siz[y])k , siz[x]siz[x]siz[x] 为 xxx 的子树大小。

然后发现假如 kkk 个点都在 xxx 的同一个儿子的子树里,那么路径的交会比 (x,y)(x,y)(x,y) 要长,那就把这些答案减掉。重复减的容斥一下。

最后只需要对每个点记录子树大小的 kkk 次方,所有儿子子树大小的 kkk 次方和,然后还要记录子树外的那棵子树的信息,用来特判 x,yx,yx,y 某一个是另一个的祖先。

注意

检查取模!!!

检查取模!!!

检查取模!!!

不检查 CSP 爆零活该。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10, M = N<<1, E = 20, K = 100 + 5, mod = 998244353;
int T, n, q;
int h[N], ecnt, nxt[M], v[M];
int f[N][E], dep[N];
int siz[N][K], sum[N][K], tsiz[N][K];template<class T>inline void add(T &x, T y){x += y; if (x >= mod) x -= mod;}template<class T>inline void read(T &x){x = 0; bool fl = 0; char c = getchar();while (!isdigit(c)){if (c == '-') fl = 1; c = getchar();}while (isdigit(c)){x = (x<<3)+(x<<1)+c-'0'; c = getchar();}if (fl) x = -x;
}void _add(int x, int y){nxt[++ecnt] = h[x]; v[ecnt] = y;h[x] = ecnt;
}void dfs(int u, int fa){dep[u] = dep[fa]+1;f[u][0] = fa;for (int i = 1; i < E; ++ i)f[u][i] = f[f[u][i-1]][i-1];siz[u][1] = 1;for (int i = 1; i < K; ++ i)sum[u][i] = 0;for (int i = h[u]; i; i = nxt[i])if (v[i] != fa){dfs(v[i], u);add(siz[u][1], siz[v[i]][1]); // 没有取模!!!for (int j = 1; j < K; ++ j)add(sum[u][j], siz[v[i]][j]); // 没有取模!!!}for (int i = 2; i < K; ++ i)siz[u][i] = 1LL * siz[u][i-1] * siz[u][1] % mod;if (u == 1) tsiz[u][1] = 0;else tsiz[u][1] = n-siz[u][1];for (int i = 2; i < K; ++ i)tsiz[u][i] = 1LL * tsiz[u][i-1] * tsiz[u][1] % mod;
}int lca(int x, int y){if (dep[x] < dep[y]) swap(x, y);for (int i = E-1; i >= 0; -- i)if (dep[f[x][i]] >= dep[y])x = f[x][i];if (x == y) return x;for (int i = E-1; i >= 0; -- i)if (f[x][i] != f[y][i])x = f[x][i], y = f[y][i];return f[x][0];
}int lca_son(int x, int y){if (dep[x] < dep[y]) swap(x, y);for (int i = E-1; i >= 0; -- i)if (dep[f[x][i]] > dep[y])x = f[x][i];return x;
}int solve1(int x, int y, int k){LL ans = 0;add(ans, 1LL * siz[x][k] * siz[y][k] % mod);add(ans, mod - 1LL * sum[x][k] * siz[y][k] % mod);add(ans, mod - 1LL * sum[y][k] * siz[x][k] % mod);add(ans, 1LL * sum[x][k] * sum[y][k] % mod);return ans;
}int solve2(int x, int y, int k){if (dep[x] > dep[y]) swap(x, y);LL ans = 0;int z = lca_son(x, y);int tmp = ((sum[x][k]-siz[z][k]+tsiz[x][k])%mod+mod)%mod;add(ans, 1LL * siz[y][k] * tsiz[z][k] % mod);add(ans, mod - 1LL * tmp * siz[y][k] % mod);add(ans, mod - 1LL * sum[y][k] * tsiz[z][k] % mod);add(ans, 1LL * tmp * sum[y][k] % mod);return ans;
}int main()
{for (read(T); T--; ){read(n); read(q);ecnt = 1; memset(h, 0, sizeof(h));for (int i = 1; i < n; ++ i){int x, y;read(x); read(y);_add(x, y); _add(y, x);}dfs(1, 0);for (int i = 1; i <= q; ++ i){int k, x, y, z;read(k); read(x); read(y);z = lca(x, y);if (z == x || z == y) printf("%d\n", solve2(x, y, k));else printf("%d\n", solve1(x, y, k));}}return 0;
}

T3 light

题意

有 nnn 个格子,标号 111 到 nnn ,可以花费 iii 的代价得到 iii 号格子。有一些格子,在你花钱得到他的时候同时也会得到 [i−k,i+k][i-k,i+k][i−k,i+k] 的所有格子。

现在给定 kkk 和这些特殊格子,求最小的代价得到所有 nnn 个格子。

思路

先写出 DP 方程: dp[i]=min(dp[j]+w)dp[i]=min(dp[j]+w)dp[i]=min(dp[j]+w) ,其中 www 号格子是特殊格子,并且满足
j≥w−k−1,i≤w+kj \ge w-k-1,i\le w+kj≥w−k−1,i≤w+k。

贪心一波,对于某个 iii ,显然会选 w+k≤iw+k\le iw+k≤i 的最小的 www 。然后用单调队列维护一个区间最小的 dp[j]dp[j]dp[j] 就完事了。

然后讲一下我的错误思路:对于每一个位置 iii ,假如他是特殊位置,就拿他和
min(dp[j]),(i−k−1≤j<i)min(dp[j]),(i-k-1\le j < i)min(dp[j]),(i−k−1≤j<i) 来更新 dp[i+k]dp[i+k]dp[i+k] 。显然这个思路漏了 dp[j](i≤j<i+k)dp[j](i \le j< i+k)dp[j](i≤j<i+k)的 jjj ,也就是没有考虑两个选取的特殊位置相互覆盖的情况。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long LL;
const int N = 5e6 + 10;
const LL inf = 1e18 + 7;
int T, n, k;
char s[N];namespace Solver3
{LL f[N];int que[N], h, t;int que1[N], h1, t1;void main(){f[0] = 0;que[h = t = 1] = 0;h1 = 1; t1 = 0;for (int i = 1; i <= n; ++ i){f[i] = f[i-1] + i;if (s[i] == '1') que1[++t1] = i;while (h1 <= t1 && que1[h1]+k < i) h1++;if (h1 <= t1){while (h <= t && que[h] < que1[h1]-k-1) h++;if (h <= t) f[i] = min(f[i], f[que[h]] + que1[h1]);}while (h <= t && f[que[t]] >= f[i]) t--;que[++t] = i;}printf("%lld\n", f[n]);}
}signed main()
{for (scanf("%lld", &T); T--; ){scanf("%lld%lld%s", &n, &k, s+1);Solver3::main();}return 0;
}

【香蕉OI】 chy2003 Contest 1相关推荐

  1. 【香蕉oi】燃烧的火焰(最短路、状压)

    文章目录 题意 思路 代码 题意 我不会的都是好题. 一张连通的图,有k(k≤20)k(k\le 20)k(k≤20)个点被点燃了.每条边有一个权值表示从一个点烧到另一个点需要的时间. 现在可以选择一 ...

  2. 【香蕉OI】GCD 和 LCM (莫比乌斯反演)

    文章目录 题意 思路 代码 题意 给出 TTT 组询问,每组询问求 ∑i≤n∑j≤m[gcd(i,j)≤a]lcm(i,j)\sum_{i\le n}\sum_{j\le m}[gcd(i,j)\le ...

  3. 【香蕉oi】Tree(欧拉序、线段树)

    文章目录 题意 思路 1 2 注意 代码 题意 一棵以1为根的有根树,每条边有边权. 有3种操作: 修改一条边xxx的权值为yyy. 询问以xxx为根的子树中的一点uuu和以yyy为根的子树中一点vv ...

  4. 【香蕉oi】耍望节(数位DP+倍增优化)

    文章目录 题意 思路 注意 代码 题意 有一个长度为n(n≤5∗104)n(n\le 5*10^4)n(n≤5∗104)的只包含数字和?的字符串sss,?中可以填上任意数字.一种合法的填数方案必须满足 ...

  5. 【香蕉oi】Game(SAM,SG函数,假题)

    文章目录 题意 思路 代码 题意 给出一个串SSS. 然后nnn对li,ril_i,r_ili​,ri​,表示S[li,ri]S[l_i,r_i]S[li​,ri​]这个子串(下标从1开始). 对于一 ...

  6. 【香蕉oi】校庆(猫树、线性基)

    文章目录 题意 思路 代码 题意 一棵树,每个点有一个点权. 没有修改,只有一种询问:(x,y)(x,y)(x,y)路径上的点不能选,在其他点之中选出一些,使得选出来的点点权异或和为kkk,问有多少种 ...

  7. 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...

  8. 《算法竞赛中的初等数论》(四)正文 0x40反演(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  9. 《算法竞赛中的初等数论》(三)正文 0x30 积性函数(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

最新文章

  1. vue响应式给数组中的对象添加新属性
  2. gis 联合 融合_超图与广州大学达成战略合作,共建“广州大学超图软件联合研究中心”...
  3. python基础十四之匿名函数
  4. 关于Android消息机制你所需要知道的
  5. mysql数据库扫描_使用nmap对mysql 数据库进行扫描
  6. 重磅开源!目标检测新网络 DetectoRS:54.7 AP,特征金字塔与空洞卷积的完美结合
  7. jenkins 使用xctool 爆出: line 6: xctool: command not found
  8. 修改ubuntu的IP地址,静态IP地址
  9. 云小课|大数据时代的隐私利器-GaussDB(DWS)数据脱敏
  10. ShardingSphere JDBC 分库分表 读写分离 数据加密
  11. 湖南省公务员考试计算机专业,湖南省2018年普通高等学校对口招生考试计算机应用类专业综合知识试题...
  12. 微星主板B550M破击炮无U刷BIOS 内存条插3/4卡槽出现DRAM灯常亮,屏幕无法显示
  13. 爱普生xp245手动清零_仍在Windows XP上吗? 手动更新或感到烦恼
  14. POI的word表格居中
  15. 酒店管理系统--C语言版
  16. VS 2010 与 VS 2008的区别
  17. 一封超级牛的数据库程序员的情书表白
  18. 2019计算机软件考试笔试答案,2019年下半年软件设计师考试上午真题(含答案)
  19. Java--SSH,SSM和Spring Boot框架区别优缺点
  20. 3D地形编程——之GeoMipMap基础(1)

热门文章

  1. 自定义 remoteView
  2. 2020年3月TIOBE语言排行榜-Delphi 也将Out
  3. html布局flex有什么优势,flex布局的优缺点是什么
  4. 【教学类-36-09】20230722职业抽卡(midjounery-niji)(涂色、裁剪、游戏)
  5. 矩阵运算—四维齐次空间
  6. 购买计算机的英语作业,《计算机专业英语》作业
  7. 使用机器学习预测2018年世界杯足球赛
  8. 【历史上的今天】12 月 17 日:词汇 Weblog 被创造;APL 语言发明人诞生;人类飞上天空
  9. start.S:88: Error: invalid constant (61f) after fixup
  10. 51单片机学习:DS18B20温度传感器实验