掉大分

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. spring循环依赖的产生与解决

    1.循环依赖的产生 在spring中对象默认都是单例的 ,意味整个容器中只有一个该类的对象. 如图,B类有一个属性a,A类有一个属性b.当B类创建对象时,要给a属性赋值:当A类创建对象时,要给b属性赋 ...

  2. 搭建Pritunl+Google认证远程连接

    搭建Pritunl+Google认证远程连接VPN 基于Centos7安装 ​ Pritunl是一款免费开源的 VPN 平台软件(但使用的不是标准的开源许可证,用户受到很多限制).这是一种简单有效的V ...

  3. [Java]Java入门笔记(三):类、对象和方法

    七.类.对象和方法 类和对象的关系 类定义了对象的本质: 类(class)是对象(object)的模板,而对象(object)是类的一个实例(instance). 使多个对象的指向相同: Studen ...

  4. c++基础的记录(随笔记录一些基础的东西)

    1.父类的析构函数为什么要加上virtual关键字. 比如说,父类A,子类B.在A* a = new B()的语句的时候,如果父类析构函数没有virtual,我们在delete指针a的时候,会走父类的 ...

  5. ubuntu系统黑屏,只有一个光标

    使用easyBCD删除原ubuntu引导,重建 添加新条目 引导选择900M左右那个选项

  6. Qt:QByteArray

    0.说明 QByteArray是存储二进制byte数组. 区别于QString:QByteArray中存储的全是byte,而QString中存储的全是16 bit Unicode码.QString是在 ...

  7. Qt:QSqlQuery

    0.说明 QSqlQuery提供了执行SQL代码的方法. QSqlQuery封装了在QSqlDatabase中查询.检索数据的相关函数.它可以用来执行如SELECT.INSERT.UPDATE.DEL ...

  8. c语言刷 链表题记录

    61. 旋转链表 /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode * ...

  9. 几行代码把Chrome搞崩溃之:HTML5 MP3录音由ScriptProcessorNode升级成AudioWorkletNode采坑记

    关键词: STATUS_ACCESS_VIOLATION AudioContext AudioWorkletNode audioWorklet addModule resume suspended c ...

  10. 以QT为例谈环境搭建

    以QT为例谈环境搭建 作者:哲思 时间:2022.1.5 邮箱:1464445232@qq.com GitHub:zhe-si (哲思) (github.com) 前言 自从实习结束,好久没写博客了. ...