博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
The 2019 Asia Nanchang First Round Online Programming Contest C(cf原题,线段树维护矩阵)
阅读量:5290 次
发布时间:2019-06-14

本文共 1889 字,大约阅读时间需要 6 分钟。

题:https://nanti.jisuanke.com/t/41350

分析:先将字符串转置过来

状态转移,因为只有5个状态,所以 i 状态到 j 状态的最小代价就枚举【i】【k】->【k】【j】的最小值(0<=k<=4)

0:初始状态
1:2
2:20
3:201
4:2019
mat[i][j]表示状态i转移到j的最小代价
#include
using namespace std;#define lson root<<1,l,midd#define rson root<<1|1,midd+1,rconst int N=2e5+5;struct node{ int mat[5][5]; void init(){ memset(mat,0x3f,sizeof(mat)); } node operator + (const node &b){ node ret; for(int i=0;i<5;i++) for(int j=0;j<5;j++){ ret.mat[i][j]=N; for(int k=0;k<5;k++) ret.mat[i][j]=min(ret.mat[i][j],mat[i][k]+b.mat[k][j]); } return ret; }}tree[N<<2],ANS;char s[N];void build(int root,int l,int r){ if(l==r){ for(int i=0;i<5;i++) for(int j=0;j<5;j++) if(j!=i) tree[root].mat[i][j]=N; else tree[root].mat[i][j]=0; if(s[l]=='8') tree[root].mat[4][4]=1,tree[root].mat[3][3]=1; else if(s[l]=='9') tree[root].mat[3][3]=1,tree[root].mat[3][4]=0; else if(s[l]=='1') tree[root].mat[2][2]=1,tree[root].mat[2][3]=0; else if(s[l]=='0') tree[root].mat[1][1]=1,tree[root].mat[1][2]=0; else if(s[l]=='2') tree[root].mat[0][0]=1,tree[root].mat[0][1]=0; return ; } int midd=(l+r)>>1; build(lson); build(rson); tree[root]=tree[root<<1]+tree[root<<1|1];}void query(int L,int R,int root,int l,int r){ if(L<=l&&r<=R){ ANS=ANS+tree[root]; return ; } int midd=(l+r)>>1; if(L<=midd) query(L,R,lson); if(R>midd) query(L,R,rson); }char f[N];int main(){ int n,t; scanf("%d%d",&n,&t); scanf("%s",f+1); for(int i=1,j=n;i<=n;i++,j--) s[i]=f[j]; //cout<
View Code

 

转载于:https://www.cnblogs.com/starve/p/11494775.html

你可能感兴趣的文章
亚稳态的产生机理、消除办法 (可以理解为什么打拍)
查看>>
<每日 1 OJ> -Table
查看>>
<每日 1 OJ> -LeetCode 7. 整数反转
查看>>
<每日 1 OJ> -LeetCode 13 . 罗马数字转正数
查看>>
c语言用指针定义一个类型进行输入输出
查看>>
数字电路基础知识
查看>>
C语言之“字符”与“字符串”之间的区别解析
查看>>
<每日 1 OJ> -24. The Simple Problem
查看>>
<每日 1 OJ> -内存文件系统
查看>>
<每日 1 OJ> -LeetCode 28. 实现 strStr()
查看>>
<每日 1 OJ> -LeetCode 21. 合并两个有序链表
查看>>
字符串必须申请内存空间
查看>>
字符串与指针
查看>>
Linux上安装git并在gitlab上建立对应的项目
查看>>
<每日 1 OJ> -LeetCode20. 有效的括号
查看>>
git 学习网站
查看>>
Git常用操作
查看>>
ping-pong buffer
查看>>
Linux 中【./】和【/】和【.】之间有什么区别?
查看>>
Ubuntu sudo 出现 is not in the sudoers file解决方案
查看>>