zoukankan      html  css  js  c++  java
  • SHOI2019旅游记

    题外话

    为什么不更ZJOI day1的游记呢。。。。

    因为考挂自闭了不想更。等day2考完再说咕咕咕

    还是更个SHOI旅游记吧!反正不是自家省选,玩得真开心~~~

    day0

    SH好热好热啊,感觉到夏天了

    day1

    考场是一个奇怪的科技中心什么的,早上很早去本来以为要试机,后来发现考场都进不去。

    进去了竟然说随便坐。。。我原来那个位置键盘贼难受,后来换了一个鼠标很诡异的位置,不过键盘还挺好用的。

    SH还是发了面包,比ZJ优秀(???)午饭感觉也还不错的说

    暴力60+40+?

    T1是送的,T2是个后缀树模板,T3是个没意思的找规律。

    T1其实不用“超级钢琴”也能做,二分出第k大的值顺便暴力枚举>k的求异或和。至于多log的话,把二分改成逐位确定就可以省掉那个log。在下代码力弱得没调出来,结果60分排序比较器写成了greater<int>(),于是就爆零了,哭(赛后loj快榜上目前还是rk1  upd:好吧xj大佬们切掉这题以后我瞬间被打爆了。。);我一开始题还读错了,读成了不相交区间,据说有人按照这个写拿了60。。。

    T2大概认真学习过后缀树相关肯定能做出来,大概用到了后缀树上倍增定位+拆点建图。我大概没有学好后缀树,暴力又写挂了。

    T3考脑洞和打表功底(出题人被喷了)。我玩了25,类型2根本看不出来,赛后恍然大悟QAQ

    得分0+10+25,垫底了

    讲课期间:

    zjc: 我T2第三个大样例没过,拿了50分;刚刚有人说他三个样例都过了,他几分啊?我看看。。。(翻榜)诶他怎么0分啊

    day2

    暴力70+60+?

    T1是dp,70是暴力dp加k=0的部分分,k=0是两部分分开dp(互相独立)。正解大概就是再优化一下,有限制的情况暴力跑,无限制的用k=0的方法跑。听说km^2会被卡常。

    T2是贪心,感觉也是送的?大家好像都会做(只有我拿不到送的分)。链的部分分是个简单贪心,提示正解,正解就是套用链的做法把子树合并起来即可。

    T3融合了很多知识点,包括树上连通块边数-点数=1算贡献,树形dp,长链剖分,数据结构等等,现在还没有搞太懂,据说其中一份std写了908行。反正十分毒瘤就是了。我写了大暴力加L=n,k=1的部分分得了20。

    得分70+60+20,其实T3估分是24。。。不过挂4分也不想管他了。

    upd: 丢失4分原因竟是数组开小。。。。。哭了。

    讲课期间:

    讲课人:我也是刚刚拿到ppt……(陷入僵局)

    (过了一会儿)

    讲课人:我们请AC的选手上来讲一下吧!

    (过了一会儿,讲T3)

    讲课人:我们请最高分选手上来讲一下吧!

    (然后放了几页ppt,莫名其妙就结束了讲课)

    总结

    这个分数尤其day1的得分,总觉得是不太符合自己水平的分数。

    虽然一次次考试结果证明自己真的很弱,根本跟不上大家的脚步,每次考试都是那种,总想要飞上天反而摔得粉身碎骨的感觉,正解不会写暴力还统统写挂。

    不过自我安慰一下这次就是来玩玩的,反正考挂也没有什么影响,还是非常开心地浪了两天半~~~ QAQ

    可惜的是noip实在太烂了连去北京浪的机会都没有,thupc感觉也审不过的吧。

    noip。。。真的是一时疏忽,如今算是尝到恶果了。感觉真的只能滚去准备学考了啊。ZJOI二试,可能也要变成旅游了。

    等明年吧。不甘心。

    upd:放一下我AC的代码

     1 #include<bits/stdc++.h>
     2 #define rep(i,x,y) for (int i=(x);i<=(y);i++)
     3 #define ll long long
     4 
     5 using namespace std;
     6 
     7 const int N=5e5+100;
     8 int n,m,c[N*32][2],w[N*32],leaf[N*32],p[N],tot=1; ll a[N],sum[N],num[N],ans;
     9 
    10 void ins(ll x){
    11     int now=1;
    12     for (int i=31;~i;i--){
    13         int b=x>>i&1;
    14         if (!c[now][b]) c[now][b]=++tot;
    15         now=c[now][b],w[now]++;
    16     }
    17     leaf[now]++;
    18 }
    19 
    20 void dfs(int u,int i,ll x,ll y){
    21     if (!u||i<0||!w[u]) return;
    22     if (leaf[u]) ans+=leaf[u]*(x^y);
    23     dfs(c[u][0],i-1,x,y);
    24     dfs(c[u][1],i-1,x|(1<<i-1),y);
    25 }
    26 
    27 int main(){
    28     scanf("%d%d",&n,&m);
    29     rep (i,1,n) scanf("%lld",&a[i]),sum[i]=sum[i-1]^a[i];
    30     rep (i,0,n) ins(sum[i]),p[i]=1;
    31     m*=2; ll res=0;
    32     for (int i=31;~i;i--){
    33         ll s=0;
    34         rep (j,0,n){
    35             ll b=sum[j]>>i&1; s+=w[c[p[j]][b^1]];
    36         }
    37         if (s<m){
    38             m-=s;
    39             rep (j,0,n){
    40                 ll b=sum[j]>>i&1;
    41                 dfs(c[p[j]][b^1],i,num[j]|((b^1)<<i),sum[j]);
    42                 p[j]=c[p[j]][b],num[j]|=b<<i;
    43             }
    44         } else{
    45             res|=1ll<<i;
    46             rep (j,0,n){
    47                 ll b=sum[j]>>i&1; p[j]=c[p[j]][b^1],num[j]|=(b^1)<<i;
    48             }
    49         }
    50     }
    51     ans+=(ll)m*res;
    52     printf("%lld
    ",ans>>1);
    53     return 0;
    54 }
    day1 T1 异或粽子
      1 #include<bits/stdc++.h>
      2 #define rep(i,x,y) for (int i=(x);i<=(y);i++)
      3 #define pii pair<int,int>
      4 #define fi first
      5 #define se second
      6 #define Vp vector<pii>
      7 #define ll long long
      8 
      9 using namespace std;
     10 
     11 const int N=2000010;
     12 int n,na,nb,Q,fa[N],ch[N][30],len[N],pos[N],tot,las,f[N][22],id[N]; Vp V[N];
     13 int cnt,head[N],val[N],num,q[N],rd[N];
     14 ll dp[N],ans; char s[N];
     15 struct edge{int to,nxt;}e[N<<1];
     16 
     17 void adde(int x,int y){
     18     e[++cnt].to=y; e[cnt].nxt=head[x]; head[x]=cnt; rd[y]++;
     19 }
     20 
     21 void sam_init(){
     22     rep (i,1,tot){
     23         memset(ch[i],0,sizeof(ch[i])),
     24         memset(f[i],0,sizeof(f[i])),fa[i]=len[i]=0;
     25     }
     26     tot=las=1;
     27 }
     28 void extend(int c,int i){
     29     int p=las,np=las=++tot,q,nq;
     30     len[np]=len[p]+1,pos[i]=np;
     31     for (;p&&!ch[p][c];p=fa[p]) ch[p][c]=np;
     32     if (!p){fa[np]=1; return;}
     33     q=ch[p][c];
     34     if (len[p]+1==len[q]) fa[np]=q;
     35     else{
     36         nq=++tot; len[nq]=len[p]+1;
     37         memcpy(ch[nq],ch[q],sizeof(ch[q]));
     38         fa[nq]=fa[q]; fa[q]=fa[np]=nq;
     39         for (;p&&ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
     40     }
     41 }
     42 void tree_build(){
     43     rep (i,1,tot) f[i][0]=fa[i];
     44     rep (j,1,19) rep (i,1,tot) f[i][j]=f[f[i][j-1]][j-1];
     45 }
     46 
     47 void get_node(int l,int r,int id){
     48     int x=pos[l];
     49     for (int i=19;~i;i--)
     50         if (f[x][i]&&len[f[x][i]]>=r-l+1) x=f[x][i];
     51     V[x].push_back(pii(r-l+1,id));
     52 }
     53 
     54 const bool cmp(pii x,pii y){
     55     return x.fi!=y.fi?x.fi<y.fi:x.se>y.se;
     56 }
     57 void graph_build(){
     58     rep (i,1,tot){
     59         sort(V[i].begin(),V[i].end(),cmp);
     60         int sz=V[i].size();
     61         rep (j,0,sz-1){
     62             int x=V[i][j].se+2*tot; id[x-2*tot]=x;
     63             if (!j) adde(i,x);
     64             if (j<sz-1) adde(x,V[i][j+1].se+2*tot); else adde(x,i+tot);
     65             if (x<=na+2*tot){ //A类点有贡献
     66                 id[x-2*tot]=++num;
     67                 adde(x,num),val[num]=V[i][j].fi;
     68             }
     69         }
     70         if (!sz) adde(i,i+tot);
     71         if (fa[i]) adde(fa[i]+tot,i);
     72     }
     73 }
     74 void topo(){
     75     int h=1,t=0;
     76     rep (i,1,num) if (!rd[i]) q[++t]=i,dp[i]=val[i];
     77     ans=0;
     78     int tmp=0;
     79     while (h<=t){
     80         int u=q[h++]; tmp++;
     81         if (u>2*tot+na+nb) ans=max(ans,dp[u]);
     82         for (int i=head[u],v;i;i=e[i].nxt){
     83             v=e[i].to;
     84             if (!--rd[v]) q[++t]=v;
     85             dp[v]=max(dp[v],dp[u]+val[v]);
     86         }
     87     }
     88     if (t!=num) puts("-1"); else printf("%lld
    ",ans);
     89 }
     90 
     91 int Main(){
     92     scanf("%s",s+1),n=strlen(s+1); sam_init();
     93     for (int i=n;i;i--) extend(s[i]-'a',i); tree_build();
     94     scanf("%d",&na);
     95     rep (i,1,na){int l,r; scanf("%d%d",&l,&r),get_node(l,r,i);}
     96     scanf("%d",&nb);
     97     rep (i,1,nb){int l,r; scanf("%d%d",&l,&r),get_node(l,r,i+na);}
     98     num=na+nb+2*tot;
     99     graph_build();
    100     scanf("%d",&Q);
    101     rep (i,1,Q){int x,y; scanf("%d%d",&x,&y),adde(id[x],id[y+na]);}
    102     topo();
    103     rep (i,1,tot) V[i].clear();
    104     rep (i,1,num) head[i]=dp[i]=val[i]=rd[i]=0; cnt=0;
    105     return 0;
    106 }
    107 
    108 int main(){
    109     int T; scanf("%d",&T); while (T--) Main();
    110     return 0;
    111 }
    day1 T2 字符串问题
    #include<bits/stdc++.h>
    #define rep(i,x,y) for (int i=(x);i<=(y);i++)
    #define Vi vector<int>
    #define ll long long
    
    using namespace std;
    
    const int N=1010,M=2510,mod=998244353;
    int n,m,Q,c0,c1,d0,d1,a[N],bl[N],sum[N],ban[N],ban_c[N],all,lx,rx,ly,ry,Sz,Nowsz;
    int f[2][M][M],g[N][M],ans,fx[M],fy[M],dp0[M][M],dp1[M][M]; Vi v[N];
    
    void upd(int &x,int y){x+=y; x-=x>=mod?mod:0;}
    
    void dp(int x,int st){
        int sz=v[x].size(),tmp,nowsz=0;
        rep (i,0,sz) rep (j,0,Nowsz) g[i][j]=0; g[0][0]=1;
        rep (i,0,sz-1){
            int y=v[x][i];
            if (!ban[y]){
                rep (j,0,nowsz) g[i+1][j]=g[i][j];
                continue;
            }
            rep (j,0,nowsz)
                if (tmp=g[i][j]){
                    if (ban[y]!=st&&j+a[y]<=d0) upd(g[i+1][j+a[y]],tmp);
                    if (ban[y]!=st+1) upd(g[i+1][j],tmp);
                }
            nowsz+=a[y]; nowsz=min(nowsz,d0);
        }
    }
    
    int Main(){
        scanf("%d%d%d%d%d%d",&n,&m,&c0,&c1,&d0,&d1); all=0;
        rep (i,1,n){
            int x,y; scanf("%d%d",&x,&y);
            v[x].push_back(i),sum[x]+=y,a[i]=y,all+=y,bl[i]=x;
        }
        
        scanf("%d",&Q);
        rep (i,1,Q){
            int x,y; scanf("%d%d",&x,&y);
            ban[x]=y+1,ban_c[bl[x]]=1;
        }
        lx=all-c1,rx=c0,ly=all-d1,ry=d0;
        if (lx>rx||ly>ry){
            rep (i,1,m) v[i].clear(),sum[i]=0;
            rep (i,1,n) ban[i]=a[i]=0;
            return puts("0"),0;
        }
        memset(fx,0,sizeof(fx)),memset(fy,0,sizeof(fy));
        fx[0]=fy[0]=1;
        rep (i,1,m)
            if (!ban_c[i]&&sum[i])
                for (int j=c0;j>=sum[i];j--) upd(fx[j],fx[j-sum[i]]);
        rep (i,1,n)
            if (!ban[i])
                for (int j=d0;j>=a[i];j--) upd(fy[j],fy[j-a[i]]);
        rep (i,0,c0) rep (j,0,d0) dp0[i][j]=(ll)fx[i]*fy[j]%mod;
        int now=0;
        memset(f[now],0,sizeof(f[now]));
        f[0][0][0]=1;
        rep (i,0,m-1) if (ban_c[i+1]){
            now^=1; rep (j,0,c0) rep (k,0,Sz) f[now][j][k]=0;
            int sz=v[i+1].size();
            if (!sz){
                rep (j,0,c0) rep (k,0,Sz) f[now][j][k]=f[now^1][j][k];
                continue;
            }
            int nowsz=0;
            rep (j,0,sz-1) if (ban[v[i+1][j]]) nowsz+=a[v[i+1][j]];
            nowsz=min(nowsz,d0); Nowsz=nowsz;
            rep (j,0,c0){
                if (j+sum[i+1]<=c0){
                    dp(i+1,1);
                    rep (k,0,Sz) if (f[now^1][j][k])
                        rep (l,0,min(d0-k,nowsz)) if (g[sz][l])
                            upd(f[now][j+sum[i+1]][k+l],(ll)f[now^1][j][k]*g[sz][l]%mod);
                }
                dp(i+1,3);
                rep (k,0,Sz) if (f[now^1][j][k])
                    rep (l,0,min(d0-k,nowsz)) if (g[sz][l])
                        upd(f[now][j][k+l],(ll)f[now^1][j][k]*g[sz][l]%mod);
            }
            Sz+=nowsz,Sz=min(Sz,d0);
        }
        rep (i,0,c0) rep (j,0,d0){
            dp1[i][j]=f[now][i][j];
            if (i) upd(dp1[i][j],dp1[i-1][j]);
            if (j) upd(dp1[i][j],dp1[i][j-1]);
            if (i&&j) upd(dp1[i][j],mod-dp1[i-1][j-1]);
        }
        ans=0;
        rep (i,0,c0) rep (j,0,d0){
            int Lx=max(lx-i,0),Rx=rx-i;
            int Ly=max(ly-j,0),Ry=ry-j;
            if (Lx>Rx||Ly>Ry) continue;
            int s=dp1[Rx][Ry];
            if (Lx) upd(s,mod-dp1[Lx-1][Ry]);
            if (Ly) upd(s,mod-dp1[Rx][Ly-1]);
            if (Lx&&Ly) upd(s,dp1[Lx-1][Ly-1]);
            upd(ans,(ll)s*dp0[i][j]%mod);
        }
        printf("%d
    ",ans);
        rep (i,1,m) v[i].clear(),sum[i]=0;
        rep (i,1,n) ban[i]=a[i]=0;
        return 0;
    }
    
    int main(){
        int T; scanf("%d",&T); while (T--) Main();
        return 0;
    }
    day2 T1 皮配
     1 #include<bits/stdc++.h>
     2 #define rep(i,x,y) for (int i=(x);i<=(y);i++)
     3 #define Vi vector<int>
     4 #define ll long long
     5 
     6 using namespace std;
     7 
     8 const int N=2e5+10;
     9 int n,cnt,head[N],a[N],fa[N],id[N]; ll ans; priority_queue<int> q[N];
    10 struct edge{int to,nxt;}e[N<<1];
    11 
    12 void adde(int x,int y){
    13     e[++cnt].to=y; e[cnt].nxt=head[x]; head[x]=cnt;
    14 }
    15 
    16 priority_queue<int> c;
    17 void merge(priority_queue<int> &a,priority_queue<int> &b){
    18     if (a.size()<b.size()) swap(a,b);
    19     while (!c.empty()) c.pop();
    20     while (!b.empty()){
    21         int x=max(a.top(),b.top());
    22         a.pop(),b.pop(),c.push(x);
    23     }
    24     while (!c.empty()) a.push(c.top()),c.pop();
    25 }
    26 
    27 void dfs(int u){
    28     for (int i=head[u];i;i=e[i].nxt) dfs(e[i].to);
    29     for (int i=head[u];i;i=e[i].nxt) merge(q[u],q[e[i].to]);
    30     q[u].push(a[u]);
    31 }
    32 
    33 int main(){
    34     scanf("%d",&n);
    35     rep (i,1,n) scanf("%d",&a[i]);
    36     rep (i,2,n) scanf("%d",&fa[i]),adde(fa[i],i);
    37     dfs(1);
    38     while (!q[1].empty()) ans+=q[1].top(),q[1].pop();
    39     printf("%lld
    ",ans);
    40     return 0;
    41 }
    day2 T2 春节十二响
  • 相关阅读:
    for循环
    3.9 作业
    while循环
    深浅拷贝
    条件与判断
    可变与不可变
    与用户交互与运算符
    垃圾回收机制
    【AC自动机】文本生成器
    【AC自动机】最短母串
  • 原文地址:https://www.cnblogs.com/bestFy/p/10668153.html
Copyright © 2011-2022 走看看