4866 Ynoi2017 由乃的商場之旅

2021-07-31 12:51:02 字數 3077 閱讀 2582

4866: [ynoi2017]由乃的商場之旅

time limit: 20 sec memory limit: 164 mb

submit: 192 solved: 47

[submit][status][discuss]

description

第一行兩個數n,m

之後一行乙個長為n的字串,代表每個人的編號

之後m行每行兩個數l,r代表每次卓司妄想的區間

n,m<=60000

output

m行,每行乙個數表示答案

sample input

6 6zzqzzq

1 62 4

3 42 3

4 51 1

sample output

1 hint

source

by 佚名提供

對於字母

a ,賦予權值

1,對於字母

b ,賦予權值

2,對於字母

c ,賦予權值4,

那麼對於原串的任意一段子區間,取

g 為區間內權值的xo

r和 這個子區間能重新排列成乙個回文串,當且僅當g=

0 或

g 為

2的冪次

用字首字尾的思路瞎搞搞,能想出乙個單次新增或刪除頭或尾o(

26)的演算法

結合莫隊演算法能搞出乙個o(

26nn−

−√) 的演算法

然而無論怎麼卡常數,這個演算法就是過不去。。。。。

沒有辦法的,理論複雜度太差了!

下面結合平衡規劃的思路,給出乙個o(

n26n−

−−√)

的演算法 記p

re[i

] 為位置

i 的字首xo

r和 那麼任意兩個pr

e 值的xo

r 結果就能表示原串中乙個子區間的資訊 記c

nt[x

] 為當新增乙個值為pr

e[x]

的端點時新增的合法區間個數

那麼新增端點時可以o(

26)更新好cn

t 記b

=26n−

−−√ ,對於原串,每

b 個字元分一塊

對於每個位置i,記

sum[

i]為位置

i 到它所在塊的右端點這個區間中的合法區間個數

那麼對於所有長度大於

b的詢問,它的答案分三類統計

圖中

p 為左端點

l所在塊的右端點 對於[

l,p]

內部的貢獻已經預處理好了 對於[

p+1,

r]的貢獻可以通過莫隊演算法修改的時候統計好

對於橫跨兩段的貢獻,列舉每個[l

−1,p

−1] 的pr

e 值,直接用當前的cn

t 即可

於是對於所有長度大於

b 的詢問可以用總的o(

n26n−

−−√)

解決 對於那些長度不超過

b 的詢問,從左往右o(

26n)更新

cnt 陣列

在過程中利用類似上面那個辦法減掉不存在的貢獻即可

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int m = 50;

const

int n = 1

<< 26;

const

int maxn = 6e4 + 6;

typedef

unsigned

int u32;

typedef

unsigned

short u16;

struct data

data(int l,int r,int num): l(l),r(r),num(num){}

bool

operator

< (const data &b) const

};int n,m,tot,b,pre[maxn],bel[maxn],l[m],r[m],mi[30];

u16 cnt[n]; u32 sum[maxn],ans[maxn];

vector

v[m],f[maxn],g[maxn];

inline

void add(int x)

inline

void del(int x)

inline

int getint()

inline

int get()

char s[20];

inline

void print(u32 x)

int len = 0;

while (x) s[++len] = x % 10,x /= 10;

for (int i = len; i; i--) putchar(s[i] + '0'); puts("");

}void solve1()

add(pre[i]);

}for (int i = 0; i <= n; i++) del(pre[i]);

}void solve2()

for (int j = r[i]; j <= r; j++) del(pre[j]);

}}void pre_work()

for (int i = 1; i <= m; i++)

else v[bel[l]].push_back(data(l,r,i));

}}int main()

Ynoi2017 舌尖上的由乃

維護區間加和區間第k小。n 100000 分塊,設塊大小為k相信大家都會o n k log 2 n 的查詢和o k 的修改。什麼你不會o k 的修改?歸併啊歸併啊。那麼平衡規劃一下k n logn 總複雜度o nn l ogn include include include define fo i,...

BZOJ4810 Ynoi2017 由乃的玉公尺田

對每個區間維護一下這個區間每個數有沒有,用bitset壓一下,這個用莫隊跑出來,然後就能判加減合不合法了 乘的話根號列舉一下就行了 include include include include include include include include include include incl...

bzoj4810 Ynoi2017 由乃的玉公尺田

由乃在自己的農田邊散步,她突然發現田裡的一排玉公尺非常的不美。這排玉公尺一共有n株,它們的高度參差不齊。由乃認為玉公尺田不美,所以她決定出個資料結構題 這個題是這樣的 給你乙個序列a,長度為n,有m次操作,每次詢問乙個區間是否可以選出兩個數它們的差為x,或者詢問乙個區間是否可以選出兩個數它們的和為x...