test1 3-15 模拟赛1
文章目錄
- 考試復(fù)盤
- matrix
- set
- string
考試復(fù)盤
首先先說T1T1T1,嗯,發(fā)現(xiàn)了列是相互獨(dú)立的,所以分開考慮了
但是實(shí)在沒想到線性基,就順著自己的思路硬搞了505050跑路
老實(shí)說,505050分的部分分寫得都是迷迷糊糊的,重構(gòu)了好幾遍
幸好過了,不然自己今天就是個(gè)圓溜的零光蛋了
沒想到的點(diǎn):
再說T2T2T2,嗯——怎么說呢
想到了枚舉最小值,然后線段樹找符合的區(qū)間[val,val?2)[val,val*2)[val,val?2)
然后想到了三維的過原點(diǎn)立方體
就不會(huì)了—— ,主要是之前沒碰到過,只做過二維的可以用setsetset整活
這次遇到了,積累!!
幸好有202020的兩種顏色數(shù)據(jù)
可是我還是沒拿到
因?yàn)橥洔p去(0,0,0)(0,0,0)(0,0,0)三元組情況
發(fā)生這種過失性丟分的唯一原因就是沒有好好分析樣例
給自己敲個(gè)警鐘!!!
沒想到的點(diǎn):
注意的點(diǎn):
最后說一下T3T3T3
其實(shí)很長(zhǎng)一段時(shí)間是沒有看懂題面的
樣例也想不懂
是中午吃飯的時(shí)候去操場(chǎng)逛了兩圈,才想懂了樣例題面的意思
回來匆匆敲個(gè)暴力,還沒過樣例,害~
沒想到的點(diǎn):
不過必須表?yè)P(yáng)自己認(rèn)真磕出了樣例
那為毛不磕一下T2T2T2的樣例!!想穿越回去抽自己
說一下今天考試的自我感受
matrix
在二進(jìn)制下,加法等價(jià)于異或
∑k=1nA[i][k]×C[k][j]\sum_{k=1}^nA[i][k]\times C[k][j]∑k=1n?A[i][k]×C[k][j]
∑k∈SC[k][j]=B[i][j]×C[i][j]\sum_{k∈S}C[k][j]=B[i][j]\times C[i][j]∑k∈S?C[k][j]=B[i][j]×C[i][j]
都是第jjj列,說明每列是相互獨(dú)立的,那么單獨(dú)考慮每一列,統(tǒng)計(jì)答案時(shí)把所有列的方案數(shù)乘起來即可
若B[i][j]=0B[i][j]=0B[i][j]=0,則等式右邊為000
若B[i][j]=1B[i][j]=1B[i][j]=1,則等式右邊為C[i][j]C[i][j]C[i][j]
因?yàn)槭钱惢?#xff0c;所以兩邊都可以再異或上C[i][j]C[i][j]C[i][j]
∑k∈S′C[k][j]=0\sum_{k∈S'}C[k][j]=0∑k∈S′?C[k][j]=0
**這里尚有問題,提醒自己一下
set
枚舉所選集合中最小的權(quán)值,forforfor循環(huán)掃一遍求出[val,val?2)[val,val*2)[val,val?2) 里所有的物品,這些都是可選的
對(duì)于求出的數(shù)量用三元組表示r,g,br,g,br,g,b 那么每一種顏色的選擇都是[0,r],[0,g],[0,b][0,r],[0,g],[0,b][0,r],[0,g],[0,b]
放在三維坐標(biāo)里,就是求過原點(diǎn)的一個(gè)立方體的體積
考試的時(shí)候就只想到了立方體,發(fā)現(xiàn)自己只會(huì)平面的,所以這道題敲不來
用掃描線維護(hù)一維rrr
具體來說就是對(duì)于三元組(r,g,b)(r,g,b)(r,g,b) 在rrr時(shí)刻將(g,b)(g,b)(g,b)插進(jìn)去
從大到小計(jì)算
因?yàn)樵?span id="ozvdkddzhkzd" class="katex--inline">rrr時(shí)刻的(g,b)(g,b)(g,b)二元組,一定在r?1r-1r?1時(shí)刻也是正確的
從小到大,有的二元組會(huì)涉及到刪除,對(duì)于蒟蒻來說不好做,因?yàn)槲覓呙杈€就很困難了好吧
剩下兩維的平面直角坐標(biāo)系計(jì)算圍成的面積,以前做過這種題
用setsetset或者線段樹都可以做
#include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; #define maxn 500005 struct node {int val, c;node(){}node( int Val, int C ) {val = Val, c = C;} }v[maxn]; vector < pair < int, int > > G[maxn]; int n; int tot[3]; long long tree[maxn << 2], tag[maxn << 2], maxx[maxn << 2];bool cmp( node x, node y ) {return x.val < y.val; } int id( char c ) {if( c == 'R' ) return 0;if( c == 'G' ) return 1;if( c == 'B' ) return 2; }void pushdown( int num, int l, int r ) {if( tag[num] ) {maxx[num << 1] = tag[num << 1] = tag[num];maxx[num << 1 |1] = tag[num << 1 | 1] = tag[num];int mid = ( l + r ) >> 1;tree[num << 1] = tag[num] * ( mid - l + 1 );tree[num << 1 | 1] = tag[num] * ( r - mid );tag[num] = 0;} }void modify( int num, int l, int r, int L, int R, int val ) {if( L <= l && r <= R && maxx[num] < val ) {tree[num] = 1ll * val * ( r - l + 1 );maxx[num] = tag[num] = val;return;}if( l == r ) return;int mid = ( l + r ) >> 1;pushdown( num, l, r );if( L <= mid && maxx[num << 1 | 1] < val )//如果是被完全包含的面積是不進(jìn)行計(jì)算的 這里可以多想想modify( num << 1, l, mid, L, R, val );if( mid < R )modify( num << 1 | 1, mid + 1, r, L, R, val );tree[num] = tree[num << 1] + tree[num << 1 | 1];maxx[num] = max( maxx[num << 1], maxx[num << 1 | 1] ); }int main() {scanf( "%d", &n );int x; char color[3];for( int i = 1;i <= n;i ++ ) {scanf( "%d %s", &x, color );v[i] = node( x, id( color[0] ) );}sort( v + 1, v + n + 1, cmp );G[0].push_back( make_pair( 0, 0 ) );int j = 1;for( int i = 1;i <= n;i ++ ) {while( j <= n && v[j].val < ( v[i].val << 1 ) )tot[v[j].c] ++, j ++;G[tot[0]].push_back( make_pair( tot[1], tot[2] ) );tot[v[i].c] --;}long long ans = 0;for( int i = n;~ i;i -- ) {//掃描線去掉一維 相當(dāng)于切立方體的厚度 切成厚度為1的多個(gè)面狀for( int j = 0;j < G[i].size();j ++ )modify( 1, 0, n, 0, G[i][j].first, G[i][j].second + 1 ); //加1是因?yàn)檫@個(gè)面積是和原點(diǎn)相圍成的 畫畫圖會(huì)發(fā)現(xiàn)其實(shí)需要列拔高一層ans += tree[1];}printf( "%lld", ans - 1 );//不算(0,0,0)return 0; }string
對(duì)于一個(gè)字符串,將第一次新出現(xiàn)的字符設(shè)為000,其余位置賦值為該位置減去上一次字符出現(xiàn)的位置
這樣的轉(zhuǎn)化就將同構(gòu)字符串改寫成完全相同的數(shù)字串了
這里真的太巧妙了,第一次遇到,記下來!!!
求本質(zhì)不同的子串就是后綴數(shù)組的基礎(chǔ)了
所有子串長(zhǎng)度?-?heightheightheight數(shù)組之和
但是!!
題目是處理子串之間的問題
那么就有子串的改寫會(huì)與原串的改寫有出入的問題
就是說子串中第一次出現(xiàn)的某個(gè)字符不一定是原串整個(gè)串中第一次出現(xiàn)
那么子串該位置就需要修改為000
一共只有262626個(gè)字符,所以子串最多只會(huì)有262626個(gè)位置與原串不一樣
可以人為暴力排序
將一段根據(jù)修改的000劃分成若干段
兩個(gè)子串的cmpcmpcmp比較,如果是相同的部分就用原串的后綴數(shù)組sasasa搞定,更改過的地方就暴力比較
總結(jié)一下,代碼實(shí)現(xiàn)思路
后記:大概會(huì)在周末進(jìn)行再次復(fù)盤,重新消化吸收,順便看看到時(shí)候自己是否會(huì)將好不容易轉(zhuǎn)操場(chǎng)想懂的地方又搞懵
走了回家睡覺,現(xiàn)在時(shí)間2021/3/15 22:48
總結(jié)
以上是生活随笔為你收集整理的test1 3-15 模拟赛1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一些数学小公式/定理的证明
- 下一篇: test2 3-16 2021 模拟赛t