【题解】Codeforces731D 80-th Level Archeology
传送门
题目解释:
有n个数列,每个数列长度可能不一样,同时有一个c,你有一种操作,让这n个数列中所有小于c的数都加1,所有等于c的数变成0.问你最少可以操作几次可以让这n个数列满足字典序
我们可以发现,对于任意两个相邻的数列,操作数k有一个符合的区间,且k一定小于c,因为进行c次操作之后的数列与原数列相同,相当于有一个循环的过程。只要操作数k在这个区间里面,上面的数列字典序总小于下面的数列。说得通俗一点,有n-1个区间(有特殊情况,看代码),要求这n-1个区间的交。
怎么做这个问题呢,我们可以采取差分+前缀和的方式进行处理,具体方法就是区间两端位置放个++和–,统计时从前到后加起来就可以了。
下面来讨论一下每种情况:
首先假设有两个word,分别叫做a和b,并且我们定义两个word的失配位置为两个word从前往后逐位比较,所找到的第一个有不相同字符的位置。
具体情况有一下四种:
1.失配位置在a,b中(表示没有一个word是另一个word的前缀),且失配位置上的数a比b小。
举个栗子 a=13
b=15
c=7
明显地,失配位置在第二位,失配位置上的数满足a比b小。画个表格模拟一下:
操作次数 | a | b |
---|---|---|
0 | 13 | 15 |
1 | 24 | 26 |
2 | 35 | 37 |
3 | 46 | 40 |
4 | 57 | 51 |
5 | 60 | 62 |
6 | 71 | 73 |
可以看出,失配位置前的数字对结果不产生影响(因为始终相同,无法比较字典序),由表格易知当操作数在[0,2]∪[5,6][0,2]∪[5,6][0, 2] \cup [5, 6]的情况下是可行的。这个情况比较复杂,因为举其他例子时有可能第二个区间退化成一个数甚至消失,这会不会对我们的程序产生什么影响呢(比如说要特判之类的)?答案是不会。因为假设第二个区间的形式是[p,q][p,q][p, q],第二个区间消失时一定满足p=q+1p=q+1p = q + 1(这个很重要,要自己多举几个例子理解一下,我这里就不证明了),而我们的程序会在ppp的位置+1,在q+1" role="presentation" style="position: relative;">q+1q+1q + 1的位置-1,两个加一减一相互抵消了,因此对我们的程序不产生影响。
2.失配位置在a,b中(表示没有一个word是另一个word的前缀),且失配位置上的数a比b大。
仍然举个栗子 a=14
b=12
c=7
,这个相对较易,我就不画表格模拟了,操作数的区间为[4,5][4,5][4, 5]
3.失配位置在a的末尾的后一个位置(a是b的前缀),这个很简单不管你怎么操作a始终比b小,操作区间[0,c−1][0,c−1][0, c - 1]
4.失配位置在b的末尾的后一个位置(b是a的前缀),这个也很简单,直接就是无解,不需要进行任何操作,直接输出无解可以,continue也可以(缺少一个区间就永远无法让k满足n-1个区间)。
四种情况讨论完了,具体详情看代码吧。
Codes
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int MAXN = 1e6 + 10;
const int MAXC = 1e7 + 10;
vector<int> words[MAXN];
int cnt[MAXC], n, c;
void calc(int a, int b)
{int index = 0;while (index < words[a].size() && index < words[b].size()) //失配位置查询{if (words[a][index] != words[b][index]) break;index++;}if (index < words[a].size() && index < words[b].size()) // 失配位置在a, b中{if (words[a][index] < words[b][index]) // 失配位置a小于b{cnt[0]++;cnt[c - words[b][index] + 1]--;cnt[c - words[a][index] + 1]++;cnt[c]--;}else{cnt[c - words[a][index] + 1]++;cnt[c - words[b][index] + 1]--;}}else if (index == words[a].size() && index != words[b].size()) //a比b短{cnt[0]++; cnt[c]--; }else if (index != words[a].size() && index == words[b].size()); // a比b长,无解else //a和b一样长{cnt[0]++;cnt[c]--;}
}
int main()
{scanf("%d%d", &n, &c); for (int i = 1;i <= n;i++){int len, w;scanf("%d", &len);while (len--){scanf("%d", &w);words[i].push_back(w);}}for (int i = 1;i <= n - 1;i++) calc(i, i + 1);bool flag = false;int sum = 0;for (int i = 0;i < c;i++){sum += cnt[i];if (sum == n - 1){flag = true;printf("%d\n", i);return 0;}}if (!flag) printf("-1\n");return 0;
}
【题解】Codeforces731D 80-th Level Archeology相关推荐
- Codeforces Round #376 (Div. 2) D. 80-th Level Archeology —— 差分法 + 线段扫描法
题目链接:http://codeforces.com/contest/731/problem/D D. 80-th Level Archeology time limit per test 2 sec ...
- [CF731D]80-th Level Archeology
80-th Level Archeology 题解 很明显,要使序列小于序列所需操作次数的区间一定是连续的,在1到n的环上连续. 于是,我们可以先地求出使前一个区间小于后一个区间的操作次数区间,然后通 ...
- 80-th Level Archeology(前缀和,区间交集)
I - 80-th Level Archeology(前缀和,区间交集) CodeForces - 731D 题意: 给出n个串,一共有c种字母编号为1-c.然后描述每一个串.每一次可以使得所有串 ...
- Codeforces731D 80-th Level Archeology
考虑将两个单词变成有序,我们可以得到一个或者两个旋转次数的区间. 然后考虑将两组单词变成有序,比如[l,mid]和[mid+1,r],对于mid和mid+1这两个单词我们可以求出使他们有序的旋转次数的 ...
- 【题解】PAT (Basic Level) Practice (中文)
互联网行业的小白,写博客的目的是为了记录自己的学习过程.对自己学习中所犯的错误做一个总结.由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教! PAT Basic Level P ...
- Codeforces Round #376 (Div. 2) D. 80-th Level Archeology(乱搞)
题目链接: codeforces731d 题意: 给你n个字符串,每个字符串的元素x取值范围在[1,c],问你能否将所有的x同时进行若干次加1(如果x==c,x变成1)使得字符串是按字典序从小到大排序 ...
- CodeForces - 731D 80-th Level Archeology(线段树+暴力/差分)
题目链接:点击查看 题目大意:给出 n 个数列,再给出一个模数 mod,每次操作可以将所有的数字进行:x = x %mod + 1 操作,问至少进行多少次操作,才能使得 n 个数列按照字典序非降序排列 ...
- 【codeforces 731D】80-th Level Archeology
[题目链接]:http://codeforces.com/contest/731/problem/D [题意] 给你n个象形文; 每个象形文由l[i]个数字组成; 你可以把所有的组成象形文的数字同时增 ...
- 【CF731D】80-th Level Archeology
题目 展开 题目描述 Archeologists have found a secret pass in the dungeon of one of the pyramids of Cycleland ...
最新文章
- Oracle数据库密码过期重置
- Jenkins安装maven integration plugin失败解决方法
- 微信小程序button授权页面,用户拒绝后仍可再次授权
- Java反射机制在UI自动化测试中的一个应用
- redhat6.3的linux内核版本,1-6-RHEL6.3-内核升级(Red Hat Enterprise Linux Server6.3)@树袋飘零...
- linux7配置iptables配置转发,Centos7安装iptables及配置
- SmartImage图片第三方控件android
- 改变函数this指向
- IOS: Xcode报 Undecleared selector Warning错误的解决方法
- 计算机图形图像处理应用教程,计算机图形图像处理——Photoshop实用教程
- php onblur=,onblur
- 地对地导弹地对地导弹地对地导弹
- 微服务2——服务的注册,调用(Nacos服务注册中心+服务调用+调用负载均衡)sca-comsumersca-provider
- 服务器安装嵌入式系统,嵌入式设备连接云服务器
- JavaFX鼠标移入后改变样式
- tp计算机术语是什么意思,tp是什么意思呀?谁能把术语给我解释一下? – 手机爱问...
- 南加大计算机专业本科sat要求,南加州大学SAT成绩要求
- springAOP详解
- (7)Scrum Master的七种武器之离别钩霸王枪箱子
- PostgreSQL 查表、所属schema、字段、字段类型、注释等信息