以下内容未验证,有错请指正...
设块大小为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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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=101000; 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=2000; 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[201000],n2[201000]; 37 int nans; 38 int qn[N],cn[N]; 39 int tt[201000]; 40 map<int,int> ma; 41 void decn2(int x) 42 { 43 if(!x) return; 44 n2[x]--; 45 if(n2[x]==0) 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]==1) 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+1<=nc&&c[pc+1].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>=1&&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=1;i<=n;i++) bl[i]=(i-1)/sz; 94 for(i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i],tt[++tt[0]]=a[i]; 95 for(i=1;i<=qq;i++) 96 { 97 scanf("%d",&idx); 98 if(idx==1) 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[0]]=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=1;i<=n;i++) a[i]=b[i]; 114 sort(tt+1,tt+tt[0]+1);tt[0]=unique(tt+1,tt+tt[0]+1)-tt-1; 115 for(i=1;i<=tt[0];i++) ma[tt[i]]=i; 116 for(i=1;i<=n;i++) a[i]=ma[a[i]]; 117 for(i=1;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 ",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 ",c[i].p,c[i].a,c[i].b,c[i].t); 134 } 135 } 136 */ 137 sort(q+1,q+nq+1,c1); 138 nl=1;nr=0;nt=0;nans=1;pc=0; 139 for(i=1;i<=nq;i++) 140 { 141 //printf("i%d %d ",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=1;i<=qq;i++) 151 if(qn[i]) 152 printf("%d ",ans[i]); 153 return 0; 154 }
https://www.luogu.org/problemnew/show/P4074
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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=100100; 14 struct E 15 { 16 ll to,nxt; 17 }e[N<<1]; 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=2000; 35 ll p[N<<1],pl[N]; 36 namespace LCA 37 { 38 ll anc[N][18],l2n=17,d[N]; 39 void dfs(ll u,ll fa) 40 { 41 p[++p[0]]=u;pl[u]=p[0]; 42 anc[u][0]=fa;d[u]=d[fa]+1; 43 for(ll i=1;i<=l2n;i++) 44 anc[u][i]=anc[anc[u][i-1]][i-1]; 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[0]]=u; 49 } 50 ll lft[20]; 51 void init() 52 { 53 ll i; 54 lft[0]=1; 55 for(i=1;i<20;i++) lft[i]=lft[i-1]<<1; 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=0;t;t>>=1,i++) 62 if(t&1) 63 a=anc[a][i]; 64 if(a==b) return a; 65 for(i=l2n;i>=0;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][0]; 72 } 73 } 74 using LCA::lca; 75 ll bl[N<<1]; 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[1000010]; 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]^=1; 97 } 98 void inctime() 99 { 100 while(pc+1<=nc&&pc+1<=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>=1&&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=1;i<=m;i++) scanf("%lld",&v[i]); 126 for(i=1;i<=n;i++) scanf("%lld",&w[i]); 127 for(i=1;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=1;i<=n;i++) scanf("%lld",&a[i]),cc2[i]=a[i]; 134 for(i=1;i<=qq;i++) 135 { 136 scanf("%lld%lld%lld",&idx,&x,&y); 137 if(idx==0) 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(1,0); 151 for(i=1;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=1;i<=p[0];i++) bl[i]=(i-1)/sz; 164 sort(q+1,q+nq+1,c1); 165 for(i=1;i<=n;i++) a[i]=cc2[i]; 166 nl=1;nr=0;nt=0;nans=0;pc=0; 167 for(i=1;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=1;i<=qq;i++) 187 if(qn[i]) 188 printf("%lld ",ans[i]); 189 return 0; 190 }