Machine Learning Codeforces

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

设块大小为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=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 }
View Code

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=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 }
View Code
原文地址:https://www.cnblogs.com/hehe54321/p/9563081.html