zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Minutes和TotalMinutes的区别
    C#的"?"修饰符和"??"运算符
    Navicat 连接MySQL 8.0.11 出现2059错误
    EL1004E: Method call: Method fmtdate(java.util.Date,java.lang.String) cannot be found on org.thymele
    es nested结构判断不为空
    es nested嵌套查询
    CPU基础知识线程切换
    CPU基础知识CPU的组成 运算器、控制器、寄存器
    几个常用寄存器
    Linux笔记用户态与内核态
  • 原文地址:https://www.cnblogs.com/hehe54321/p/9563081.html
Copyright © 2011-2022 走看看