线段树维护矩阵:0920T4

正解为文艺平衡树维护矩阵,但我打不动,所以打了部分分

首先可以写成dp形式

然后又可以写成矩阵形式

然后矩阵显然支持结合律

所以可以拿线段树维护

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||
ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
//mt19937 rand(time(0));
//mt19937_64 rand(time(0));
//srand(time(0));
#define N 300010
//#define M
#define mo (int)(1e9+7)
int Mod(int a) {return (a%mo+mo)%mo; 
}
struct Martix {int a[4][4]; void mem() {memset(a, 0, sizeof(a)); }void init() {mem(); for(int i=1; i<=3; ++i) a[i][i]=1; }void pre() {mem(); 	for(int i=1; i<=3; ++i) a[1][i]=1; }int calc() {return (a[1][1]+a[1][2]+a[1][3])%mo; }void print() {printf("ans : %lld %lld %lld\n", a[1][1], a[1][2], a[1][3]); }void print_all() {printf("===\n"); for(int i=1; i<=3; ++i, printf("\n")) for(int j=1; j<=3; ++j) printf("%lld ", a[i][j]); }Martix operator *( Martix &A)  {int i, j, k; Martix ans; ans.mem(); 
//		print_all(); A.print_all(); for(i=1; i<=3; ++i)for(j=1; j<=3; ++j)for(k=1; k<=3; ++k)ans.a[i][k]+=a[i][j]*A.a[j][k]%mo, Mod(ans.a[i][k]); 
//		ans.print_all(); return ans; }
}c[4], ans, ps;
void Pre_Martix() {c[0].a[1][2]=1; c[0].a[1][3]=1; c[0].a[2][3]=1; c[2].a[1][1]=1; c[2].a[1][2]=1; c[2].a[1][3]=1; c[2].a[2][2]=1; c[2].a[2][3]=1; c[2].a[3][3]=1; c[1].a[2][1]=1; c[1].a[3][1]=1; c[1].a[3][2]=1; c[3].a[1][1]=1; c[3].a[2][1]=1; c[3].a[2][2]=1; c[3].a[3][1]=1; c[3].a[3][2]=1; c[3].a[3][3]=1; }
int n, m, i, j, k, T;
int f[N][3], cm[N], q, l, r, rt; 
char s[N]; int calc() {ans.pre(); for(i=1; i<n; ++i) {if(cm[i]==1) {if(cm[i]!=cm[i+1]) ans=ans*c[0]; else ans=ans*c[2]; }else {if(cm[i]!=cm[i+1]) ans=ans*c[1]; else ans=ans*c[3]; }	}return ans.calc(); 
}int she1[4]={3, 2, 1, 0}; 
int she2[4]={2, 3, 0, 1}; struct Segment_tree {int tot, ls[N<<2], rs[N<<2]; Martix s[N<<2], s1[N<<2]; int g[N<<2], stg[N<<2]; void build(int &k, int l, int r) {if(!k) k=++tot, s[k].init(), s1[k].init(); if(l==r) return ;int mid=(l+r)>>1; build(ls[k], l, mid); build(rs[k], mid+1, r); }void push_up(int k) {s[k]=s[ls[k]]*s[rs[k]]; s1[k]=s1[ls[k]]*s1[rs[k]]; }void jia(int k, int y) {s[k]=c[y]; s1[k]=c[y^1]; g[k]=y; }void gai(int k, int *she) {g[k]=she[g[k]]; stg[k]=0; s[k]=c[g[k]]; s1[k]=c[g[k]^1]; }void Qu_gai(int k) {stg[k]^=1; g[k]^=1; swap(s[k], s1[k]); }void push_down(int k) {if(stg[k]) {stg[ls[k]]^=1; stg[rs[k]]^=1; g[ls[k]]^=1; g[rs[k]]^=1; swap(s[ls[k]], s1[ls[k]]); swap(s[rs[k]], s1[rs[k]]); stg[k]=0; }}	void add(int k, int l, int r, int x, int y) {if(l==r) return jia(k, y), void(); int mid=(l+r)>>1; if(x<=mid) add(ls[k], l, mid, x, y); else add(rs[k], mid+1, r, x, y); push_up(k); }void Bian(int k, int l, int r, int x, int *she) {if(l==r) return gai(k, she), void(); int mid=(l+r)>>1; push_down(k); if(x<=mid) Bian(ls[k], l, mid, x, she); else Bian(rs[k], mid+1, r, x, she); push_up(k); }void qu(int k, int l, int r, int x, int y) {if(l>=x && r<=y) return Qu_gai(k), void(); int mid=(l+r)>>1; push_down(k); if(x<=mid) qu(ls[k], l, mid, x, y); if(y>=mid+1) qu(rs[k], mid+1, r, x, y); push_up(k); }
}Seg;void suan() { //[1, n-1]for(i=1; i<n; ++i) {if(cm[i]==1) {if(cm[i]!=cm[i+1]) Seg.add(1, 1, n-1, i, 0); else Seg.add(1, 1, n-1, i, 2); }else {if(cm[i]!=cm[i+1]) Seg.add(1, 1, n-1, i, 1); else Seg.add(1, 1, n-1, i, 3); }	}
}signed main()
{
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);freopen("suffix.in", "r", stdin);freopen("suffix.out", "w", stdout);
//	T=read();
//	while(T--) {
//
//	}n=read(); q=read(); for(i=1; i<n; ++i) cm[i]=read(); cm[n]=0; Pre_Martix(); if (n<=500) {printf("%lld\n", calc()); while(q--) {scanf("%s", s+1); l=read(); r=read(); if(s[1]=='F') {for(i=l; i<=r; ++i) cm[i]^=1; }else {for(i=l, j=r; i<=j; ++i, --j) swap(cm[i], cm[j]); }printf("%lld\n", calc()); }return 0; }Seg.build(rt, 1, n-1); ans.pre(); suan(); ps=ans*Seg.s[1];  printf("%lld\n", ps.calc()); while(q--) {scanf("%s", s+1); l=read(); r=read(); if(s[1]=='F') {if(l-1>=1) Seg.Bian(1, 1, n-1, l-1, she2); if(r<n) Seg.Bian(1, 1, n-1, r, she1); if(l!=r) Seg.qu(1, 1, n-1, l, r-1); }ps=ans*Seg.s[1]; printf("%lld\n", ps.calc()); }return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的排序算法及时间空间复杂度

排序算法是计算机科学中的基本算法之一&#xff0c;它用于将一组数据按照某种顺序进行排列。下面是一些常见的排序算法&#xff0c;以及它们的思想和时间空间复杂度&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢…

Python日期处理库:掌握时间的艺术

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 日期和时间在计算机编程…

nginx重写与防盗链

Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求&#xff0c;此功能依靠 PCRE(perl compatible regular expression)&#xff0c;因此编译之前要安装PCRE库&#xff0c;rewrite是nginx服务器的重要功能之 一&#xff0c;用于实现URL的重写&#xff0c;URL…

《中国数字经济发展指数报告(2023年)》发布

导读 国家统计局《数字经济及其核心产业统计分类(2021)》首次对数字经济及其核心产业统计分类做出详细说明。然而&#xff0c;由于数字经济内涵外延的不断丰富&#xff0c;区域数字经济发展的量化评估仍在持续发展的过程中&#xff0c;以量化模型方式能够更加客观全面反映新时…

flash attention的CUDA编程和二维线程块实现softmax

本文参考了链接添加链接描述 flash attention介绍 flash attention的介绍可以参考论文:FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness,具体的数学公式参考下面这个图片:其中注意关于矩阵S有两个维度,softmax的操作维度是dim=1,用pytorc…

【HarmonyOS】元服务卡片router实现跳转到指定页面

【关键字】 元服务卡片、router跳转不同页面 【写在前面】 本篇文章主要介绍开发元服务卡片时&#xff0c;如何实现从卡片中点击事件跳转到指定的应用内页面功能。此处以JS UI开发服务卡片为例&#xff0c;JS卡片支持组件设置action&#xff0c;包括router事件和message事件&…

蒙特卡洛方法的数学基础-1

蒙特卡洛方法的数学基础-1 概率论 Bayes 公式 常用分布 Binominal Distribution Poisson Distribution Gaussian Distribution Exponential Distribution Uniform Distribution 大数定理 均匀概率分布随机地取N个数xi &#xff0c;函数值之和的算术平均收敛于函数的期望值 …

rsyslog-日志管理 logrotate-日志轮转

日志的管理的方式&#xff0c;以及怎么自己写一个管理日志的小脚本&#xff0c;其实也不能算脚本 管理日志的进程 rsyslogd&#xff1a;绝大部分日志记录&#xff0c;和系统操作有关&#xff0c;安全&#xff0c;认证sshd,su&#xff0c;计划任务at,cron… httpd/nginx/mysql: …

2. 两数相加

2. 两数相加 迭代 class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode h1 l1, h2 l2, dummy new ListNode(-1, h1), d dummy;int carry 0, sum 0;while(h1 ! null && h2 ! null){sum h1.val h2.val carry;carry sum / 10…

基于nRF7002-DK的NFC功能切换系统(nRF Connect SDK+NFC)

目录 项目介绍硬件介绍项目设计开发环境及工程目录总体流程图硬件初始化NFC功能实现文本记录安卓应用打开按键切换功能 功能展示项目总结 &#x1f449; 【Funpack2-6】基于nRF7002-DK的NFC功能切换系统 &#x1f449; Github: EmbeddedCamerata/nRF7002-DK-nfc-function-switc…

ADS放大器模型参数含义

ADS放大器模型参数含义 S21 : Forward Transmission Coefficient, use xj*y, polar(x,y), dbpolar(x,y) for complex value 增益&#xff0c;X是增益大小&#xff0c;y是相位 S11 : Forward Reflection Coefficient, use xj*y, polar(x,y), dbpolar(x,y), vswrpolar(x,y) for …

新手学习:ArcGIS对shp文件裁剪

新手学习&#xff1a;ArcGIS对SHP文件裁剪 新手学习 记录每个步骤&#xff0c;因为有很多控件可能刚开始还不熟悉&#xff0c;根本不知道在哪里&#xff0c;所以写的比较详细。 1.添加要裁剪的shp文件 2.查看shp文件的地理坐标系 双击shp文件&#xff0c;就可以查看shp文件的…

oracle 12c相对oralce 11g的新特性(3)|oracle 12c的自动化管理特性:自动备份、自动恢复、自动维护的功能使用

一、前言: 前面几期讲解了oracle 12c多租户的使用、In-Memory列存储来提高查询性能以及数据库的克隆、全局数据字典和共享数据库资源的使用 今天我们讲讲oracle 12c的另外的一个自动化管理功能新特性:自动备份、自动恢复、自动维护的功能 二、自动备份、自动恢复、自动维护…

C语言——贪吃蛇小游戏

目录 一、ncurse 1.1 为什么需要用ncurse&#xff1a; 1.2 ncurse的输入输出&#xff1a; 1.2.1 如何使用ncurse&#xff1a; 1.2.2 编译ncurse的程序&#xff1a; 1.2.3 测试输入一个按键ncurse的响应速度&#xff1a; 1.3 ncurse上下左右键获取&#xff1a; 1.3.1 如…

TypeScript 从入门到进阶之基础篇(一) ts类型篇

系列文章目录 文章目录 系列文章目录前言一、安装必要软件二、TypeScript 基础类型1.基础类型之 数字类型 number2.基础类型之 字符串类型 string3.基础类型之 布尔类型 boolean4.基础类型之 空值类型 void5.基础类型之 null 、undefined类型6.基础类型之 任意类型 any &#x…

解决ModuleNotFoundError: No module named ‘diffusers.models.cross_attention‘

目录 项目场景: 问题描述 原因分析: 解决方案: 方案一:

3dsmax 2020安装失败报1603错误 解决方法

本文地址&#xff1a;https://blog.csdn.net/t163361/article/details/132779780 想在自己电脑上安装3dsmax 2020,怎么也装不上&#xff0c;一直报1603错误。去网上找了找&#xff0c;官方有个报错处理的页面 安装Autodesk 2020以及更高软件软件提示1603错误 按照步骤一安装最…

面向面试知识--Lottery项目

面向面试知识–Lottery项目 1.设计模式 为什么需要设计模式&#xff1f; &#xff08;设计模式是什么&#xff1f;优点有哪些&#xff1f;&#xff09; 设计模式是一套经过验证的有效的软件开发指导思想/解决方案&#xff1b;提高代码的可重用性和可维护性&#xff1b;提高团…

新概念英语(第二册)复习——Lesson 1 - Lesson5

前言 重新整理下自己走过的英语路&#xff0c;算是一次梳理&#xff0c;也是一次简单的常识&#xff0c;更是为了以后做一次备份 不用怀疑&#xff0c;学完我曾经看过&#xff0c;听过&#xff0c;背过的资料&#xff0c;你也可以成为英语高手。 文章目录 前言Lesson 1 - A pr…

vue3 - Element Plus暗黑模式适配、切换及自定义颜色

GitHub Demo 地址 在线预览 Element Plus 2.2.0 版本开始支持暗黑模式&#xff0c;启用方式参考 Element Plus 官方文档 - 暗黑模式 demo通过Element Plus和VueUse 的 useDark 方法实现具有自动数据持久性的响应式暗黑模式。 安装 npm install element-plus --save npm in…