首页 > 其他分享 >CF1804H Code Lock

CF1804H Code Lock

时间:2023-07-01 20:11:42浏览次数:50  
标签:Code frac Lock 复杂度 choose CF1804H 卡常 两段

牛逼题,但是卡常。

首先显然指针会从密码串第 \(1\) 个位置开始,因此我们需要关心的就是相邻两个位置的值。只需要求出 \(c_{x,y}\) 表示前一个是 \(x\),后一个是 \(y\) 的个数即可。

考虑一般的按顺序填的状压,总是避免不了顺序的问题,总是与 \(k!\) 有关,我们需要一个合适的计算贡献的方法。

首先考虑 \(k\mid2\) 的情况,我们称第 \(i\) 段为第 \(i\) 个和第 \((i-2+k)\bmod k+1\) 中间那一段。同时考虑 \(1\) 和第 \(\frac{k}{2}+1\) 段的出现次数,可以发现:

  • 每一对 \(x,y\) 至多经过这两段总共一次。
  • 当 \(x,y\) 位于两端同一侧的时候,不会经过这两段,否则会经过这两段恰好一次。因为我们计算的是总和,所以不需要考虑到底经过了具体哪一段。

那么这个问题就变得简单起来了,我们只需要知道 \(\frac{k}{2}\) 段这样的中间有什么即可。枚举第 \(1\) 段和第 \(\frac{k}{2}+1\) 段中间的集合是 \(V\),然后设 \(f_{S}\) 表示当前滑动窗口的 \(\frac{k}{2}\) 中是什么,每次选出一个在 \(V\) 中并且仍然在 \(S\) 中的扔掉,再选一个不在 \(V\) 中也不在 \(x\) 中的加进来,计算贡献即可。这样的复杂度是 \(O(k^2{k\choose \frac{k}{2}}^2)\),过不去。

如果能优化掉一个 \(k\) 就好了!发现两步其实是独立的,因此可以先转移一边,再转移另外一边,复杂度就变成 \(O(k{k\choose \frac{k}{2}}^2)\) 了。

对于 \(k\nmid 2\) 的情况,只需要计算所有左端点往后 \(\frac{k}{2}\) 滑动窗口的贡献,然后除以二就是答案了。

有点卡常,强制 \(1\) 在第一段和第 \(\frac{k}{2}+1\) 中间可以将常数变成 \(\frac{1}{2}\)。

submission

标签:Code,frac,Lock,复杂度,choose,CF1804H,卡常,两段
From: https://www.cnblogs.com/275307894a/p/17519860.html

相关文章

  • VSCODE 快捷键总结
    普通快捷键:注释  Ctrl+/按次选中相同的内容  选中后,Ctrl+D一次性选中所有相同的内容  Ctrl+Shift+L移动行:alt+up/down显示/隐藏左侧目录栏 ctrl+b复制当前行:shift+alt+up/down删除当前行:shift+ctrl+k控制台终端显示与隐藏:ctrl+~查找文件/安装vscod......
  • AtCoder Grand Contest 021 E Ball Eat Chameleons
    洛谷传送门AtCoder传送门容易发现一个变色龙是红色当且仅当,设\(R\)为红球数量,\(B\)为蓝球数量,那么\(R\geB\)或\(R=B\)且最后一个球是蓝球。考虑如何判定一个颜色序列是否可行。考虑贪心。若\(R<B\)显然不行。若\(R\geB+n\),每个变色龙都可以分到比蓝球......
  • LeetCode-146-LRU缓存
    146题:LRU缓存题目请你设计并实现一个满足 LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量 capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intke......
  • AtCoder Beginner Contest 307(E,F,G)
    AtCoderBeginnerContest307(E,F,G)E(dp)E这个题大意就是我们需要组成一个长度为\(n\)的数组,满足两个相邻的数字不可以相等,其中,\(a_1\)和\(a_n\)也是相邻的,我们可以选择的数字为\(0\)到\(m-1\),问最后有多少种不同的组成方式满足以上条件。题目大意很简单,就是有点难想,如果\(a......
  • Codeforces Round #877 (Div. 2) A-E
    A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;boolsolve(){intn;cin>>n;intmx=-2e9,mi=2e9;for(inti=1;i<=n;i++){intx;cin>>x;mi=min(x,mi);......
  • [刷题记录Day1]Leetcode列表专题
    No.1题目二分查找思路要素:原数组升序排列清楚地定义左右边界优化空间:数组有序,通过第0元素和最后元素,可以避免查找不在数组范围内的target代码publicstaticintsearch(int[]nums,inttarget){//避免target小于nums[0],大于nums[nums.length-1]时参与运算......
  • Educational Codeforces Round 151 (Rated for Div. 2)
    Preface期末考终于结束了,终于可以回来写题了这场是刚考完最后一门的那个晚上打的,因为太久没有写代码了所以不是很熟练而且脑子也不太灵光,只能堪堪写到D题而且手速感人上次CF第二个号因为Rating被roll了导致从紫名掉下来了,这场就把它又打上去了,再这样后面兴许要用第三个号打了......
  • Educational Codeforces Round 151 [div.2 #A-C] 赛后总结(contest/1845)
    link\(\textcolor{lightgreen}{A}-\textcolor{yellow}{B}-\textcolor{yellow}{C}-\textcolor{red}{D}-\textcolor{red}{E}-\color{red}{F}\)A给你一个数n,在给你一个数列1~k,其中x不能用,然后用其他的数任意累加,如能得到n,输出所用数字数量和具体数列。一眼分类。先分是......
  • 【leetcode】【234】【回文链表】
    c++第一个方法#include<algorithm>#include<iostream>#include<memory>#include<vector>//Definitionforsingly-linkedlist.structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}Li......
  • [刷题记录Day3]Leetcode链表专题
    #ListNodedefinitionpublicclassListNode{//结点的值intval;//下一个结点ListNodenext;//节点的构造函数(无参)publicListNode(){}//节点的构造函数(有一个参数)publicListNode(intval){this.val=val;......