传送门

题目解释:

有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相关推荐

  1. 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 ...

  2. [CF731D]80-th Level Archeology

    80-th Level Archeology 题解 很明显,要使序列小于序列所需操作次数的区间一定是连续的,在1到n的环上连续. 于是,我们可以先地求出使前一个区间小于后一个区间的操作次数区间,然后通 ...

  3. 80-th Level Archeology(前缀和,区间交集)

    I - 80-th Level Archeology(前缀和,区间交集) CodeForces - 731D 题意: ​ 给出n个串,一共有c种字母编号为1-c.然后描述每一个串.每一次可以使得所有串 ...

  4. Codeforces731D 80-th Level Archeology

    考虑将两个单词变成有序,我们可以得到一个或者两个旋转次数的区间. 然后考虑将两组单词变成有序,比如[l,mid]和[mid+1,r],对于mid和mid+1这两个单词我们可以求出使他们有序的旋转次数的 ...

  5. 【题解】PAT (Basic Level) Practice (中文)

    互联网行业的小白,写博客的目的是为了记录自己的学习过程.对自己学习中所犯的错误做一个总结.由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教! PAT Basic Level P ...

  6. Codeforces Round #376 (Div. 2) D. 80-th Level Archeology(乱搞)

    题目链接: codeforces731d 题意: 给你n个字符串,每个字符串的元素x取值范围在[1,c],问你能否将所有的x同时进行若干次加1(如果x==c,x变成1)使得字符串是按字典序从小到大排序 ...

  7. CodeForces - 731D 80-th Level Archeology(线段树+暴力/差分)

    题目链接:点击查看 题目大意:给出 n 个数列,再给出一个模数 mod,每次操作可以将所有的数字进行:x = x %mod + 1 操作,问至少进行多少次操作,才能使得 n 个数列按照字典序非降序排列 ...

  8. 【codeforces 731D】80-th Level Archeology

    [题目链接]:http://codeforces.com/contest/731/problem/D [题意] 给你n个象形文; 每个象形文由l[i]个数字组成; 你可以把所有的组成象形文的数字同时增 ...

  9. 【CF731D】80-th Level Archeology

    题目 展开 题目描述 Archeologists have found a secret pass in the dungeon of one of the pyramids of Cycleland ...

最新文章

  1. Oracle数据库密码过期重置
  2. Jenkins安装maven integration plugin失败解决方法
  3. 微信小程序button授权页面,用户拒绝后仍可再次授权
  4. Java反射机制在UI自动化测试中的一个应用
  5. redhat6.3的linux内核版本,1-6-RHEL6.3-内核升级(Red Hat Enterprise Linux Server6.3)@树袋飘零...
  6. linux7配置iptables配置转发,Centos7安装iptables及配置
  7. SmartImage图片第三方控件android
  8. 改变函数this指向
  9. IOS: Xcode报 Undecleared selector Warning错误的解决方法
  10. 计算机图形图像处理应用教程,计算机图形图像处理——Photoshop实用教程
  11. php onblur=,onblur
  12. 地对地导弹地对地导弹地对地导弹
  13. 微服务2——服务的注册,调用(Nacos服务注册中心+服务调用+调用负载均衡)sca-comsumersca-provider
  14. 服务器安装嵌入式系统,嵌入式设备连接云服务器
  15. JavaFX鼠标移入后改变样式
  16. tp计算机术语是什么意思,tp是什么意思呀?谁能把术语给我解释一下? – 手机爱问...
  17. 南加大计算机专业本科sat要求,南加州大学SAT成绩要求
  18. springAOP详解
  19. (7)Scrum Master的七种武器之离别钩霸王枪箱子
  20. PostgreSQL 查表、所属schema、字段、字段类型、注释等信息

热门文章

  1. Java生成树状结构返回结果
  2. WBCE CMS安全漏洞(CVE-2022-25099)
  3. 职场任我行——软件测试工程师
  4. USB接口供电不足的原因分析与解决方案
  5. MERCURY无线面板式AP-强电供电-WiFi密码-IP地址
  6. [JZOJ5137]养猫
  7. 制造企业产品成本核算功能设计实例
  8. 名帖145 行书《兰亭八柱帖》第三册:冯承素摹兰亭序
  9. 基于python将txt文件数据导出至excel中
  10. CVE-2019-0948:Microsoft Management Console (MMC)漏洞