CF1553X Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2)
掉大分
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)的更多相关文章
- Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2) Editorial题解
A 略,发现只有当末尾为9时才满足条件.. B 简单模拟,注意数组大小!!! C 简单模拟. D 比较暴力的一个做法就是每次找一个开始匹配的起始点,然后每次不同时向后跳2就行了. 注意这里最后还要判断 ...
- Harbour.Space Scholarship Contest 2021-2022 题解
多好的上分机会啊,要是换个时间(指改在 NOI 之后)我说不定就能上 2500 了(做白日梦 ing) A 签到题不多说,显然只有末尾为 \(9\) 的数是 interesting 的,因此答案就是 ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
- 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 题解 思路 ...
- 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的数组, ...
- xHTML+div布局:三个div,两边div宽度固定,中间div宽度自适应
xHTML+div经常考题:三个div,两边div宽度固定,中间div宽度自适应. 和大家分享一个实现方式: 1.html代码 <div class="dyleft"> ...
- getElementsByTagName("div")和$("div")区别
作者:zccst <body> <div class="selected">1</div> <div class="select ...
- 【codeforces】【比赛题解】#868 CF Round #438 (Div.1+Div.2)
这次是Div.1+Div.2,所以有7题. 因为时间较早,而且正好赶上训练,所以机房开黑做. 然而我们都只做了3题.:(. 链接. [A]声控解锁 题意: Arkady的宠物狗Mu-mu有一只手机.它 ...
- 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 ...
随机推荐
- C++奇异递归模板模式
虚函数的问题 虚函数的主要问题是性能开销比较大,一个虚函数调用可能需要花费数倍于非虚函数调用的时间,尤其是当非虚函数被声明为inline时(注意,虚函数不能被内联). CRTP介绍 CRTP的全称是C ...
- scrapy爬取youtube游戏模块
本次使用mac进行爬虫 mac爬虫安装过程中出现诸多问题 避免日后踩坑这里先进行记录 首先要下载xcode ,所以要更新macOS到10.14.xx版本 更新完之后因为等下要进行环境路径配置 但是ma ...
- Keepalived配置重载(reload)实现方法
一.前言 Keepalived运行过程中,可能存在更改配置的需求,例如修改virtual_ipaddress,virtual_router_id,priority等参数.在keepalived不重启, ...
- IDEA安装下载以及使用
IDE 集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器.编译器.调试器和图形用户界面等工具.集成了代 ...
- 【硬件基础知识】指令集框架(ISA:Instruction Set Architecture)
指令框架(ISA:Instruction Set Architecture) 定义 指令集架构(英语:Instruction Set Architecture,缩写为ISA),又称指令集或指令集体系, ...
- C#析构函数(方法)
析构方法是在垃圾回收.释放资源时使用的.析构函数用于析构类的实例.备注: 不能在结构中定义析构函数.只能对类使用析构函数. 一个类只能有一个析构函数. 无法继承或重载析构函数. ...
- ABP 使用ElasticSearch、Kibana、Docker 进行日志收集
ABP 使用ElasticSearch.Kibana.Docker 进行日志收集 后续会根据公司使用的技术,进行技术整理分享,都是干货哦别忘了关注我!!! 最近领导想要我把项目日志进行一个统一收集,因 ...
- c/c++中sort函数用法
转载自博主:九江镇中https://www.cnblogs.com/jjzzx/ c++标准库里的排序函数的使用方法 I)Sort函数包含在头文件为#include<algorithm>的 ...
- Windows Service 安装、启动和卸载
win+R输入cmd,以管理员身份运行cmd: 安装: 1.cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 回车 2.输入(InstallUtil ...
- TensorFlow入门示例教程
本部分的代码目前都是基于GitHub大佬非常详细的TensorFlow的教程上,首先给出链接: https://github.com/aymericdamien/TensorFlow-Examples ...