[Comet1790]Ternary String Counting
令$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的更多相关文章
- Balanced Ternary String CodeForces - 1102D (贪心+思维)
You are given a string ss consisting of exactly nn characters, and each character is either '0', '1' ...
- 牛客多校第四场 A Ternary String
题目描述 A ternary string is a sequence of digits, where each digit is either 0, 1, or 2. Chiaki has a t ...
- 2018牛客网暑期ACM多校训练营(第四场) A - Ternary String - [欧拉降幂公式][扩展欧拉定理]
题目链接:https://www.nowcoder.com/acm/contest/142/A 题目描述 A ternary string is a sequence of digits, where ...
- CodeForces - 1009B Minimum Ternary String
You are given a ternary string (it is a string which consists only of characters '0', '1' and '2'). ...
- 牛客网暑期ACM多校训练营(第四场):A Ternary String(欧拉降幂)
链接:牛客网暑期ACM多校训练营(第四场):A Ternary String 题意:给出一段数列 s,只包含 0.1.2 三种数.每秒在每个 2 后面会插入一个 1 ,每个 1 后面会插入一个 0,之 ...
- B. Minimum Ternary String (这个B有点狠)
B. Minimum Ternary String time limit per test 1 second memory limit per test 256 megabytes input sta ...
- codeforces ~ 1009 B Minimum Ternary String(超级恶心的思维题
http://codeforces.com/problemset/problem/1009/B B. Minimum Ternary String time limit per test 1 seco ...
- CF1009B Minimum Ternary String 思维
Minimum Ternary String time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Balanced Ternary String(贪心+思维)
题目链接:Balanced Ternary String 题目大意:给一个字符串,这个字符串只由0,1,2构成,然后让替换字符,使得在替换字符次数最少的前提下,使新获得的字符串中0,1,2 这三个字符 ...
随机推荐
- Java程序的执行过程
Java程序的执行过程 编译器将 Java 源代码编译成字节码class文件 类加载到 JVM 里面后,执行引擎把字节码转为可执行代码 执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行
- node-pre-gyp以及node-gyp的源码简单解析(以安装sqlite3为例)
title: node-pre-gyp以及node-gyp的源码简单解析(以安装sqlite3为例) date: 2020-11-27 tags: node native sqlite3 前言 简单来 ...
- SpringBoot-thymeleaf-静态资源引入和接管
引入前端 templates下放html页面 static下放css.js.image等静态资源 添加thymeleaf命名空间 <html lang="en" xmlns: ...
- md5验证文件上传,确保信息传输完整一致
注:因为是公司项目,仅记录方法和思路以及可公开的代码. 最近在公司的项目中,需要实现一个上传升级包到服务器的功能: 在往服务器发送文件的时候,需要确保 文件从开始发送,到存入服务器磁盘的整个传输的过程 ...
- Coursera Deep Learning笔记 结构化机器学习项目 (上)
参考:https://blog.csdn.net/red_stone1/article/details/78519599 1. 正交化(Orthogonalization) 机器学习中有许多参数.超参 ...
- [对对子队]会议记录4.18(Scrum Meeting9)
今天已完成的工作 何瑞 工作内容:修复了一些关卡1的bug 相关issue:搭建关卡1 相关签入:4.18签入1 4.18签入2 梁河览 工作内容:实现了音量控制,添加了BGM 相 ...
- [技术博客] 利用SharedPreferences来实现登录状态的记忆功能
[技术博客] 利用SharedPreferences来实现登录状态的记忆功能 一.SharedPreferences简介 SharedPreferences是Android平台上一个轻量级的存储辅助类 ...
- dice_game攻防世界进阶区
dice_game XCTF 4th-QCTF-2018 前言,不得不说,虽然是个简单题但是还是要记录一下,来让自己记住这些东西. 考察的知识点是: 1.cdll_loadlibrary加载对应库使得 ...
- Noip模拟74 2021.10.11
T1 自然数 考场上当我发现我的做法可能要打线段树的时候,以为自己百分之百是考虑麻烦了 但还是打了,还过掉了所有的样例,于是十分自信的就交了 正解还真是线段树,真就第一题数据结构 但是包括自己造的小样 ...
- VS2019、Qt5.12及QGis3.16开发常见问题汇总
在C++.Qt软件开发过程中,常常遇到一些编译错误或警告:本文将VS2019.Qt5.12.10和QGis3.16.10的二次开发过程常见的问题做了整理,供大家参考,也便于日后查阅.该内容分为四部分: ...