考虑对于$p_{i}=0$,那么可以快速比较出$s_{0},s_{1},...,s_{i-1}$与$s_{i},s_{i+1},...,s_{n}$之间的大小关系,然后对两边分别找到最小的$p_{i}$即可,用线段树维护复杂度多了一个log无法通过,因此需要用笛卡尔树来维护
笛卡尔树:https://oi-wiki.org/ds/cartesian-tree/
搜索时维护在其前面的数量,即要求出笛卡尔树的子树大小,另外需要特殊处理$d[i]=s_{0}[p[i]]$的情况,可以令$p[i]=n$,还有当两个字符串相同时编号小的优先

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2000005
4 #define mod 1000000007
5 int t,n,p[N],d[N],st[N],ls[N],rs[N],rk[N];
6 void dfs(int k,int l,int r,int s){
7 if ((p[k]==n)||(l>=r)){
8 for(int i=l;i<=r;i++)rk[i]=s+(i-l);
9 return;
10 }
11 dfs(ls[k],l,k,s+(p[k]%10>d[k])*(r-k));
12 dfs(rs[k],k+1,r,s+(p[k]%10<d[k])*(k-l+1));
13 }
14 int main(){
15 scanf("%d",&t);
16 while (t--){
17 scanf("%d",&n);
18 int p1,p2,p3,p4;
19 scanf("%d%d%d%d",&p1,&p2,&p3,&p4);
20 for(int i=0;i<n;i++)p[i]=i;
21 for(int i=1;i<n;i++){
22 swap(p[p1%(i+1)],p[i]);
23 p1=(1LL*p1*p2+p3)%p4;
24 }
25 int d1,d2,d3,d4;
26 scanf("%d%d%d%d",&d1,&d2,&d3,&d4);
27 for(int i=0;i<n;i++){
28 d[i]=d1%10;
29 d1=(1LL*d1*d2+d3)%d4;
30 if (p[i]%10==d[i])p[i]=n;
31 }
32 st[0]=0;
33 for(int i=0;i<n;i++){
34 int k=st[0];
35 while ((k>0)&&(p[st[k]]>p[i]))k--;
36 if (k)rs[st[k]]=i;
37 if (k<st[0])ls[i]=st[k+1];
38 st[++k]=i;
39 st[0]=k;
40 }
41 dfs(st[1],0,n,0);
42 int s=1,ans=0;
43 for(int i=0;i<=n;i++){
44 ans=(ans+1LL*s*rk[i])%mod;
45 s=s*10000019LL%mod;
46 }
47 printf("%d\n",ans);
48 }
49 }

[nowcoder5668H]Sort the Strings Revision的更多相关文章

  1. Perl小知识点之排序sort

    脚本这种东西,就是要常用,否则一段时间不用就生疏了,因此决定时时记一些小知识点,一来回顾一下,二来需要的时候可以迅速获得提示. Sort by number You could now write a ...

  2. golang sort

    package main import ( "fmt" "strings" "sort" ) type Animals []string f ...

  3. go排序

    补注: 近来又看 go 的排序, 发现以前对 go 的排序理解的有点浅了. go 的排序思路和 c 和 c++ 有些差别. c 默认是对数组进行排序, c++ 是对一个序列进行排序, go 则更宽泛一 ...

  4. Java学习之字符串练习

    1.给定一个字符串数组.按照字典顺序进行从小到大的排序. * 思路: * 1,对数组排序.可以用选择,冒泡都行. * 2,for嵌套和比较以及换位. * 3,问题:以前排的是整数,比较用的比较运算符, ...

  5. LINQ基础(二)

    本文主要介绍LINQ查询操作符 LINQ查询为最常用的操作符定义了一个声明语法.还有许多查询操作符可用于Enumerable类. 下面的例子需要用到LINQ基础(一)(http://www.cnblo ...

  6. golang 标准库间依赖的可视化展示

    简介 国庆看完 << Go 语言圣经 >>,总想做点什么,来加深下印象.以可视化的方式展示 golang 标准库之间的依赖,可能是一个比较好的切入点.做之前,简单搜了下相关的内 ...

  7. Bandit Wargame Level12 Writeup

    Level Goal The password for the next level is stored in the file data.txt, which is a hexdump of a f ...

  8. float_array.go

    )         if err != nil {             log.Fatalf("Could not parse: %s", s)             ret ...

  9. data.go

    {         return ErrList(errs)     }     return nil }

随机推荐

  1. js 手动实现 promise.all的功能

    在中高级面试中,实现一个promise.all是一个频率较高的面试题 首先分析下 promise.all(),(参考MDN) 接收一个promise的iterable类型(注:Array,Map,Se ...

  2. ssh 批量免密登陆

    SSH第一次连接远程主机 公钥交换原理 1.客户端发起链接请求2.服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)3.客户端生成密钥对4.客户端用自己的公钥异或会话ID,计算出一个 ...

  3. 洛谷4400 BlueMary的旅行(分层图+最大流)

    qwq 首先,我们观察到题目中提到的每天只能乘坐一次航班的限制,很容易想到建分层图,也就是通过枚举天数,然后每天加入一层新的点. (然而我一开始想的却是erf) 考虑从小到大枚举天数,然后每次新建一层 ...

  4. NX 图标

    vector_on_curve   crosscut_zig_zag_with_lifts vector_along_curve   zlevel_zig add_new_sc   zlevel_zi ...

  5. spyglass DFT

    SolvNet spyglass clock_11 内部 generated clocks 在shift mode 不被 testclock 控制. Fix View the Incremental ...

  6. DOS命令和快捷键

  7. 使用寄存器点亮LED——2

    1. 项目:使用stm32寄存器点亮LED, 分别点亮红.绿.蓝3个灯. 2. 步骤 先新建个文件夹保存项目 再新建项目 将startup_stm32f10x_hd.s拷贝到该文件夹下 新建main. ...

  8. FastAPI 学习之路(三十七)元数据和文档 URL

    你可以在 FastAPI 应用中自定义几个元数据配置. 你可以设定: Title:在 OpenAPI 和自动 API 文档用户界面中作为 API 的标题/名称使用. Description:在 Ope ...

  9. [no code][scrum meeting] Alpha 15

    项目 内容 会议时间 2020-04-23 会议主题 OCR紧急会议 会议时长 45min 参会人员 PM + OCR组(赵涛,黎正宇) 项目 内容 会议时间 2020-04-24 会议主题 全体测试 ...

  10. logstash multi pipeline的使用

    logstash multi pipeline的使用 一.背景 二.解决方案 1.方案一: 2.方案二: 3.方案三: 三.实现步骤 1.编写 pipeline 文件 1.从文件收集,输出到控制台 2 ...