有一段時間沒寫莫隊,今天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 ...