国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

QOJ 6504. CCPC Final 2022 D Flower's Land 2題解

這篇具有很好參考價值的文章主要介紹了QOJ 6504. CCPC Final 2022 D Flower's Land 2題解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

QOJ 6504. CCPC Final 2022 D Flower's Land 2題解

題意簡述

給你一個只含 \(0,1,2\) 的序列,相鄰兩個相同的數(shù)字可以直接消掉。

詢問包含兩種

  • 區(qū)間所有數(shù) \(+1\) 并對 \(3\) 取模。

  • 求一段區(qū)間能否用上述消除方式消完。

    樣例輸入

    8 9
    01211012
    2 4 5
    2 3 6
    1 6 8
    1 6 8
    2 3 6
    2 1 8
    1 1 1
    1 7 7
    2 1 8
    

    樣例輸出 #1

    Yes
    No
    Yes
    No
    Yes
    

提示

在我們做相鄰兩個能被消掉,判斷一段區(qū)間能否被消掉時,常常用矩陣來考慮。

把每一種顏色用一種矩陣來表示,若當前位是偶數(shù)就設(shè)為這個矩陣,若當前位是奇數(shù)就設(shè)為這個矩陣的逆。

求解就把所有的矩陣乘起來,看最后結(jié)果矩陣是不是 \(I\)

為什么矩陣是正確的呢?因為矩陣滿足結(jié)合律但不滿足交換律。

這樣就可以保證 \(1,2,3,1,2,3\) 會判斷為錯。

如果還沒理解,下面再解釋詳細一點:

這是一段序列 \(0122221000\) 顯然他是合法的。

在矩陣中,因為滿足結(jié)合律,你先算中間那段 \(2222\) ,因為奇數(shù)和偶數(shù)個數(shù)相同,一定為 \(I\) ,相當于沒有了,變成了 \(0110000\) 。一直向下就可以得到 \(I\)。

題解

我們用線段樹來維護矩陣乘法,這很容易,具體就是加了以后如何在矩陣中體現(xiàn)出來。

因為只有 \(0,1,2\) ,我們把當前,\(+1\) 后, \(+2\) 后的矩陣都記錄下來。這樣就可以了。文章來源地址http://www.zghlxwxcb.cn/news/detail-556138.html

代碼

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 5e5 + 10, mod = 998244353;
int n,q;
char x;
int a[N], opt, l, r;
inline ll mpow(ll x,int k){
	ll ans = 1;
	while(k){
		if(k & 1) ans = ans * x % mod;
		x = x * x % mod;
		k >>= 1;
	}
	return ans;
}
struct Mar{
	ll a[3][3];
	inline Mar operator *(const Mar b)const{
		Mar c;
		for(int i = 1; i <= 2; ++i){
			for(int j = 1; j <= 2; ++j){
				c.a[i][j] = 0;
				for(int k = 1;k <= 2; ++k){
					c.a[i][j] = (c.a[i][j] + a[i][k] * b.a[k][j] % mod) % mod;
				}	
			}
		}
		return c;
	}
	inline bool check(){
		if(a[1][1] != 1) return 0;
		if(a[1][2] != 0) return 0;
		if(a[2][1] != 0) return 0;
		if(a[2][2] != 1) return 0;
		return 1;
	}
	inline Mar inv()const{
		Mar c, b; 
		c.a[1][1] = 1;
		c.a[1][2] = 0;
		c.a[2][1] = 0;
		c.a[2][2] = 1;
		for(int i = 1; i <= 2; ++i)for(int j = 1; j <= 2; ++j) b.a[i][j] = a[i][j];
		for(int i = 1; i <= 2; ++i){
			for(int j = 1; j <= 2; ++j){
				if(i == j) continue;
				ll w = b.a[j][i] * mpow(b.a[i][i],mod - 2) % mod;
				for(int k = 1; k <= 2; ++k){
					b.a[j][k] = (b.a[j][k] - b.a[i][k] * w % mod + mod) % mod;
				}
				for(int k = 1; k <= 2; ++k){
					c.a[j][k] = (c.a[j][k] - c.a[i][k] * w % mod + mod) % mod;
				}
			}
		}
		for(int i = 1; i <= 2; ++i){
			for(int j = 1; j <= 2; ++j){
				c.a[i][j] = c.a[i][j] * mpow(b.a[i][i],mod - 2) % mod;
			}
		}
		return c;
	}
	inline void print(){
		for(int i = 1; i <= 2; ++i){
			for(int j = 1; j <= 2; ++j){
				cout<<a[i][j]<<' ';
			}
			cout<<'\n';
		}
	}
}I;
struct node{
	Mar now,nxt,nnt;
	int tag;
}tr[N << 2];
Mar m[3], m_[3];
inline void pre(){
	I.a[1][1] = 1,
	I.a[1][2] = 0;
	I.a[2][1] = 0;
	I.a[2][2] = 1;

	m[0].a[1][1] = 2,m[0].a[1][2] = 3;
	m[0].a[2][1] = 5,m[0].a[2][2] = 7;

	m[1].a[1][1] = 11,m[1].a[1][2] = 13;
	m[1].a[2][1] = 17,m[1].a[2][2] = 19;

	m[2].a[1][1] = 23,m[2].a[1][2] = 29;
	m[2].a[2][1] = 31,m[2].a[2][2] = 37;

	m_[0] = m[0].inv();
	m_[1] = m[1].inv();
	m_[2] = m[2].inv();
}
inline void input(){
	cin>> n >> q;
	for(int i = 1; i <= n; ++i){
		cin>>x;
		a[i] = x - '0';
	}
}
inline void pd(int x){
	cout<<"now:"<<'\n';
	tr[x].now.print();
	cout<<"nxt:"<<'\n';
	tr[x].nxt.print();
	cout<<"nnt:"<<'\n';
	tr[x].nnt.print();
	cout<<"tag:"<<'\n'<<tr[x].tag<<'\n';
} 
inline void downdate(int x){
	tr[x << 1].tag = (tr[x << 1].tag + tr[x].tag) % 3;
	tr[x << 1 | 1].tag = (tr[x << 1 | 1].tag + tr[x].tag) % 3;
	while(tr[x].tag > 0){
		swap(tr[x << 1].now, tr[x << 1].nxt);
		swap(tr[x << 1].nnt, tr[x << 1].nxt);
		swap(tr[x << 1 | 1].now, tr[x << 1 | 1].nxt);
		swap(tr[x << 1 | 1].nnt, tr[x << 1 | 1].nxt);
		--tr[x].tag;
	}
}
inline void pushup(int x){
	tr[x].now = tr[x << 1].now * tr[x << 1 | 1].now;
	tr[x].nxt = tr[x << 1].nxt * tr[x << 1 | 1].nxt;
	tr[x].nnt = tr[x << 1].nnt * tr[x << 1 | 1].nnt;
}
inline void build(int x, int l, int r){
	if(l == r){
		if(l % 2){
			tr[x].now = m_[a[l]];
			tr[x].nxt = m_[(a[l] + 1) % 3];
			tr[x].nnt = m_[(a[l] + 2) % 3];
		}else{ 
			tr[x].now = m[a[l]];
			tr[x].nxt = m[(a[l] + 1) % 3];
			tr[x].nnt = m[(a[l] + 2) % 3];
		}
		return ;
	}
	int mid = (l + r) >> 1;
	build(x << 1, l, mid);
	build(x << 1 | 1, mid + 1, r);
	pushup(x);
}
inline void adtr(int x){
	tr[x].tag = (tr[x].tag + 1) % 3;
	swap(tr[x].now, tr[x].nxt);
	swap(tr[x].nnt, tr[x].nxt);
}
inline void add(int x, int l, int r, int L, int R){
	if(L <= l && r <= R){
		adtr(x);
		return ;
	}
	downdate(x);
	int mid = (l + r) >> 1;
	if(L <= mid) add(x << 1, l, mid, L, R);
	if(R > mid) add(x << 1 | 1, mid + 1, r, L, R);
	pushup(x);
}
inline Mar query(int x, int l, int r, int L, int R){
	if(L <= l && r <= R){
		// cout<<x<<'\n';
		// tr[x].now.print();
		return tr[x].now;
	}
	downdate(x);
	int mid = (l + r) >> 1;
	Mar ans = I;
	if(L <= mid) ans = ans * query(x << 1, l, mid, L, R);
	if(R > mid) ans = ans * query(x << 1 | 1,mid + 1, r, L, R);
	return ans; 
}
inline void op(){
	build(1,1,n);
	for(int i = 1; i <= q; ++i){
		cin>> opt >> l >> r;
		if(opt == 1){
			add(1, 1, n, l, r);
		}else if(opt == 2){
			if(query(1, 1, n, l, r).check()){
				cout<<"Yes"<<'\n';
			}else{
				cout<<"No"<<'\n';
			}
		}
	}
}

int main(){
	cin.tie(0)->sync_with_stdio(false);
	pre();
	input();
	op();
	return 0;
}

到了這里,關(guān)于QOJ 6504. CCPC Final 2022 D Flower's Land 2題解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 題解動態(tài)規(guī)劃:藍橋杯2022國賽B組 題解 A題目

    題解動態(tài)規(guī)劃:藍橋杯2022國賽B組 題解 A題目

    在這組題(藍橋杯C/C++ B組 國賽)里面挑了幾道喜歡的題目,做了一下,筆記思路如下。( 其實是我覺得能做出的題 ) 題目圖片來源于:CSDN 罰時大師月色 請問2022,拆分成10個不同的正整數(shù)有多少種不同的分法。 這道題目,拿到手上的時候,第一個想法是暴力,但是,每次

    2023年04月08日
    瀏覽(22)
  • 2022 CSP-J 復賽題解

    【題目描述】 小文同學剛剛接觸了信息學競賽,有一天她遇到了這樣一個題:給定正整數(shù) a 和 b ,求 a b 的值是多少。 a b 即 b 個 a 相乘的值,例如 23 即為 3 個 2 相乘,結(jié)果為 2 × 2 × 2 = 8。 “簡單!”小文心想,同時很快就寫出了一份程序,可是測試時卻出現(xiàn)了錯誤。 小文

    2024年02月07日
    瀏覽(23)
  • 2022CSP-J2題解

    今天(2022,10,29), C S P ? J S CSP-JS C S P ? J S 第二輪成功舉辦, 雖然大部分省市疫情取消 本蒟蒻今天有幸參加CSP,特發(fā)入門組題解 小文同學剛剛接觸了信息學競賽,有一天她遇到了這樣一個題:給定正整數(shù) a a a 和 b b b ,求 a b a^b a b 的值是多少。 a b a^b a b 即 b b b 個 a a a 相乘

    2023年04月08日
    瀏覽(39)
  • 2022CSP-J 題解[完整版]

    “西西弗”的腦子是被宇宙射線影響了嗎,造的題目我都寫到睡著了…… 題目描述 小文同學剛剛接觸了信息學競賽,有一天她遇到了這樣一個題:給定正整數(shù) a a a 和 b b b ,求 a b a^b a b 的值是多少。 a b a^b a b 即 b b b 個 a a a 相乘的值,例如 2 3 2^3 2 3 即為 3 3 3 個 2 2 2 相乘,

    2024年02月10日
    瀏覽(74)
  • NewStarCTF 2022 web方向題解 wp

    NewStarCTF 2022 web方向題解 wp

    先看題目,要傳參加繞過。 分析一下代碼:首先get一個data= data://test/plain, Wel…。然后key1和2用數(shù)組可以繞過。num=2077a可以繞過弱類型。eval()中的php語句被 # 注釋了,我們需要通過換行 %0a 來忽視這個注釋,所以再構(gòu)造cmd=%0asystem(‘ls /’); 看看題干,偽隨機數(shù)工具。 分析一下代

    2024年02月11日
    瀏覽(41)
  • 2022icpc西安站部分題解-E

    2022icpc西安站部分題解-E

    E. Find Maximum 題意:給定邊界L和R,算滿足的所有的的最大值, 其中滿足: 。 題解: 打表發(fā)現(xiàn)發(fā)現(xiàn)了f(x)與x的三進制有關(guān)系,即f(x)等于x三進制的每個數(shù)相加,再加上三進制數(shù)的有效位數(shù)。下圖從左向右依次是x,x的三進制,f(x)。 于是便是將問題轉(zhuǎn)變?yōu)樵趨^(qū)間中找到三進制的每

    2024年02月08日
    瀏覽(24)
  • 2022數(shù)學建?!拔逡槐盉題 題解+論文

    摘要 本文主要研究溫度等因素對礦石加工質(zhì)量控制問題。提高礦石加工質(zhì)量,對節(jié)約不可再生資源和能源,推動節(jié)能減排,助力“雙碳”’目標的實現(xiàn),具有重要的意義。 針對問題一,我們要實現(xiàn)在給定系統(tǒng)溫度和原礦參數(shù)的情況下,預測可能性最大的產(chǎn)品的指標。由于在

    2024年02月02日
    瀏覽(19)
  • 洛谷2022SCP第一輪J組模擬題(LGR-2022-J1)部分題解

    LGR-2022-J1 T3. 小愷編寫了如下函數(shù),希望計算斐波那契數(shù)列 f(n) 第 n 項對 10000 取余數(shù)的值:

    2024年02月09日
    瀏覽(24)
  • 【簡單算法】2022SCUACM集訓隊冬季選拔全題解

    沒想到現(xiàn)在冬季選拔都這么難了…… 題目傳送門 本文juejin:https://juejin.cn/post/7222531019319722039/ 本文CSDN:https://blog.csdn.net/hans774882968/article/details/130184851 作者:hans774882968以及hans774882968以及hans774882968 參考:https://www.cnblogs.com/ycx-akioi/p/AtCoder-abc165.html 最長嚴格上升子序列樹上版本

    2023年04月16日
    瀏覽(14)
  • 2022藍橋杯C++B組國賽真題題解

    2022藍橋杯C++B組國賽真題題解

    目錄 A:2022 B:鐘表 C:卡牌 D:最大數(shù)字 E:出差 F:費用報銷 G:故障 H:機房 I:齒輪 J:搬磚 問題描述 將 2022 拆分成 10 個互不相同的正整數(shù)之和, 總共有多少種拆分方法? 注意交換順序視為同一種方法, 例如 2022=1000+1022?和 1022+1000?就視為同一種方法。 答案提交 這是一道結(jié)果填空的

    2024年02月06日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包