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...