洛谷 P4135 作詩 題解

2021-09-08 16:31:06 字數 2769 閱讀 4037

題目傳送門

題目大意:乙個序列,m個詢問,每次詢問區間內有多少個出現過正偶數次的數。

考慮用分塊做。

分塊的基本套路就是塊與塊之間的資訊可以合併,然而這題並沒有什麼可以合併的。

但是可以預處理答案呀!

設 f [i

][j]

f[i][j]

f[i][j

] 表示第 i

ii 塊到第 j

jj 塊的答案,那麼可以 o(n

n)

o(n\sqrt n)

o(nn​)

預處理出 f

ff 陣列,但是,對於乙個詢問,不但要處理中間的連續的塊,還要處理兩邊剩下的呀。於是,對於兩邊零散的數字,記錄下每種數字出現了幾次,再搞出它在中間的連續的塊**現過幾次然後更新一下就好了。

為了節省空間,我想到了乙個很好的時間換空間的沙雕做法:記錄下每種數字出現的位置,然後二分求解。演算法總時間複雜度:o(n

nlog

n)

o(n\sqrt n~logn)

o(nn​l

ogn)

。當然最簡單的辦法就是直接存下來了——利用字首和思想,sum

[i][

j]

sum[i][j]

sum[i]

[j] 表示數字 j

jj 在 1

11 ~ i

ii 塊的出現次數即可。

**如下(用的是nnl

og

nn \sqrt n~logn

nn​log

n的做法,講真,慢的一比,要加讀優再吸口氧才能過……):

#include

#include

#include

using

namespace std;

#define maxn 500010

int n,m;

int a[maxn]

;struct node

;node b[maxn]

;int ll[

2*maxn]

,rr[

2*maxn]

;int v[

2*maxn]

;//記錄每種數字的出現次數,下面會多次使用

intcheck

(int x,

int le,

int ri)

if(left==-1

)return v[x]%2

==0;//如果沒出現過

l=ll[x]

,r=rr[x]

;while

(l<=r)

//二分出x這個數字在le~ri區間內的出現位置在b陣列中的區間if(

(right-left+1)

%2==1

)return v[x]%2

==1?1

:0;//根據奇偶性修改ans

else

return v[x]%2

==1?-

1:0;

}bool

cmp(node x,node y)

int belong[maxn]

,l[1010

],r[

1010

],cnt,block;

void

work()

tot++

; belong[i]

=cnt;

} r[belong[n]

]=n;

}int f[

1010][

1010];

int zhan[maxn]

,t=0

;void

work2()

f[i]

[j]=ans;

}while

(t>

0)v[zhan[t--]]

=0; ans=0;

}}voidgo(

int x,

int y)

}inline

charcn(

)//讀優

void

read

(int

&x)while

(ch>=

'0'&&ch<=

'9')x=x*10+

(ch-

'0')

,ch=cn(

);x*

=f1;

}int

main()

;//b陣列是用來記錄每種數字的出現位置的

sort

(b+1

,b+n+

1,cmp)

;//值為第一關鍵字,在原序列的的位置為第二關鍵字

//排完序後,每一種數字就都排在一起了,並且他們的位置也都拍好了序

for(

int i=

1;i<=n;i++

)work()

;//分塊預處理

work2()

;//預處理答案(即f陣列)

int lastans=0;

memset

(v,0

,sizeof

(v))

;while

(m--

)printf

("%d\n"

,lastans)

;for

(int i=x;i<=y;i++

) v[a[i]]--

;//記得清空v陣列

}else

}}

洛谷P4135 作詩

神犇sjy虐完heoi之後給傻 lyd出了一題 shy是t國的公主,平時的一大愛好是作詩。由於時間緊迫,shy作完詩之後還要虐oi,於是shy找來一篇長度為n的文章,閱讀m次,每次只閱讀其中連續的一段 l,r 從這一段中選出一些漢字構成詩。因為shy喜歡對偶,所以shy規定最後選出的每個漢字都必須在...

洛谷 P1101 題解

這道題可以用深搜 回溯 來寫,相信大部分人都是這麼想的,但是有些人可能在一些地方饒了半天,所以這裡就貼一下我的思路,個人覺得自己的很好懂,除了tx和ty那裡,但是tx和ty的那種用法對於輸出路徑的題目一般很實用 這個算是比較簡單的吧,題目裡給出了具體要找的字串,我們要做的就是對它進行8個方向的搜尋,...

洛谷 P1169 題解

請你在乙個黑白矩陣中選出乙個長方形 含正方形 和正方形的子矩陣,使得所有相鄰的點顏色不一樣。矩陣大小 兩條邊都 2000 2000 2 000輸入 3 31 0 1 0 1 0 1 0 0輸出4 6解釋給定矩陣 正方形 長方形 我的控制台是萌萌噠 ffc0cb粉色 乙個小技巧 如果您的控制台是像我的...