20240909 加练1

目录
  • 比赛链接
  • 总结
    • 知识点
    • 易错点
    • 策略
  • 题解
    • B - Festival Decorating
      • 做法1
      • 做法2
    • D - Operator Precedence
    • K - Card Game

比赛链接

link to contest

总结

知识点

B - Festival Decorating

  • \([A_i \neq 0]\) 可以作为多项式卷积里面多项式的系数

  • bitset 可以做01卷积;此时,每一侧都可以作为最外侧所枚举的:

    •   for(int i=1; i<=n; ++i) f.set(x[i]);//for(int i=0; i<=m; ++i)//	ans[i] = (f & (f>>i)).count();//等价写法:for(int i=1; i<=n; ++i)ans |= f>>x[i];
      
  • bitset 的 _Find_first_Find_next

    •   for(int t=f._Find_first(); t!=f.size(); t=f._Find_next(t))
      

D - Operator Precedence

  • 构造题的方法:“待定系数”、列方程求解

K - Card Game

  • “对所有区间询问”,可以考虑用可持久化线段树预处理“所有区间”的答案

易错点

  • 注意讨论“元素相等”的边界情况(H - Sugar Sweet II)

策略

  • 多想一下再开写(M刚开的时候有好几个思路上的大漏洞)
  • 过题人数与难度不一定正比(G,F 开晚了;K可以开)

题解

B - Festival Decorating

做法1

  • 利用容错性,只需要处理前 \(3^x\) 个元素里能否得到每一个 \(d\)

  • 不考虑颜色就是简单的 FFT。考虑类似于 FFT 做字符串匹配的时候的思路,构造匹配函数:令 \(A_i\) 表示 \(i\) 位置的灯的颜色,没有灯的时候为 0,令 \(B_i = A_i\),只需要计算 \(C_d = \sum_i [A_i > 0][B_{i + d} > 0] (A_i - B_{i+d})^2\)

    • \[ C_d = \sum_i [A_i > 0][B_{i+d} > 0](A_i^2 + B_{i+d}^2 - 2A_iB_{i+d})\\= \sum_i A_i^2 \cdot \left[ B_{i+d} > 0\right]\\+ \sum_i \left[ A_{i} > 0\right] \cdot B_{i+d}^2\\- 2 \cdot \sum_i A_i \cdot B_{i+d} \]

做法2

  • bitset,直接从小到大枚举灯的编号 i,设其它的灯出现的位置集合是 f,还没有找到答案的 d 的集合为n_vis,我们拿出 n_vis & (f >> x[i]) 中的所有 1 更新答案即可
  • 如何得到 f
    • 先记录所有灯的位置集合 all
    • 若颜色为 c[i] 的灯数量不超过 \(T\),直接枚举所有同色灯,然后修改all
    • 若颜色为 c[i] 的灯数量超过 \(\sqrt T\),这样的颜色不超过 \(\frac{n}{T}\) 个,预处理该颜色所有灯的位置 g[c[i]] 然后 all ^= g[c[i]]
  • \(T = \sqrt n\) 可以得到 \(O(n \sqrt n + \frac{n^2}{w})\)​ 的复杂度
//https://codeforces.com/group/Ro45Qpwf2L/contest/104976/submission/280692536
const int N = 250010;
int x[N], c[N], n, m;
vector<int> s[N];bitset<250005> sum, f[1010], nvis, tmp;
int ans[N];
int pos[N], id[N], num;int main() {int q; rd(n), rd(q);for(int i=1; i<=n; ++i) {rd(x[i]), rd(c[i]);m = max(m, x[i]), s[c[i]].PB(x[i]);}int B = ceil(sqrt(n));for(int i=1; i<=n; ++i) if(s[i].size()) {for(int v : s[i]) sum.set(v);if(s[i].size() > B) {id[pos[i] = ++num] = i;for(int v : s[i])f[num].set(v);}}for(int i=1; i<=m; ++i) nvis.set(i);for(int i=1; i<=n; ++i) {if(s[c[i]].size() > B)tmp = (sum^f[pos[c[i]]]);else {tmp = sum;for(int v : s[c[i]]) tmp.reset(v);}tmp = (tmp >> x[i]) & nvis;for (int t=tmp._Find_first();t!=tmp.size();t=tmp._Find_next(t))ans[t] = i, nvis.reset(t);}while(q--) {int d; rd(d);printf("%d\n", (int)(ans[d]));}return 0;
}

D - Operator Precedence

题意:求下列方程的一组解

\[ (a_1 \times a_2) + (a_3 \times a_4) + \cdots + (a_{2n-1}\times a_{2n}) = a_1 \times (a_2 + a_3) \times (a_4 + a_5) \times \cdots \times (a_{2n-2} + a_{2n-1}) \times a_{2n} \]

解:考虑令 \(a_2, a_4 \cdots a_{2n - 2} = 2, a_3, a_5 , \cdots , a_{2n-1} = -1\),设 \(a_1 = x, a_{2n} = y\),则

\[xy = 2x - y -2(n-2) \]

\(x=1\)\(y = 3-n\)​,得到一组合法解。

//https://codeforces.com/group/Ro45Qpwf2L/contest/104976/submission/280942688
int main() {int ts; rd(ts);while(ts--) {int n; rd(n);if(n == 3) {printf("1 -10 6 6 -10 1\n");continue;}print(1), putchar(' ');for(int i=2; i<2*n; ++i)print(i&1 ? -1 : 2), putchar(' ');print(3-n), putchar('\n');}return 0;
}

K - Card Game

设区间 \([l,r]\) 的答案为 \(ans_{l, r}\),设 \(nxt_i\) 表示 \(a_i\) 在序列中下一次出现的位置。则:

\[ans_{l, r} = \begin{cases} ans_{nxt_l + 1, r} & nxt_l \le r\\ 1 + ans_{l + 1, r} & nxt_l > r \end{cases} \]

用可持久化线段树,由 rt[nxt[l] + 1]rt[l+1] 的一部分,合并得到 rt[l]。具体来说,先找到 [l, nxt[l]], [nxt[l]+1, n] 这两个区间被线段树划分出来的 \(O(\log n)\) 个区间,区间及其祖先新建节点,区间的儿子继承之前的树。

//https://codeforces.com/group/Ro45Qpwf2L/contest/104976/submission/280699787
const int N = 3e5 + 10;
const int M = 60 * N;
int ls[M], rs[M], tg[M];
int ncnt;int ql, qr, qt;void upd(int l,int r,int &c, int u, int t) {if(!c) c = ++ncnt;t += tg[u];if(ql <= l && qr >= r) {tg[c] += qt + t;ls[c] = ls[u], rs[c] = rs[u];return;}int mid = l + r >> 1;if(ql <= mid) upd(l, mid, ls[c], ls[u], t);if(qr > mid) upd(mid+1, r, rs[c], rs[u], t);
}int qry(int l,int r,int c) {if(!c || l == r) return tg[c];int mid = l + r >> 1;if(ql <= mid) return qry(l, mid, ls[c]) + tg[c];else return qry(mid+1, r, rs[c]) + tg[c];
}int rt[N];int n, a[N], p[N], lst[N];int main() {int q; rd(n), rd(q);for(int i=1; i<=n; ++i) rd(a[i]);for(int i=1; i<=n; ++i) lst[i] = n+1;for(int i=n; i>=1; --i) {p[i] = lst[a[i]];lst[a[i]] = i;}for(int i=n; i>=1; --i) {ql = i, qr = p[i] - 1, qt = 1;upd(1, n, rt[i], rt[i + 1], 0);ql = p[i], qr = n, qt = 0;if(ql <= qr) upd(1, n, rt[i], rt[p[i] + 1], 0);}int ans = 0;while(q--) {int l, r; rd(l), rd(r);l ^= ans, r ^= ans;// printf("query: %d %d\n", l, r);ql = r;printf("%d\n", ans = qry(1, n, rt[l]));}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/800068.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

春秋云镜 Hospital

春秋云镜 Hospital扔fscan去扫一下heapdump泄露,然而不知道在哪下.dirsearch扫一下访问/actuator/heapdump去下载泄露文件 直接用长城杯用的工具扫 java -jar JDumpSpider-1.1-SNAPSHOT-full.jar heapdump得到key为GAYysgMQhG7/CzIJlVpR2g==,使用shiro综合利用去打弹个shell ba…

章14——集合——Collection 接口

collection 里面可以存放不同数据类型,因为里面是 Object 遍历 Collection 接口方法1:迭代器 但凡实现了 collection 接口都可以用迭代器ArrayList list = new ArrayList();//得到一个集合的迭代器Iterator iterator = list.iterator();while (iterator.hasNext()){//next 函…

分享3款开源、免费的Avalonia UI控件库

Avalonia介绍 Avalonia是一个强大的框架,使开发人员能够使用.NET创建跨平台应用程序。它使用自己的渲染引擎绘制UI控件,确保在Windows、macOS、Linux、Android、iOS和WebAssembly等不同平台上具有一致的外观和行为。这意味着开发人员可以共享他们的UI代码,并在不同的目标平台…

想做数据报表?你的“后台”够硬吗

在数据驱动的时代,制作一份高效、精准的数据报表成为企业管理和决策的重要手段。但要做好数据报表,不仅需要一款功能强大的报表工具,还必须有一个强有力的“后台”管理系统来支撑。那么,为什么报表工具需要一个管理后台?以及管理后台的核心功能有哪些?今天就带大家一探究…

centos789手动无脑用sh脚本安装Java8

#老师给的文件是jdk1.8版本,所以我这边写的也是1.8的脚本 输入命令:mkdir –p /export/data #放置相关的数据文件 输入命令mkdir –p /export/servers #软件的安装目录 输入命令:mkdir –p /export/software 上传文件jdk-8u241-linux-x64.tar.gz到/export/software目录 然后…

C++ vector 的一些操作

▲ 《C++ Primer》 P87▲ 《C++ Primer》 P91

BoardLight

​​这是一个easy程度的靶机,所以博主写的也很简单,总共有2个flag。 信息收集端口扫描: ​​发现开放了22,80端口 Web渗透 ​​最底部发现域名 board.htb写进/etc/hosts​文件中 sudo echo "10.10.11.11 board.htb" | sudo tee -a /etc/hosts 对他进行子域名爆破…

LLM学习笔记-长度外推技术

长度外推为在不需要对模型进行额外训练的情况下,模型可以处理更长的序列。本篇文章主要介绍目前大模型用到的一些长度外推技术,包括以RoPE为基础进行位置插值、NTK-aware、动态NTK、NTK-by-parts 和YaRN。关于RoPE,可参见我的上一篇博客LLM学习笔记-位置编码篇 位置插值 回想…

裘立帆-第一次作业

在博客园建立个人技术博客,完善个人信息及博客设置,并发布一篇包含自我介绍、技能树与技术偏好、课程期望的随笔,以此作为课程参与的开始。这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc/这个作业的目标 熟悉博客的写作和使用,将自己介绍给老师和助教姓名…

章14——集合——集合体系

目录两个难点 底层机制,和不同应用场景下的选择集合体系图,需要背诵!总结: 1、集合主要是两组(单列集合、双列集合) 2、Collection 接口有两个重要的子接口 List Set, 他们的实现子列都是单列集合 3、Map 接口实现的子类是双列集合,存放的是key,value 4、上述两张图要记…

使用 VSCode 调试 Zig

首要条件是你本地需要安装MinGW-w64. 可以参考MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本 - jack_Meng - 博客园 (cnblogs.com) 这里有几点需要注意,在2024年9月时,我没有找exe的安装,你需要在github下载 Releases niXman/mingw-builds-binaries (github.com) …