考虑将两个单词变成有序,我们可以得到一个或者两个旋转次数的区间。

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

然后将这个区间与[l,mid]的区间以及[mid+1,r]的区间求交,就可以得到使[l,r]有序的旋转次数的区间。

上面这个过程我们可以用分治来进行,区间求交可以用扫描线法。

#include <bits/stdc++.h>
using namespace std; vector<int> words[];
int cnt[];
int n, c;
int tot = ; void calc(int a, int b)
{
int idx = ;
while (idx < words[a].size() && idx < words[b].size())
{
if (words[a][idx] != words[b][idx])
break;
idx++;
}
if (idx < words[a].size() && idx < words[b].size())
{
if (words[a][idx] < words[b][idx])
{
cnt[]++;
cnt[c - words[b][idx] + ]--;
cnt[c + - words[a][idx]]++;
cnt[c]--;
tot++;
}
else
{
cnt[c + - words[a][idx]]++;
cnt[c - words[b][idx] + ]--;
tot++;
}
}
else if (idx == words[a].size() && idx != words[b].size())
{
cnt[]++;
cnt[c]--;
tot++;
}
else if (idx != words[a].size() && idx == words[b].size())
tot++;
else
{
cnt[]++;
cnt[c]--;
tot++;
}
} void divideConquer(int l, int r)
{
if (l == r)
return;
int mid = (l + r) >> ;
divideConquer(l, mid);
divideConquer(mid + , r);
calc(mid, mid + );
} int main()
{
scanf("%d%d", &n, &c);
for (int i = ; i < n; i++)
{
int l, w;
scanf("%d", &l);
while (l--)
{
scanf("%d", &w);
words[i].push_back(w);
}
}
divideConquer(, n - );
bool ok = false;
int sum = ;
for (int i = ; i < c; i++)
{
sum += cnt[i];
if (sum == tot)
{
ok = true;
printf("%d", i);
break;
}
}
if (!ok)
printf("-1");
return ;
}

Codeforces731D 80-th Level Archeology的更多相关文章

  1. 80-th Level Archeology

    80-th Level Archeology time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

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

  3. CodeForces 731D 80-th Level Archeology

    区间并. 对于上下两个数字,如果不一样,那么可以计算出哪一段范围内可以保证字典序,并且后面所有位置都无需再考虑.对所有范围求交集就是答案了. 求交集写起来有点烦,直接对不可取的范围求并即可. #pra ...

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

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

  5. html5-表单

    例子: text,number,email 的输入框 <!-- required:必填项 --> <!-- autofocus:获得焦点 --> <!-- placeho ...

  6. 纯CSS3制作学生入学档案表单样式代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. nc命令总结

    1.远程拷贝文件从server1拷贝文件到server2上.需要先在server2上,用nc激活监听,server2上运行: 引用 [root@hatest2 tmp]# nc -l 1234 > ...

  8. [Canvas]Bombman v1.04

    Bombman是我仿造红白机上经典游戏爆破小人,用Canvas制作的一款网页版单机游戏, 自我感觉还是有一定的可玩性. 本游戏的胜利条件是用雷消灭所有怪物,但被怪物即使是擦边碰到或是炸弹火焰炸到就算失 ...

  9. [Canvas]Bombman v1.00

    爆破小人Canvas版,请点此下载,并用浏览器打开试玩. 图例: 源码: <!DOCTYPE html> <html lang="utf-8"> <m ...

随机推荐

  1. c 链表之 快慢指针 查找循环节点(转)

    上面分析了 根据这张图 推倒出 数学公式. 刚接触 不能一下弄明白.下面结合上面文章的分析.仔细推倒一下 , 一般设置 快指针 速度是 慢指针的2倍.及 快指针每次遍历两个指针, 慢指针每次遍历1个指 ...

  2. 不能选择sublime作为默认打开方式的解决办法

    Sublime Text 绿色版删除后无法设置为默认打开方式…而且网上也没有给出明确的解决办法 注册表的解决办法: 删除 HKEY_CURRENT_USER\Software\Classes\Appl ...

  3. Beijing Bus

    Search: http://bjgj.aibang.com:8899 https://github.com/sp-chenyang/bus https://github.com/leavind/Co ...

  4. linux 命令之 watch

    watch能够帮你监測一个命令的执行结果,省得你一遍遍的手动执行.在Linux下.watch是周期性的执行下个程序.并全屏显示执行结果.你能够拿他来监測你想要的一切命令的结果变化,比方 tail 一个 ...

  5. Jquery-easyui的默认图标的使用,以及如何添加自己想要的图标

    easyui的默认图标有以下这些: .icon-blank{ background:url('icons/blank.gif') no-repeat; } .icon-add{ background: ...

  6. 使用GitLab CI + Capistrano部署CakePHP应用程序

    使用GitLab CI + Capistrano部署CakePHP应用程序 摘要:本文描述了如使用GitLab CI + Capistrano部署CakePHP应用程序. 目录 1. 问题2. 解决方 ...

  7. 【项目发起】千元组装一台大型3D打印机全教程(一)前言

    前言 最近又碰到了大尺寸模型打样的需求,我这台17cm直径的kossel mini就捉襟见肘了.怎么办呢,这个时候kossel的好就体现出来了,随意扩展,那么就自己做个kossel-max吧.为了向前 ...

  8. WPF新手之如何将数据绑定到TreeView

    看过许多例子,全是绑定到类的,没人说如何绑定到某个对象,偏偏我这个绝对的新手就是要绑定到一个对象,只能自己摸索了: 首先要将数据绑定到容器,有以下几个默认条件:①元数据必须包装在List或者Obser ...

  9. poj 1180 Batch Scheduling (斜率优化)

    Batch Scheduling \(solution:\) 这应该是斜率优化中最经典的一道题目,虽然之前已经写过一道 \(catstransport\) 的题解了,但还是来回顾一下吧,这道题其实较那 ...

  10. 织梦栏目页分页title加"第N页"

    以上就是调用栏目管理的SEO标题代码:{dede:field.seotitle /}的方法,这样充分体现列表页标题显示的效果,有利于搜索引擎的收录. 第二个问题就是这样列表页的标题都成了一个样子的了, ...