以下内容未验证,有错请指正...

设块大小为T,则块数为$\frac{n}{T}$

将询问分为$(\frac{n}{T})^2$块(按照左端点所在块和右端点所在块分块),同块内按时间从小到大依次处理

1.左/右端点块内移动总代价:$q*T$

2.时间的移动总代价:$(\frac{n}{T})^2*n$

总复杂度:$q*T+\frac{n^3}{T^2}$

好吧,事实上一般不会这么写。。。

一般只需要把询问按三个关键字(优先级:左端点所在块>右端点所在块>时间)排序,然后在任意两个询问间转移

一般的写法还要:

1.左端点块间移动代价:$n$

2.右端点块间移动代价:$\frac{n}{T}*n$

事实上是不影响的。。。

最优块大小?还真不会算,可以确定的是当$T=n^\frac{2}{3}$时,最终复杂度是(设n与q同阶)$n^{\frac{5}{3}}$


https://www.luogu.org/problemnew/show/CF940F

模板,跑一下就行了。。。

比较特别的是,要求的那个mex一定不会超过sqrt(n)级别(如果mex=k,说明查询的区间内至少有1+2+3+..+(k-1)=k*(k-1)/2个数),可以直接暴力跑(常数要小一点的话,就瞎维护一下(?讲不清楚啊))

upd:突然发现用以下的方法维护答案,复杂度好像不太对(n^(5/3)*sqrt(n)>n^2)?可能还是每次暴力找答案好?

错误记录:(都是一些很容易犯但是极其难发现的错误,要小心了)

1.题面有点绕,搞混了"数的出现次数"和"数的出现次数的出现次数"

2.75,83行成了"del(...);ins(...)";if没起到正确作用

3.最后输出的时候只枚举编号到了n,没有枚举到qq

4.修改时间时,没有判要del的是否本来就在里面(如75行的if),如果本来不在里面那么不要del也不要ins

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<vector>
  5. #include<map>
  6. using namespace std;
  7. #define fi first
  8. #define se second
  9. #define mp make_pair
  10. #define pb push_back
  11. typedef long long ll;
  12. typedef unsigned long long ull;
  13. typedef pair<int,int> pii;
  14. const int N=;
  15. struct C
  16. {
  17. int p,a,b,t;//p位置从a改为b
  18. }c[N];
  19. int nc;
  20. struct Q
  21. {
  22. int l,r,t,num;
  23. }q[N];
  24. int nq;
  25. int nl,nr,nt,pc;
  26. const int sz=;
  27. int bl[N];
  28. int ans[N];
  29. int a[N],b[N];
  30. bool c1(const Q &a,const Q &b)
  31. {
  32. return bl[a.l]<bl[b.l]
  33. ||(bl[a.l]==bl[b.l]&&bl[a.r]<bl[b.r])
  34. ||(bl[a.l]==bl[b.l]&&bl[a.r]==bl[b.r]&&a.t<b.t);
  35. }
  36. int n1[],n2[];
  37. int nans;
  38. int qn[N],cn[N];
  39. int tt[];
  40. map<int,int> ma;
  41. void decn2(int x)
  42. {
  43. if(!x) return;
  44. n2[x]--;
  45. if(n2[x]==)
  46. {
  47. if(nans>x) nans=x;
  48. }
  49. }
  50. void incn2(int x)
  51. {
  52. if(!x) return;
  53. n2[x]++;
  54. if(n2[x]==)
  55. {
  56. if(nans==x)
  57. {
  58. while(n2[nans]) nans++;
  59. }
  60. }
  61. }
  62. void ins(int x)
  63. {
  64. decn2(n1[x]);n1[x]++;incn2(n1[x]);
  65. }
  66. void del(int x)
  67. {
  68. decn2(n1[x]);n1[x]--;incn2(n1[x]);
  69. }
  70. void inctime()
  71. {
  72. while(pc+<=nc&&c[pc+].t<=nt)
  73. {
  74. pc++;
  75. if(nl<=c[pc].p&&c[pc].p<=nr) del(c[pc].a),ins(c[pc].b);
  76. a[c[pc].p]=c[pc].b;
  77. }
  78. }
  79. void dectime()
  80. {
  81. while(pc>=&&c[pc].t>nt)
  82. {
  83. if(nl<=c[pc].p&&c[pc].p<=nr) del(c[pc].b),ins(c[pc].a);
  84. a[c[pc].p]=c[pc].a;
  85. pc--;
  86. }
  87. }
  88. int n,qq;
  89. int main()
  90. {
  91. int i,idx,l,r,p,x;
  92. scanf("%d%d",&n,&qq);
  93. for(i=;i<=n;i++) bl[i]=(i-)/sz;
  94. for(i=;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i],tt[++tt[]]=a[i];
  95. for(i=;i<=qq;i++)
  96. {
  97. scanf("%d",&idx);
  98. if(idx==)
  99. {
  100. scanf("%d%d",&l,&r);
  101. ++nq;q[nq].l=l;q[nq].r=r;q[nq].t=nt;q[nq].num=i;
  102. qn[i]=nq;
  103. }
  104. else
  105. {
  106. scanf("%d%d",&p,&x);tt[++tt[]]=x;
  107. ++nc;c[nc].p=p;c[nc].a=a[p];c[nc].b=x;
  108. a[p]=x;
  109. ++nt;c[nc].t=nt;
  110. cn[i]=nc;
  111. }
  112. }
  113. for(i=;i<=n;i++) a[i]=b[i];
  114. sort(tt+,tt+tt[]+);tt[]=unique(tt+,tt+tt[]+)-tt-;
  115. for(i=;i<=tt[];i++) ma[tt[i]]=i;
  116. for(i=;i<=n;i++) a[i]=ma[a[i]];
  117. for(i=;i<=qq;i++)
  118. if(cn[i])
  119. {
  120. c[cn[i]].a=ma[c[cn[i]].a];
  121. c[cn[i]].b=ma[c[cn[i]].b];
  122. }
  123. /*
  124. {
  125. puts("Q");
  126. for(i=1;i<=nq;i++)
  127. {
  128. printf("%d %d %d %d\n",q[i].l,q[i].r,q[i].t,q[i].num);
  129. }
  130. puts("C");
  131. for(i=1;i<=nc;i++)
  132. {
  133. printf("%d %d %d %d\n",c[i].p,c[i].a,c[i].b,c[i].t);
  134. }
  135. }
  136. */
  137. sort(q+,q+nq+,c1);
  138. nl=;nr=;nt=;nans=;pc=;
  139. for(i=;i<=nq;i++)
  140. {
  141. //printf("i%d %d\n",i,q[i].num);
  142. while(nl>q[i].l) nl--,ins(a[nl]);
  143. while(nr<q[i].r) nr++,ins(a[nr]);
  144. while(nl<q[i].l) del(a[nl]),nl++;
  145. while(nr>q[i].r) del(a[nr]),nr--;
  146. if(nt<q[i].t) nt=q[i].t,inctime();
  147. if(nt>q[i].t) nt=q[i].t,dectime();
  148. ans[q[i].num]=nans;
  149. }
  150. for(i=;i<=qq;i++)
  151. if(qn[i])
  152. printf("%d\n",ans[i]);
  153. return ;
  154. }

https://www.luogu.org/problemnew/show/P4074

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<vector>
  5. using namespace std;
  6. #define fi first
  7. #define se second
  8. #define mp make_pair
  9. #define pb push_back
  10. typedef long long ll;
  11. typedef unsigned long long ull;
  12. typedef pair<ll,ll> pll;
  13. const ll N=;
  14. struct E
  15. {
  16. ll to,nxt;
  17. }e[N<<];
  18. ll f1[N],ne;
  19. ll n,m,qq;
  20. ll v[N],w[N],a[N],cc2[N];
  21. struct C
  22. {
  23. ll p,a,b;
  24. }c[N];
  25. ll nc;
  26. struct Q
  27. {
  28. ll a,b,t,num;
  29. }q[N];
  30. ll nq;
  31. ll cn[N],qn[N];
  32. ll nl,nr,nt,nans,pc;
  33. bool vis[N];
  34. const ll sz=;
  35. ll p[N<<],pl[N];
  36. namespace LCA
  37. {
  38. ll anc[N][],l2n=,d[N];
  39. void dfs(ll u,ll fa)
  40. {
  41. p[++p[]]=u;pl[u]=p[];
  42. anc[u][]=fa;d[u]=d[fa]+;
  43. for(ll i=;i<=l2n;i++)
  44. anc[u][i]=anc[anc[u][i-]][i-];
  45. for(ll k=f1[u];k;k=e[k].nxt)
  46. if(e[k].to!=fa)
  47. dfs(e[k].to,u);
  48. p[++p[]]=u;
  49. }
  50. ll lft[];
  51. void init()
  52. {
  53. ll i;
  54. lft[]=;
  55. for(i=;i<;i++) lft[i]=lft[i-]<<;
  56. }
  57. ll lca(ll a,ll b)
  58. {
  59. if(d[a]<d[b]) swap(a,b);
  60. ll i,t=d[a]-d[b];
  61. for(i=;t;t>>=,i++)
  62. if(t&)
  63. a=anc[a][i];
  64. if(a==b) return a;
  65. for(i=l2n;i>=;i--)
  66. if(anc[a][i]!=anc[b][i])
  67. {
  68. a=anc[a][i];
  69. b=anc[b][i];
  70. }
  71. return anc[a][];
  72. }
  73. }
  74. using LCA::lca;
  75. ll bl[N<<];
  76. bool c1(const Q &a,const Q &b)
  77. {
  78. return bl[a.a]<bl[b.a]
  79. ||(bl[a.a]==bl[b.a]&&bl[a.b]<bl[b.b])
  80. ||(bl[a.a]==bl[b.a]&&bl[a.b]==bl[b.b]&&a.t<b.t);
  81. }
  82. ll ans[N];
  83. ll nn[];
  84. void change(ll x)
  85. {
  86. if(vis[x])
  87. {
  88. nans-=v[a[x]]*w[nn[a[x]]];
  89. nn[a[x]]--;
  90. }
  91. else
  92. {
  93. nn[a[x]]++;
  94. nans+=v[a[x]]*w[nn[a[x]]];
  95. }
  96. vis[x]^=;
  97. }
  98. void inctime()
  99. {
  100. while(pc+<=nc&&pc+<=nt)
  101. {
  102. pc++;
  103. bool fl=vis[c[pc].p];
  104. if(fl) change(c[pc].p);
  105. a[c[pc].p]=c[pc].b;
  106. if(fl) change(c[pc].p);
  107. }
  108. }
  109. void dectime()
  110. {
  111. while(pc>=&&pc>nt)
  112. {
  113. bool fl=vis[c[pc].p];
  114. if(fl) change(c[pc].p);
  115. a[c[pc].p]=c[pc].a;
  116. if(fl) change(c[pc].p);
  117. pc--;
  118. }
  119. }
  120. int main()
  121. {
  122. LCA::init();
  123. ll i,x,y,idx,l;
  124. scanf("%lld%lld%lld",&n,&m,&qq);
  125. for(i=;i<=m;i++) scanf("%lld",&v[i]);
  126. for(i=;i<=n;i++) scanf("%lld",&w[i]);
  127. for(i=;i<n;i++)
  128. {
  129. scanf("%lld%lld",&x,&y);
  130. e[++ne].to=y;e[ne].nxt=f1[x];f1[x]=ne;
  131. e[++ne].to=x;e[ne].nxt=f1[y];f1[y]=ne;
  132. }
  133. for(i=;i<=n;i++) scanf("%lld",&a[i]),cc2[i]=a[i];
  134. for(i=;i<=qq;i++)
  135. {
  136. scanf("%lld%lld%lld",&idx,&x,&y);
  137. if(idx==)
  138. {
  139. ++nc;
  140. c[nc].p=x;c[nc].a=a[x];c[nc].b=y;a[x]=y;
  141. cn[i]=nc;
  142. }
  143. else
  144. {
  145. ++nq;
  146. q[nq].a=x;q[nq].b=y;q[nq].t=nc;q[nq].num=i;
  147. qn[i]=nq;
  148. }
  149. }
  150. LCA::dfs(,);
  151. for(i=;i<=nq;i++)
  152. {
  153. q[i].a=pl[q[i].a];
  154. q[i].b=pl[q[i].b];
  155. if(q[i].a>q[i].b) swap(q[i].a,q[i].b);
  156. }
  157. /*
  158. for(i=1;i<=nc;i++)
  159. {
  160. c[i].p=pl[c[i].p];
  161. }
  162. */
  163. for(i=;i<=p[];i++) bl[i]=(i-)/sz;
  164. sort(q+,q+nq+,c1);
  165. for(i=;i<=n;i++) a[i]=cc2[i];
  166. nl=;nr=;nt=;nans=;pc=;
  167. for(i=;i<=nq;i++)
  168. {
  169. while(nl>q[i].a) --nl,change(p[nl]);
  170. while(nr<q[i].b) ++nr,change(p[nr]);
  171. while(nl<q[i].a) change(p[nl]),++nl;
  172. while(nr>q[i].b) change(p[nr]),--nr;
  173. if(nt<q[i].t) nt=q[i].t,inctime();
  174. if(nt>q[i].t) nt=q[i].t,dectime();
  175. l=lca(p[q[i].a],p[q[i].b]);
  176. bool fl1=vis[p[q[i].a]],fl2=vis[p[q[i].b]];
  177. bool fl3=vis[l];
  178. if(!fl1) change(p[q[i].a]);
  179. if(!fl2) change(p[q[i].b]);
  180. if(!fl3) change(l);
  181. ans[q[i].num]=nans;
  182. if(!fl1) change(p[q[i].a]);
  183. if(!fl2) change(p[q[i].b]);
  184. if(!fl3) change(l);
  185. }
  186. for(i=;i<=qq;i++)
  187. if(qn[i])
  188. printf("%lld\n",ans[i]);
  189. return ;
  190. }

Machine Learning Codeforces - 940F(带修莫队) && 洛谷P4074 [WC2013]糖果公园的更多相关文章

  1. 洛谷P4074 [WC2013]糖果公园(莫队)

    传送门 总算会树形莫队了…… 上次听说树形莫队是给树分块,实在看不懂.然后用括号序列的方法做总算能弄明白了 先说一下什么是括号序列,就是在$dfs$的时候,进入的时候记录一下,出去的时候也记录一下 拿 ...

  2. Machine Learning CodeForces - 940F (带修改的莫队)

    You come home and fell some unpleasant smell. Where is it coming from? You are given an array a. You ...

  3. Machine Learning(CF940F+带修改莫队)

    题目链接:http://codeforces.com/problemset/problem/940/F 题目: 题意:求次数的mex,mex的含义为某个集合(如{1,2,4,5})第一个为出现的非负数 ...

  4. CF940F Machine Learning(带修莫队)

    首先显然应该把数组离散化,然后发现是个带修莫队裸题,但是求mex比较讨厌,怎么办?其实可以这样求:记录每个数出现的次数,以及出现次数的出现次数.至于求mex,直接暴力扫最小的出现次数的出现次数为0的正 ...

  5. Codeforces 1476G - Minimum Difference(带修莫队+根号平衡)

    Codeforces 题目传送门 & 洛谷题目传送门 震惊!我竟然独立切掉了这道 *3100 的题! 虽然此题难度的确虚高,感觉真实评分也就 2800~2900 罢.但感觉还是挺有成就感的( ...

  6. 【BZOJ-3052】糖果公园 树上带修莫队算法

    3052: [wc2013]糖果公园 Time Limit: 200 Sec  Memory Limit: 512 MBSubmit: 883  Solved: 419[Submit][Status] ...

  7. 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】

    题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...

  8. BZOJ2120 数颜色 莫队 带修莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...

  9. BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...

随机推荐

  1. java HttpClient GET请求

    HttpClient GET请求小实例,先简单记录下. package com.httpclientget; import java.io.IOException; import org.apache ...

  2. Program received signal SIGSEGV, Segmentation fault.

    GDB调试的时候出现了: Program received signal SIGSEGV, Segmentation fault.(程序收到信号SIGSEGV,分段故障) SIGSEGV:在POSIX ...

  3. HTML预览 正则替换

    1. [代码][PHP]代码  <?php    if(!defined('BASEPATH')) exit('No direct script access allowed');    /** ...

  4. WPF-悬浮在底部的导航

    先用Rectangle代替导航按钮,这个导航会悬浮在界面的底部,当鼠标移进导航按钮上的时候,按钮会放大,移出后恢复正常.   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...

  5. SSD Network Architecture--keras version

    这里的网络架构和论文中插图中的网络架构是相一致的.对了,忘了说了,这里使用的keras版本是1.2.2,等源码读完之后,我自己改一个2.0.6版本上传到github上面.可别直接粘贴复制,里面有些中文 ...

  6. [Balkan 2007] Mokia

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1176 [算法] CDQ分治 + 树状数组即可 时间复杂度 : O(Nlog^2N) ...

  7. [Codeforces 787D] Legacy

    [题目链接] https://codeforces.com/contest/787/problem/D [算法] 线段树优化建边 ,  然后用Dijkstra算法求单源最短路 时间复杂度 : O((N ...

  8. DTP模型之二:(XA协议之二)JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)

    jotm只能用的xapool数据源,而且很少更新. 一.以下介绍Spring中直接集成JOTM提供JTA事务管理.将JOTM集成到Tomcat中. (经过测试JOTM在批量持久化时有BUG需要修改源码 ...

  9. Win7点击文件夹右键可打开cmd控制台,并获取当前目录

    当我们用cmd时,有时要切换到某个文件夹的目录,可以在当前目录下,按住shift单击右键打开控制台,也可以在鼠标右键中添加cmd启动命令: 1.在开始搜索框输入regedit,打开注册表: 2.打开 ...

  10. CS231n 2016 通关 第四章-反向传播与神经网络(第一部分)

    在上次的分享中,介绍了模型建立与使用梯度下降法优化参数.梯度校验,以及一些超参数的经验. 本节课的主要内容: 1==链式法则 2==深度学习框架中链式法则 3==全连接神经网络 =========== ...