令$f_{i,j,k}$表示前$i$个位置,三种字符最后一次出现的位置为$i,j$和$k$(保证$k<j<i$)的方案数

考虑转移(递推),即分为两步——

1.填写第$i$个字符,即从$f_{i-1,j,k}$转移到$f_{i,j,k},f_{i,i-1,j}$或$f_{i,i-1,k}$

2.考虑以$i$为右端点的区间,即仅保留$j\in [L_{j}(i),R_{j}(i)]$且$k\in [L_{k}(i),R_{k}(i)]$的位置(其余位置清0)

(关于$L/R_{j/k}(i)$显然可以$o(m)$预处理出)

暴力转移复杂度为$o(n^{3})$,考虑优化——

关于第一步,如果将$i$滚动,实际上修改的位置仅有$o(n)$个,而修改的值即某行/列的元素和,那么再额外维护该信息,同时修改也可以继续维护,复杂度降为$o(n^{2})$

关于第二步,注意到一个位置被清0后不会再有值,那么只需要快速找到需要清0且非0的位置,这可以对每行维护一个双向队列来实现,进而均摊复杂度也降为$o(n^{2})$

最终,总复杂度为$o(n^{2}+m)$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 5005
4 #define mod 1000000007
5 deque<int>q[N];
6 int t,n,m,l,r,x,ans,Lj[N],Rj[N],Lk[N],Rk[N],sr[N],sc[N],f[N][N];
7 int read(){
8 int x=0;
9 char c=getchar();
10 while ((c<'0')||(c>'9'))c=getchar();
11 while ((c>='0')&&(c<='9')){
12 x=x*10+c-'0';
13 c=getchar();
14 }
15 return x;
16 }
17 void upd(int x,int y,int z){
18 q[y].push_back(x);
19 sr[x]=(sr[x]+z)%mod;
20 sc[y]=(sc[y]+z)%mod;
21 f[x][y]=(f[x][y]+z)%mod;
22 }
23 void clear_l(int y){
24 int x=q[y].front();
25 q[y].pop_front();
26 sr[x]=(sr[x]-f[x][y]+mod)%mod;
27 sc[y]=(sc[y]-f[x][y]+mod)%mod;
28 f[x][y]=0;
29 }
30 void clear_r(int y){
31 int x=q[y].back();
32 q[y].pop_back();
33 sr[x]=(sr[x]-f[x][y]+mod)%mod;
34 sc[y]=(sc[y]-f[x][y]+mod)%mod;
35 f[x][y]=0;
36 }
37 int main(){
38 t=read();
39 while (t--){
40 n=read(),m=read();
41 for(int i=1;i<=n;i++){
42 Lj[i]=Lk[i]=0;
43 Rj[i]=Rk[i]=i-1;
44 }
45 for(int i=1;i<=m;i++){
46 l=read(),r=read(),x=read();
47 if (x==1)Rj[r]=min(Rj[r],l-1);
48 if (x==2)Lj[r]=max(Lj[r],l),Rk[r]=min(Rk[r],l-1);
49 if (x==3)Lk[r]=max(Lk[r],l);
50 }
51 memset(sr,0,sizeof(sr));
52 memset(sc,0,sizeof(sc));
53 memset(f,0,sizeof(f));
54 for(int i=0;i<n;i++)q[i].clear();
55 upd(0,0,1);
56 for(int i=1;i<=n;i++){
57 for(int j=0;j<max(i-1,1);j++)upd(i-1,j,(sr[j]+sc[j])%mod);
58 for(int j=0;j<i;j++){
59 if ((Lk[i]<=j)&&(j<=Rk[i])){
60 while ((!q[j].empty())&&(q[j].front()<Lj[i]))clear_l(j);
61 while ((!q[j].empty())&&(q[j].back()>Rj[i]))clear_r(j);
62 }
63 else{
64 while (!q[j].empty())clear_l(j);
65 }
66 }
67 }
68 ans=0;
69 for(int i=0;i<n;i++)
70 for(int j=0;j<n;j++)ans=(ans+f[i][j])%mod;
71 printf("%d\n",ans);
72 }
73 return 0;
74 }

[Comet1790]Ternary String Counting的更多相关文章

  1. Balanced Ternary String CodeForces - 1102D (贪心+思维)

    You are given a string ss consisting of exactly nn characters, and each character is either '0', '1' ...

  2. 牛客多校第四场 A Ternary String

    题目描述 A ternary string is a sequence of digits, where each digit is either 0, 1, or 2. Chiaki has a t ...

  3. 2018牛客网暑期ACM多校训练营(第四场) A - Ternary String - [欧拉降幂公式][扩展欧拉定理]

    题目链接:https://www.nowcoder.com/acm/contest/142/A 题目描述 A ternary string is a sequence of digits, where ...

  4. CodeForces - 1009B Minimum Ternary String

    You are given a ternary string (it is a string which consists only of characters '0', '1' and '2'). ...

  5. 牛客网暑期ACM多校训练营(第四场):A Ternary String(欧拉降幂)

    链接:牛客网暑期ACM多校训练营(第四场):A Ternary String 题意:给出一段数列 s,只包含 0.1.2 三种数.每秒在每个 2 后面会插入一个 1 ,每个 1 后面会插入一个 0,之 ...

  6. B. Minimum Ternary String (这个B有点狠)

    B. Minimum Ternary String time limit per test 1 second memory limit per test 256 megabytes input sta ...

  7. codeforces ~ 1009 B Minimum Ternary String(超级恶心的思维题

    http://codeforces.com/problemset/problem/1009/B B. Minimum Ternary String time limit per test 1 seco ...

  8. CF1009B Minimum Ternary String 思维

    Minimum Ternary String time limit per test 1 second memory limit per test 256 megabytes input standa ...

  9. Balanced Ternary String(贪心+思维)

    题目链接:Balanced Ternary String 题目大意:给一个字符串,这个字符串只由0,1,2构成,然后让替换字符,使得在替换字符次数最少的前提下,使新获得的字符串中0,1,2 这三个字符 ...

随机推荐

  1. 基于PaddleOCR实现AI发票识别的Asp.net Core应用

    简要介绍 用户批量上传需要识别的照片,上传成功后,系统会启动Hangfire后台Job开始调用PaddleOCR服务返回结果,这个过程有点类似微服务的架构模型. PaddleOCR PaddleOCR ...

  2. Spring Boot 整合单机websocket(附github源码)

    websocket 概念 websocket 是一个通信协议,通过单个 TCP 连接提供全双工通信.websocket 连接成功后,服务端和客户可以进行双向通信.不同于 http 通信协议需要每次由客 ...

  3. 教你 4 步搭建弹性可扩展的 WebAPI

    作者 | 萧起  阿里云云原生团队 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门",即可获取 Se ...

  4. ApacheCon 首次亚洲大会火热来袭,SphereEx 邀您共赴年度盛会!

    ApacheCon 是 Apache 软件基金会(ASF)的官方全球系列大会.作为久负盛名的开源盛宴,ApacheCon 在开源界备受关注,也是开源运动早期的知名活动之一. ApacheCon 每年举 ...

  5. SpringCloud升级之路2020.0.x版-28.OpenFeign的生命周期-进行调用

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,我们开始分析 OpenFeign 同步环境下的生命周期的第二部分,使用 Synch ...

  6. Java(40)网络编程

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201659.html 博客主页:https://www.cnblogs.com/testero ...

  7. Markdown Reference

    Markdown For Typora Overview Markdown is created by Daring Fireball; the original guideline is here. ...

  8. c语言中for循环 和嵌套for循环

    for循环:for( ; ; )里面是bai3个语句,两个分号.第一个语句是开始前执行,第二个语句是判断真假,如果真,就执行后面(大括号内)的代码.第三个语句是每次执行完毕后执行的东西,通常第三个语句 ...

  9. 51.N皇后问题

    n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案. 每一种解法包含一个明确的 n 皇后问题的棋 ...

  10. 如何使用远程工具连接Linux服务器

    大家好,今天我想和大家分享一下Linux如何连接远程控制工具我们都知道,Linux是著名的开源服务器操作系统,而在运维工程师的实际工作当中,我们不大可能时时刻刻都在服务器本地操作.因此这时,我们要用远 ...