令$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. 题解 「ZJOI2018」历史

    题目传送门 Description 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣. 这个世界有 \(n\) 个城市,这 \(n\) 个城市被恰 ...

  2. ORM框架查询数据库时返回指定的字段

    django model.objects.filter() 查询指定字段 1.model.objects.filter().values('field_name'),单个字段 2.model.obje ...

  3. VMware中Linux虚拟机与Windows主机共享文件夹

    VMware下Linux虚拟机与Windows主机共享文件夹 1. 安装vm-tool 2. 开启共享文件夹 虚拟机->设置->选项->共享文件夹"右边选择"总是 ...

  4. '\r'(回车符),'\n'(换行符)与"\r\n"

    一.'\n','\r'和"\r\n" 回车\r本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return(回车,carriage有&q ...

  5. Jmeter之BeanShell 断言

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

  6. the Agiles Scrum Meeting 1

    会议时间:2020.4.9 20:00 1.每个人的工作 今天已完成的工作 前端 学习JavaScript.Vue.ElementUI相关知识 issues:预习任务-前端:JavaScript 预习 ...

  7. 北航OO第三单元总结

    JML基础梳理及工具链 JML的全称是Java Modeling language,即Java建模语言.JML是一种行为接口规格.它为严格的程序设计提供了一套行之有效的方法.通过JML不仅可以基于规格 ...

  8. spring social实现百度登录

    在早期我写过一篇spring social理解的文章,介绍了一些spring social的概念,但是没有提供一个例子.在这篇博客中,提供一个简单的spring social的例子,实现 百度登录,那 ...

  9. 在浏览器上开发GO和Vue!(基于code-server)

    在浏览器上开发GO和Vue!(基于code-server) 曾几何时,开发者们都被安装编程环境苦恼,尽管现在很多语言的开发环境已经不难装了,但是如果我们能有一个运行在云端的编译器,那么我们就可以随时随 ...

  10. [luogu2973]driving out the piggies 驱逐猪猡【高斯消元+概率DP】

    看到题面的那一刻,我是绝望的ORZ 图论加概率期望加好像不沾边的高斯消元???我人直接傻掉 还没学过概率期望的我果断向题解屈服了(然后还是傻掉了两节课来找线性方程.. Description 奶牛们建 ...