傳送門
lxl大毒瘤
首先乙個數的因子個數就是這個數的每個質因子的次數+1的積,然後考慮把每個數分解質因子,用莫隊維護,然後我交上去就0分了
如果是上面那樣的話,我們每一次移動指標的時間複雜度是o(這個數的質因子個數),再加上我人傻常數大,t很正常……
於是按照memset0的說法,可以預處理質因子的字首和,簡單來說就是對於小於\(\sqrt\)的所有質因子維護字首和,直接統計,大於的暴力在莫隊的時候更新。因為每個數大於\(\sqrt\)的質因子個數為\(o(1)\),所以暴力更新的複雜度是\(o(1)\)的
然後我維護字首和這裡想岔了……死活沒想明白怎麼用字首和更新答案……實際上就是用字首和每一次暴力統計所有小於\(\sqrt\)的質因子個數,總共統計次數為\(o(q)\),所以這一部分的時間複雜度為\(o(q\sqrt)\)
然後加起來差不多是\(o(n\sqrt)\)
//minamoto
#include#define r register
#define it vector::iterator
#define fp(i,a,b) for(r int i=a,i=b+1;ii;--i)
#define go(u) for(it it=v[u].begin();it!=v[u].end();++it)
templateinline bool cmax(t&a,const t&b)
char sr[1<<21],z[20];int c=-1,z=0;
inline void ot()
void print(r int x)
const int n=1e5+5,p=19260817;
struct node
node(r int v,r int cnt):v(v),cnt(cnt){}
};vectorv[n];mapmp;map::iterator it;
int p[n],inv[p+5],cnt[n<<1],b[n],ans[n],rt[n],vis[n],sum[n][165],a[n];
int m,lim,n,now=1,s,q,cc,l=155,mx,l,r;
struct query
}void add(int id)
void del(int id)
int main()inv[0]=inv[1]=1;fp(i,2,p-1)inv[i]=1ll*(p-p/i)*inv[p%i]%p;
fp(i,1,q)q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+1,q+1+q);l=1,r=0;
fp(i,1,q)fp(i,1,q)print(ans[i]);return ot(),0;
}
洛谷 P5072 Ynoi2015 盼君勿忘
給定乙個序列,每次查詢乙個區間 l,r 中所有子串行分別去重後的和mod p 我們考慮每個數的貢獻。即該區間內含有這個數的子串行個數。用補集轉化為不含這個數的子串行個數。那麼,假設這個數在 l,r 內出現了k次,則一共有2 r l 1 2 r l 1 k 個子序列包含這個數。本題可以離線,因此選擇使...
洛谷P5071 此時此刻的光輝
解 先分解質因數。考慮按照質因數大小是否大於 分類。大於的就是乙個數顏色個數,莫隊即可n m。小於的直接列舉質因數做字首和然後o 1 查詢。總時間複雜度n m v 發現我們t飛了,發現莫隊的複雜度較優,而處理小於 v的質因數較劣。我們平衡一下。把界調整到1000。這樣比lm大的至多兩個,莫隊常數 2...
Ynoi2015 世上最幸福的女孩
link 先考慮單點修改的做法 線段樹上每個節點維護四個資訊 sum,pre,suf,ans 分別代表區間和,區間最大字首和,區間最大字尾和,區間最大子段和。合併 sum x sum l sum r pre x max pre l,sum l pre r suf x max suf r,sum r ...