考虑对于$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. 如何做好 NodeJS 框架选型?

    作为一个有一定工作经验的工程师,工作中经常会遇到技术选型的问题.比如当我们在工作中需要使用到 NodeJS 时,第一个要解决的问题就是如何选择一个合适的框架. 不同的框架有不同的特点,如果我们仅仅从框 ...

  2. Vulnhub实战-DockHole_1靶机👻

    Vulnhub实战-DockHole_1靶机 靶机地址:https://www.vulnhub.com/entry/darkhole-1,724/ 1.描述 我们下载下来这个靶机然后在vmware中打 ...

  3. 分布式/微服务必配APM系统,SkyWalking让你不迷路

    前言 如今分布式.微服务盛行,面对拆分服务比较多的系统,如果线上出现异常,需要快速定位到异常服务节点,假如还用传统的方式排查肯定效率是极低的,因为服务之间的各种通信会让定位更加繁琐:所以就急需一个分布 ...

  4. 使用YApi搭建API接口管理工具(docker安装)

    使用YApi搭建API接口管理工具(docker安装) 工具描述 YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布 ...

  5. CAM对象样式表

    CAM对象样式表 121 160 UF_machining_task_type UF_mach_order_task_subtype 112 UF_machining_null_grp_type 无 ...

  6. 安装早期老版本 Visual Studio

    安装早期老版本 Visual Studio https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/

  7. 谈谈BEM规范(含代码)

    css规范之BEM规范 前言 引用一句经典名言在编程的世界里其中一件最难的事情就是命名,不管是设计到编程语言还是标记语言都会有命名的需求.今天聊的就是关于css的命名规范的发展过程以及演变. 命名的发 ...

  8. filebeat收集日志到elsticsearch中并使用ingest node的pipeline处理

    filebeat收集日志到elsticsearch中 一.需求 二.实现 1.filebeat.yml 配置文件的编写 2.创建自定义的索引模板 3.加密连接到es用户的密码 1.创建keystore ...

  9. C语言零基础入门难发愁,那就快来看看这篇基础整理资料吧

    C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成.格式.以及良好的书写风格,使小伙伴对c语言有个初步认识. 例1:计算两个整数之和的c程序: #include main() { in ...

  10. Spring Security:如何在Postman中优雅地测试后端API(前后端分离)

    前言 在Postman中可以编写和执行自动化测试,使用 JavaScript 编写基本的 API 测试,自由编写任何用于自动化测试的测试方案. 在POSTMAN中读取Cookie值 1. 我们需要向& ...