考虑对于$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. Redis缓存穿透、缓存击穿、缓存雪崩的介绍及其解决方案

    首先,来画一张图了解下缓存处理的流程 一.缓存穿透 描述: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求查询该数据,导致数据库压力过大. 解决方案: 1.接口校验 如鉴权校验.数据合法性 ...

  2. 题解 [HAOI2017]方案数

    题目传送门 Solution 我们没有障碍的时候很好做,直接设 \(f_{i,j,k}\) 表示到 \((x,y,z)\) \(x\) 有 \(i\) 位为 \(1\),\(y\) 有 \(j\) 位 ...

  3. Fastjson中getJSONObject()与getJSONArray()的使用

    测试JSON串: { "package": { "List1": { "errorCode": "0", "e ...

  4. canvas中的优先级,.after最前,before最底,canvas中间,部件在布局下面

    <RelativeWidget>: # 画布之后 canvas.before: Color: # 白色 rgba:[1,1,1,1] Rectangle: pos:self.pos # 最 ...

  5. 机器学习:EM算法

    EM算法 各类估计 最大似然估计 Maximum Likelihood Estimation,最大似然估计,即利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值的计算过程. 直白来讲,就 ...

  6. seata整合多数据源

    seata整合多数据源 一.背景 二.整合步骤 1.seata server的搭建 2.引入数据源切换组件 3.引入seata组件 4.配置多数据源 5.关闭seata自己默认的数据源代理 6.配置s ...

  7. pyinstaller和wordcloud和jieba的使用案列

    一.pyinstaller库 1.简介 pyinstaller库:将脚本程序转变为可执行(.exe)格式的第三方库 注意:需要在.py文件所在目录进行以下命令,图标扩展名是.ico 2.格式: pyi ...

  8. Noip模拟75 2021.10.12

    T1 如何优雅的送分 他说是送分题,我就刚,没刚出来,想到莫比乌斯容斥后就都没推出来 好吧还是不能被恶心的题目,挑衅的语言打乱做题节奏 于是这一场也就没了.... $F(i)$表示$i$的不同质因子集 ...

  9. Noip模拟38 2021.8.13

    T1 a 跟入阵曲很像,但是忘记入阵曲这题的思路是什么了 这里再提一下,入阵曲是子矩阵和是$k$的倍数,这道题目是子矩阵和是在一段区间内$[L,R]$ 因为这道题$n$特别小,$m$较大,考虑复杂度为 ...

  10. hdu 3047 Zjnu Stadium(并查集)

    题意: 300个座位构成一个圈. 有N个人要入座. 共有M个说明 :A B X ,代表B坐在A顺时针方向第X个座位上.如果这个说明和之前的起冲突,则它是无效的. 问总共有多少个无效的. 思路: 并查集 ...