掉大分

E

对于一个序列,把它排回去的最小次数是 $\sum置换环大小-1=错位个数-置换环个数$

注意到m小于等于n/3。那么最多修正2m个错位。正确位置的个数必须大于等于n/3才可能在m次内修正。

每个点正确位置只有一个。那么整个序列最多有3个位置,以它们为开头满足条件。找出这些位置再暴力验证即可

 1 #include <queue>
2 #include <bitset>
3 #include <vector>
4 #include <cstdio>
5 #include <cstring>
6 #include <algorithm>
7 #define ll long long
8 using namespace std;
9 const int maxn=3e5, N1=maxn+5;
10
11 template <typename _T> void read(_T &ret)
12 {
13 ret=0; _T fh=1; char c=getchar();
14 while(c<'0'||c>'9'){ if(c=='-') fh=-1; c=getchar(); }
15 while(c>='0'&&c<='9'){ ret=ret*10+c-'0'; c=getchar(); }
16 ret=ret*fh;
17 }
18
19 int T,m,n;
20 int p[N1],cnt[N1];
21 int a[N1],vis[N1];
22
23 int check(int to)
24 {
25 for(int i=1+to;i<=n;i++) a[i-to]=p[i];
26 for(int i=1;i<=to;i++) a[i+n-to]=p[i];
27 for(int i=1;i<=n;i++) vis[i]=0;
28 int tot=0;
29 for(int i=1,num,x;i<=n;i++)
30 {
31 num=0;
32 if(vis[i]) continue;
33 for(x=i;;x=a[x])
34 {
35 vis[x]=1; num++;
36 if(a[x]==i) break;
37 }
38 tot+=num-1;
39 }
40 return tot<=m;
41 }
42
43 int main()
44 {
45 // freopen("a.in","r",stdin);
46 read(T);
47 while(T--)
48 {
49 read(n); read(m);
50 for(int i=1,x;i<=n;i++)
51 {
52 read(p[i]);
53 x=i-p[i]; if(x<0) x+=n;
54 cnt[x]++;
55 }
56 int ans=0, pos[3]={0,0,0}, fl;
57 for(int i=0;i<n;i++) if(cnt[i]>=n/3)
58 {
59 fl=check(i);
60 if(fl) pos[ans++]=i;
61 }
62 printf("%d ",ans);
63 for(int i=0;i<ans;i++) printf("%d ",pos[i]);
64 puts("");
65 for(int i=1;i<=n;i++) cnt[i]=0;
66 }
67 return 0;
68 }

F

此题应用了一个经典的换掉mod的方法:
$$
a\ mod\ b=a-\lfloor \frac{a}{b} \rfloor b
$$
我们把式子拆分一下,让问题变得有序
$$
p[k]=f[k]+g[k]\\
$$

$$
f[k]=\sum_{i,j\le k,j<i}a[i]\ mod\ a[j] \\
=f[k-1]+\sum_{i=1}^{k-1}a[k]\ mod\ a[i] \\
=f[k-1]+\sum_{i=1}^{k-1}a[k]-\lfloor \frac{a[k]}{a[i]} \rfloor a[i] \\
=f[k-1]+(k-1)a[k]-\sum_{i=1}^{k-1}\lfloor \frac{a[k]}{a[i]} \rfloor a[i]
$$

最后一项与前面的a[i]有关,我们从左往右处理,相当于每次向序列末尾推进一个a[k],接着计算它的贡献。a[i]会对a[k]在每隔ai的一段连续区间产生相同的贡献。对$[0,a[i])$产生0点,对$[a[i],2a[i])$产生a[i]点贡献。。。

我们需要区间修改,单点查询,上线段树

注意题目中的关键条件$a[i]\ne a[j]$,满足调和级数,那么即使我们暴力修改,也最多修改$O(mlogm)$个连续区间

接着处理剩下的一部分贡献
$$
g[k]=\sum_{i,j\le k,j<i}a[j]\ mod\ a[i] \\
=g[k-1]+\sum_{i=1}^{k-1}a[i]\ mod\ a[k] \\
=g[k-1]+\sum_{i=1}^{k-1}a[i]-\lfloor \frac{a[i]}{a[k]} \rfloor a[k] \\
=g[k-1]+\sum_{i=1}^{k-1}a[i]-\sum_{i=1}^{k-1}\lfloor \frac{a[i]}{a[k]} \rfloor a[k]
$$
还能用和上面相同的方法处理吗?答案是否定的,我们要对后面的式子**整除分块**计算贡献,而每次整除分块的复杂度是$O(\sqrt{m})$,修改的区间个数是$O(m\sqrt{m})$,应该会被卡

考虑讨论$\lfloor \frac{a[i]}{a[k]} \rfloor$的取值,在$[0,a[k])$之间是0,在$[a[k],2a[k])$之间是1。。。

对每个区间查询$a[i]$的和以及$a[i]$的出现次数!区间个数满足调和级数,也是$O(mlogm)$的

单点修改,区间查询,上线段树

总复杂度$O(mlogmlogn)$

CF1553X Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2)的更多相关文章

  1. Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2) Editorial题解

    A 略,发现只有当末尾为9时才满足条件.. B 简单模拟,注意数组大小!!! C 简单模拟. D 比较暴力的一个做法就是每次找一个开始匹配的起始点,然后每次不同时向后跳2就行了. 注意这里最后还要判断 ...

  2. Harbour.Space Scholarship Contest 2021-2022 题解

    多好的上分机会啊,要是换个时间(指改在 NOI 之后)我说不定就能上 2500 了(做白日梦 ing) A 签到题不多说,显然只有末尾为 \(9\) 的数是 interesting 的,因此答案就是 ...

  3. KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解

    KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...

  4. Codeforces Round #792 (Div. 1 + Div. 2) A-E

    Codeforces Round #792 (Div. 1 + Div. 2) A-E A 题目 https://codeforces.com/contest/1684/problem/A 题解 思路 ...

  5. CF Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)

    1. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B. Batch Sort    暴力枚举,水 1.题意:n*m的数组, ...

  6. xHTML+div布局:三个div,两边div宽度固定,中间div宽度自适应

    xHTML+div经常考题:三个div,两边div宽度固定,中间div宽度自适应. 和大家分享一个实现方式: 1.html代码 <div class="dyleft"> ...

  7. getElementsByTagName("div")和$("div")区别

    作者:zccst <body> <div class="selected">1</div> <div class="select ...

  8. 【codeforces】【比赛题解】#868 CF Round #438 (Div.1+Div.2)

    这次是Div.1+Div.2,所以有7题. 因为时间较早,而且正好赶上训练,所以机房开黑做. 然而我们都只做了3题.:(. 链接. [A]声控解锁 题意: Arkady的宠物狗Mu-mu有一只手机.它 ...

  9. Codeforces 1023 A.Single Wildcard Pattern Matching-匹配字符 (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)

    Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter ...

随机推荐

  1. 我是如何破解你的WINDOWS密码的 ?(1)

    我是如何破解你的WINDOWS密码的 ?(1) 密码可以看作我们主要,甚至某些情况下唯一可用于防范入侵的防线.就算入侵者无法在物理上接触到计算机,对于对外的Web应用,他们依然可以通过远程桌面协议或身 ...

  2. 多端开发之uniapp开发app

    最近在给f做一些工具app,学习了不少关于uniapp编写android应用的知识. 首先,App应用的创建的时候要选择项目类型为uniapp类型.最开始我选择的是h5+项目,这种项目就比较容易写成纯 ...

  3. 虚拟机搭建web服务器

    下载CentOS镜像 下载网址:阿里云镜像 选择版本(这里我使用的7) 选择isos/ 选择Minimal.iso,这个版本是最小镜像安装:没有图像界面 只有命令行 将CentOS安装到VM16中 注 ...

  4. ios plist获取权限

    最近太忙了,没有时间写vue 这个权限获取有点坑,极不好记,所以备份一份 <key>NSVideoSubscriberAccountUsageDescription</key> ...

  5. python写的百度图片爬虫

    学了一下python正则表达式,写一个百度图片爬虫玩玩. 当技术遇上心术不正的人,就成我这样的2B青年了. python3.6开发.程序已经打包好,下载地址: http://pan.baidu.com ...

  6. [LeetCode]1108. IP 地址无效化

    给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". 示例 ...

  7. 攻防世界之Web_php_unserialize

    题目: <?php class Demo {     private $file = 'index.php';    public function __construct($file) {   ...

  8. ESP32-S3 arduino 开发环境搭建

    ESP32-S3 arduino 简要描述 在github上搜索arduino-esp32,找到并打开espressif/arduino-esp32仓库,从master主分支切换到esp32-s3-s ...

  9. 【C#基础概念】元数据 metadate

    元数据是指"描述资料的资料".它被用来概述资料的基础信息,以简化查找过程与方便使用[6]. 创建资料的方法 资料的用途 创建的时间与日期 资料的创建者或作者 资料被创建在电脑网络的 ...

  10. MySQL创建表、更改表和删除表

    1.创建表 mysql> create table t_address( -> id int primary key auto_increment, // 设置id为主键,自动增值 -&g ...