題解 AHOI2013 作業(莫隊)

2022-02-19 17:53:44 字數 1316 閱讀 2144

有一段時間沒寫莫隊,今天wzb分享這道題,ssw02一看,我可以用莫隊水,寫的挺快的

歡迎**ssw02的部落格:

給定長為n的序列 , m個詢問,每次詢問在 下標在[ l , r ]之間 , 數值在 [ a , b ]之間的數的種類和總數 。

n, m都是在1e5 的範圍內 。

可以離線,資料支援根號演算法,所以我們可以考慮分塊 。 總數和如何統計 , 開個桶記錄數值的個數 。 每次修改時用乙個樹狀陣列維護。支援區間查詢即可 。

有一點比較坑人, 之所以種類ssw02也用樹狀陣列維護是因為只有[ a, b ]之間的修改才對當前答案有影響,所以我們不能夠直接修改,應為上一次的種類並不能夠繼承到這次。我們需要重新統計(正好寫了樹狀陣列嘛)。另一種方法是在l , r移動的時候順帶處理不合法的貢獻,把這些貢獻刪掉 。 由於資料較小,所以ssw02直接用2個樹狀陣列分別維護2個答案即可 。

#includeusing namespace std ;

#define ll long long

const int maxn = 100005 ;

inline int read()

int n , m , a[maxn] , tot , block , pos[maxn] , vis[maxn] ;

ll cnt[maxn] , c[maxn] , ans[maxn] , anss[maxn] ;

struct apt[maxn] ;

//-----------------

void add( int x , int y )

void add2( int x, int y )

ll ask_sum( int x )

ll ask_col( int x )

//-----------------

inline bool cmp( ap x , ap y )

void updata( int u , int opt , int now )

else

}ll ask( int l , int r , int opt )

void mo()

}int main()

sort( t+1 , t+m+1 , cmp ) ;

mo() ;

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

printf("%lld %lld\n",ans[i],anss[i]) ;

}

AHOI 2013 差異 題解

題目傳送門 題目大意 給出乙個字串,求出這個柿子的值 1 i nlen ti len tj 2 l cp t i,tj sum limits 2 2 n 1 n n 1 然後考慮後面如何求出任意兩個字尾的最長公共字首之和,把串反過來,就變成了求任意兩個字首的最長公共字尾。建出sam,考慮每乙個狀態的...

莫隊 樹狀陣列 AHOI 作業

3236 ahoi2013 作業 time limit 100 sec memory limit 512 mb submit 1716 solved 690 submit status discuss description input output sample input 3 41 2 2 1 ...

莫隊 樹狀陣列 AHOI 作業

3236 ahoi2013 作業 time limit 100 sec memory limit 512 mb submit 1716 solved 690 submit status discuss description input output sample input 3 41 2 2 1 ...