From 7c52f05b42b04af39c93d70e08e9670b7307426d Mon Sep 17 00:00:00 2001
From: cesonic <42774222+cesonic@users.noreply.github.com>
Date: Wed, 29 Aug 2018 19:36:15 +0800
Subject: [PATCH] Update mo-algo.md
---
docs/misc/mo-algo.md | 276 ++++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 249 insertions(+), 27 deletions(-)
diff --git a/docs/misc/mo-algo.md b/docs/misc/mo-algo.md
index 8115ea28..cab2d654 100644
--- a/docs/misc/mo-algo.md
+++ b/docs/misc/mo-algo.md
@@ -8,7 +8,7 @@
### å½¢å¼
-对äºåºåä¸çåºé´è¯¢é®é®é¢ï¼å¦æä» $[l,r]$ ççæ¡è½å¤ $O(1)$ æ©å±å° $[l-1,r],[l+1,r],[l,r+1],[l,r-1]$ï¼å³ä¸ $[l,r]$ ç¸é»çåºé´ï¼ççæ¡ï¼é£ä¹å¯ä»¥å¨ $O(n\sqrt{n})$ çå¤æ度å
æ±åºææ询é®ççæ¡ã
+å设n=mï¼é£ä¹å¯¹äºåºåä¸çåºé´è¯¢é®é®é¢ï¼å¦æä» $[l,r]$ ççæ¡è½å¤ $O(1)$ æ©å±å° $[l-1,r],[l+1,r],[l,r+1],[l,r-1]$ï¼å³ä¸ $[l,r]$ ç¸é»çåºé´ï¼ççæ¡ï¼é£ä¹å¯ä»¥å¨ $O(n\sqrt{n})$ çå¤æ度å
æ±åºææ询é®ççæ¡ã
### å®ç°
@@ -20,7 +20,7 @@
### 模æ¿
-
int l = 0, r = 0, nowAns = 0;
+```cpp
inline void move(int pos, int sign) {
// update nowAns
@@ -38,10 +38,12 @@ void solve() {
ans[q.id] = nowAns;
}
}
-
+```
### å¤æ度åæ
+以ä¸çæ
åµå¨nåmåé¶çåæä¸è®¨è®ºã
+
é¦å
æ¯ååè¿ä¸æ¥ï¼è¿ä¸æ¥çæ¶é´å¤æ度毫æ çé®å°æ¯ $O(\sqrt{n}\sqrt{n}log\sqrt{n}+nlogn)=O(nlogn)$;
æ¥çå°±å°äºè«éç®æ³çç²¾é«äºï¼ä¸é¢æ们ç¨éä¿ææçåä¸æ¹æ³æ¥è¯æå®çæ¶é´å¤æ度æ¯$O(n\sqrt{n})$ï¼
@@ -74,6 +76,12 @@ $$
综ä¸æè¿°ï¼è«éç®æ³çæ¶é´å¤æ度为 $O(n\sqrt{n})$ï¼
+ä½æ¯å¯¹äºmçå
¶ä»åå¼ï¼å¦m
@@ -223,7 +226,7 @@ int main()
using namespace std;
templateinline void IN(_Tp&dig)
{
- char c;dig=0;
+ char c;dig=0;
while(c=getchar(),!isdigit(c));
while(isdigit(c))dig=dig*10+c-'0',c=getchar();
}
@@ -278,3 +281,222 @@ int main()
return 0;
}
```
+
+### æ ä¸è«é
+
+è«éåªè½å¤ç线æ§é®é¢ï¼æ们è¦ææ 强è¡åæåºå
+
+æ们å¯ä»¥å°æ çæ¬å·åºè·ä¸æ¥ï¼ææ¬å·åºååï¼å¨æ¬å·åºä¸è·è«é
+
+å
·ä½æä¹åå¢ï¼
+
+dfsä¸æ£µæ ï¼ç¶åå¦ædfså°xç¹ï¼å°±push_back(x),dfså®xç¹ï¼å°±ç´æ¥push_back(-x)ï¼ç¶åæ们å¨æªå¨æéçæ¶å
+
+- æ°å å
¥çå¼æ¯x ---> add(x)
+- æ°å å
¥çå¼æ¯-x ---> del(x)
+- æ°å é¤çå¼æ¯x ---> del(x)
+- æ°å é¤çå¼æ¯-x ---> add(x)
+
+è¿æ ·çè¯ï¼æ们就æä¸æ£µæ å¤çæäºåºåã
+
+ä¾é¢æ¯[[WC2013]ç³æå
¬å](https://www.luogu.org/problemnew/show/P4074),è¿é¢æ¯å¸¦ä¿®æ¹æ ä¸è«é
+
+é¢ææ¯ç»ä½ ä¸æ£µæ ,æ¯ä¸ªç¹æé¢è²,æ¯æ¬¡è¯¢é®
+
+$\sum_{c}val_c\sum_{i=1}^{cnt_c}w_i$
+
+val表示该é¢è²çä»·å¼
+
+cnt表示é¢è²åºç°ç次æ°
+
+w表示该é¢è²åºç°i次åçä»·å¼
+
+å
ææ åæåºåï¼ç¶åæ¯æ¬¡æ·»å /å é¤ä¸ä¸ªç¹ï¼è¿ä¸ªç¹ç对çæ¡ççè´¡ç®æ¯å¯ä»¥å¨$O(1)$æ¶é´å
è·å¾çï¼å³$val_c\times w_{cnt_{c+1}}$
+
+åç°å 为ä»ä¼æèµ·ç¹çåæ ä¹æ«äºä¸éï¼äº§çå¤ä½çè´¡ç®ï¼æä¹åå¢ï¼
+
+å 为æ«çè¿ç¨ä¸èµ·ç¹çåæ éçç¹è¯å®ä¼è¢«æ«ä¸¤æ¬¡ï¼ä½è´¡ç®ä¸º0
+
+æ以å¯ä»¥å¼ä¸ä¸ªvisæ°ç»ï¼æ¯æ¬¡æ«å°ç¹xï¼å°±æ$vis_x$å¼æä¸1
+
+å¦æ$vis_x=0$ï¼é£è¿ä¸ªç¹çè´¡ç®å°±å¯ä»¥ä¸è®¡
+
+æ以å¯ä»¥ç¨æ ä¸è«éæ¥æ±
+
+ä¿®æ¹çè¯ï¼å ä¸ä¸ç»´æ¶é´ç»´å³å¯,åæ带修æ¹æ ä¸è«é
+
+ç¶åå 为æå
å«çåºé´å
å¯è½æ²¡æLCAï¼å¯¹äºæ²¡æçæ
åµè¦å°å¤ä½çè´¡ç®å é¤ï¼ç¶åå°±å®äºäº
+
+codeï¼
+```cpp
+#include
+#include
+#include
+#include
+
+#define DEBUG printf("line:%d func:%s\n",__LINE__,__FUNCTION__);
+
+using namespace std;
+
+const int maxn=200010;
+
+int f[maxn],g[maxn],id[maxn],head[maxn],cnt,last[maxn],dep[maxn],fa[maxn][22],v[maxn],w[maxn];
+int block,index,n,m,q;
+int pos[maxn],col[maxn],app[maxn];
+bool vis[maxn];
+long long ans[maxn],cur;
+
+struct edge {
+ int to,nxt;
+} e[maxn];
+int cnt1=0,cnt2=0;//æ¶é´æ³
+
+struct query {
+ int l,r,t,id;
+ bool operator <(const query &b)const {
+ return (pos[l]=0; i--)
+ if(dis>=(1<=0; i--) {
+ if(fa[x][i]!=fa[y][i])
+ x=fa[x][i],y=fa[y][i];
+ }
+ return fa[x][0];
+}
+
+inline void add(int x) {
+ if(vis[x])
+ cur-=(long long )v[col[x]]*w[app[col[x]]--];
+ else
+ cur+=(long long )v[col[x]]*w[++app[col[x]]];
+ vis[x]^=1;
+}
+
+inline void modify(int x,int t) {
+ if(vis[x]) {
+ add(x);
+ col[x]=t;
+ add(x);
+ } else col[x]=t;
+}//å¨æ¶é´ç»´ä¸ç§»å¨
+
+int main() {
+ scanf("%d%d%d",&n,&m,&q);
+ for(int i=1; i<=m; i++)
+ scanf("%d",&v[i]);
+ for(int i=1; i<=n; i++)
+ scanf("%d",&w[i]);
+ for(int i=1; if[y])
+ swap(x,y);
+ a[++cnt1]=(query) {
+ lca(x,y)==x?f[x]:g[x],f[y],cnt2,cnt1
+ };
+ }
+ }
+ sort(a+1,a+cnt1+1);
+ int L,R,T;//æéåæ
+ L=R=0;
+ T=1;
+ for(int i=1; i<=cnt1; i++) {
+ while(T<=a[i].t) {
+ modify(b[T].l,b[T].t);
+ T++;
+ }
+ while(T>a[i].t) {
+ modify(b[T].l,b[T].r);
+ T--;
+ }
+ while(L>a[i].l) {
+ L--;
+ add(id[L]);
+ }
+ while(La[i].r) {
+ add(id[R]);
+ R--;
+ }
+ while(R