好多考试....

11.01 早上考试

T1 虎...

这题真是虎,大力才结论,水掉了...

每一次翻转一定是只翻转白色连续的一段,然后dfs一遍就行了

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define rint register int
using namespace std;
inline void read(int &x)
{
    x=0; int ff=1; char q=getchar();
    while(q<‘0‘||q>‘9‘) { if(q==‘-‘) ff=-1; q=getchar(); }
    while(q>=‘0‘&&q<=‘9‘) x=x*10+q-‘0‘,q=getchar();
    x*=ff;
}
const int N=1000006;
int first[N],nt[N<<1],ver[N<<1],clo[N<<1],fina[N<<1],e;
void addbian(int u,int v,int _clo,int _fina)
{
    ver[e]=v; clo[e]=_clo;
    fina[e]=_fina;
    nt[e]=first[u];
    first[u]=e++;
}

int n;
int ans;

int fa[N],g[N];
void dfs(int x)
{
    g[x]=0;
    int i,sum=0;
    for(i=first[x];i!=-1;i=nt[i])
        if(ver[i]!=fa[x])
        {
            fa[ver[i]]=x;
            dfs(ver[i]);
            if(!fina[i])
            {
                if(g[ver[i]])
                    ++sum;
            }
            else
            {
                if(!g[ver[i]])
                {
                    if(!clo[i]) ++sum;
                }
                else
                {
                    if(clo[i]) ++ans;
                    else ++sum;
                }
            }
        }
    ans+=(sum>>1);
    if(sum&1) g[x]=1;
    else g[x]=0;
    if(x==1&&g[x])
        ++ans;
}

int main(){

    //freopen("T1.in","r",stdin);

    //freopen("tiger.in","r",stdin);
    //freopen("tiger.out","w",stdout);

    rint i; int tin1,tin2,tin3;
    mem(first,-1);

    read(n);

    for(i=2;i<=n;++i)
    {
        read(tin1); read(tin2); read(tin3);
        if(tin2!=0) tin2=1;
        if(tin3!=0) tin3=1;
        addbian(i,tin1,tin2,tin3);
        addbian(tin1,i,tin2,tin3);
    }
    dfs(1);
    cout<<ans;
}

T1

T2  阴阳

30分暴搜

打表再来30分

正解是dp

发现黑白一定是分成两块,并且边界是单调的

分黑白在两边和边界单调下降什么的搞就行了

最后去掉重

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define rint register int
using namespace std;
inline void read(int &x)
{
    x=0; char q=getchar();
    while(q<‘0‘||q>‘9‘) q=getchar();
    while(q>=‘0‘&&q<=‘9‘) x=x*10+q-‘0‘,q=getchar();
}
inline void readchar(char &x)
{
    x=getchar();
    while(x!=‘B‘&&x!=‘W‘&&x!=‘?‘) x=getchar();
}
const int mod=1e9+7;

int n,m;
char v[1006][1006];
ll f[1006][1006];
int wbl[1006],wbr[1006],bwl[1006],bwr[1006];
int t1[1006],t2[1006],t3[1006],t4[1006];

ll dp()
{
    rint i,j,k; int l,r,tt; ll sum,an=0;

    for(i=1;i<=n;++i)
    {
        r=0; l=m;
        while(r<=m&&v[i][r]!=‘W‘) ++r; --r;
        while(l>=0&&v[i][l]!=‘B‘) --l;
        if(l<0) ++l;
        bwl[i]=l; bwr[i]=r;
        r=0; l=m;
        while(r<=m&&v[i][r]!=‘B‘) ++r; --r;
        while(l>=0&&v[i][l]!=‘W‘) --l;
        if(l<0) ++l;
        wbl[i]=l; wbr[i]=r;
    }

    // bl|wh
    mem(f,0);
    l=bwl[1]; r=bwr[1];
    //printf("l=%d r=%d\n",l,r);
    for(j=l;j<=r;++j) f[1][j]=1;
    for(i=2;i<=n;++i)
    {
        l=bwl[i]; r=bwr[i];
        //printf("l=%d r=%d\n",l,r);
        sum=0;
        for(k=r+1;k<=m;++k)
            sum=(sum+f[i-1][k])%mod;
        for(j=r;j>=l;--j)
        {
            sum=(sum+f[i-1][j])%mod;
            f[i][j]=sum;
        }
    }
    //printf("pr1an=%lld\n",an);
    for(j=0;j<=m;++j)
        an=(an+f[n][j])%mod;
    //printf("ho1an=%lld\n",an);
    // bl\wh
    mem(f,0);
    l=bwl[1]; r=bwr[1];
    for(j=l;j<=r;++j) f[1][j]=1;
    for(i=2;i<=n;++i)
    {
        l=bwl[i]; r=bwr[i];
        sum=0;
        for(k=0;k<l;++k)
            sum=(sum+f[i-1][k])%mod;
        for(j=l;j<=r;++j)
        {
            sum=(sum+f[i-1][j])%mod;
            f[i][j]=sum;
        }
    }
    for(j=0;j<=m;++j)
        an=(an+f[n][j])%mod;
    // wh/bl
    mem(f,0);
    l=wbl[1]; r=wbr[1];
    for(j=l;j<=r;++j) f[1][j]=1;
    for(i=2;i<=n;++i)
    {
        l=wbl[i]; r=wbr[i];
        sum=0;
        for(k=r+1;k<=m;++k)
            sum=(sum+f[i-1][k])%mod;
        for(j=r;j>=l;--j)
        {
            sum=(sum+f[i-1][j])%mod;
            f[i][j]=sum;
        }
    }
    for(j=0;j<=m;++j)
        an=(an+f[n][j])%mod;
    // wh\bl
    mem(f,0);
    l=wbl[1]; r=wbr[1];
    for(j=l;j<=r;++j) f[1][j]=1;
    for(i=2;i<=n;++i)
    {
        l=wbl[i]; r=wbr[i];
        sum=0;
        for(k=0;k<l;++k)
            sum=(sum+f[i-1][k])%mod;
        for(j=l;j<=r;++j)
        {
            sum=(sum+f[i-1][j])%mod;
            f[i][j]=sum;
        }
    }
    for(j=0;j<=m;++j)
        an=(an+f[n][j])%mod;

    // wh\bl
    // wh/bl
    // bl\wh
    // bl/wh

    //int wbmnl1=0,wbmxr1=m,bwmnl1=0,bwmxr1=m;
    //int wbmnl2=0,wbmxr2=n,bwmnl2=0,bwmxr2=n;
    int l0,r0;
    int whnum=0,blnum=0;

    l=0; r=m;
    for(i=1;i<=n;++i)
    {
        if(l<wbl[i]) l=wbl[i];
        if(r>wbr[i]) r=wbr[i];
    }
    //printf("l=%d r=%d\n",l,r);
    for(i=l;i<=r;++i)
        t1[i]+=2;
    if(l==0) blnum+=1;
    if(r==m) whnum+=1;

    l=0; r=m;
    for(i=1;i<=n;++i)
    {
        if(l<bwl[i]) l=bwl[i];
        if(r>bwr[i]) r=bwr[i];
    }
    //printf("l=%d r=%d\n",l,r);
    for(i=l;i<=r;++i)
        t2[i]+=2;
    if(l==0) whnum+=1;
    if(r==m) blnum+=1;

    l0=0; r0=n;
    for(j=1;j<=m;++j)
    {
        l=n; r=0;
        while(l>=0&&v[l][j]!=‘B‘) --l;
        if(l<0) ++l;
        while(r<=n&&v[r][j]!=‘W‘) ++r; --r;
        if(l0<l) l0=l;
        if(r0>r) r0=r;
    }
    //printf("l0=%d r0=%d\n",l0,r0);
    for(i=l0;i<=r0;++i)
        t3[i]+=2;
    if(l0==0) whnum+=1;
    if(r0==n) blnum+=1;

    l0=0; r0=n;
    for(j=1;j<=m;++j)
    {
        l=n; r=0;
        while(l>=0&&v[l][j]!=‘W‘) --l;
        if(l<0) ++l;
        while(r<=n&&v[r][j]!=‘B‘) ++r; --r;
        if(l0<l) l0=l;
        if(r0>r) r0=r;
    }
    //printf("l0=%d r0=%d\n",l0,r0);
    for(i=l0;i<=r0;++i)
        t4[i]+=2;
    if(l0==0) blnum+=1;
    if(r0==n) whnum+=1;

    //printf("prpran=%lld\n",an);

    if(blnum) an=(an-blnum+1+mod)%mod;
    if(whnum) an=(an-whnum+1+mod)%mod;

    //printf("pran=%lld\n",an);

    for(i=1;i<m;++i)
    {
        if(t1[i]) an=(an-t1[i]+1+mod)%mod;
        if(t2[i]) an=(an-t2[i]+1+mod)%mod;
    }
    for(i=1;i<n;++i)
    {
        if(t3[i]) an=(an-t3[i]+1+mod)%mod;
        if(t4[i]) an=(an-t4[i]+1+mod)%mod;
    }

    //printf("an=%lld\n",an);
    return (an%mod+mod)%mod;
}

int main(){

    //freopen("T2.in","r",stdin);
    //freopen("T2.out","w",stdout);

    rint i,j;

    read(n); read(m);
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            readchar(v[i][j]);
    printf("%lld",dp());
}

T2

T3 山洞

真正题意:

走m次,第i次走i步,又正好在第m次走回来的方案数

注意两个方案不同当且仅当走过的山洞排列有一个不同

直接矩阵乘,循环矩阵$O(n^2logm)$

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define rint register int
using namespace std;
inline void read(int &x)
{
    x=0; char q=getchar();
    while(q<‘0‘||q>‘9‘) q=getchar();
    while(q>=‘0‘&&q<=‘9‘) x=x*10+q-‘0‘,q=getchar();
}
const int mod=1e9+7;

int n,m;
ll f[1006],a1[1006][1006],a[1006][1006],t[1006];

ll dp()
{
    rint i,j,k,p; int t1,t2,ci;
    for(i=0;i<n;++i) a[i][i]=1;
    for(p=1;p<=n;++p)
    {
        for(i=0;i<n;++i)
        {
            t[i]=0;
            t1=(i-p+n)%n;
            t[i]=(t[i]+a[0][t1])%mod;
            t2=(i+p)%n;
            if(t1!=t2)
                t[i]=(t[i]+a[0][t2])%mod;
        }
        for(i=0;i<n;++i)
            a[0][i]=t[i];
        /*for(i=0;i<n;++i)
            printf("%lld ",a[0][i]);
        printf("\n");*/
    }
    for(i=1;i<n;++i)
    {
        a[i][0]=a[i-1][n-1];
        for(j=1;j<n;++j)
            a[i][j]=a[i-1][j-1];
    }

    /*printf("\n");
    for(i=0;i<n;++i)
    {
        for(j=0;j<n;++j)
            printf("%lld ",a[i][j]);
        printf("\n");
    }
    printf("\n");*/

    ci=m/n; m=m-n*ci;
    //printf("ci=%d\n",ci);
    f[0]=1;
    while(ci)
    {
        if(ci&1)
        {
            for(i=0;i<n;++i)
            {
                t[i]=0;
                for(k=0;k<n;++k)
                    t[i]=(t[i]+f[k]*a[k][i]%mod)%mod;
            }
            for(i=0;i<n;++i)
                f[i]=t[i];
        }
        for(i=0;i<n;++i)
        {
            t[i]=0;
            for(k=0;k<n;++k)
                t[i]=(t[i]+a[0][k]*a[k][i]%mod)%mod;
        }
        for(i=0;i<n;++i)
            a[0][i]=t[i];
        for(i=1;i<n;++i)
        {
            a[i][0]=a[i-1][n-1];
            for(j=1;j<n;++j)
                a[i][j]=a[i-1][j-1];;
        }
        ci>>=1;
    }

    for(p=1;p<=m;++p)
    {
        for(i=0;i<n;++i)
        {
            t[i]=0;
            t1=(i-p+n)%n;
            t[i]=(t[i]+f[t1])%mod;
            t2=(i+p)%n;
            if(t1!=t2)
                t[i]=(t[i]+f[t2])%mod;
        }
        for(i=0;i<n;++i)
            f[i]=t[i];
    }
    return f[0];
}

int main(){

    //freopen("T3.in","r",stdin);
    //freopen("T3.out","w",stdout);

    read(n); read(m);
    printf("%lld",dp());
}

T3

11.02 晚上

T1 set

无解是骗人的...

求出在mod n 意义下的前缀和,算上$sum_0$一共有最多有n+1个取值

一定有两个相等,输出两个之间的ans即可

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#define ll long long
#define rint register int
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=1000006;
inline void read(int &x)
{
    x=0; int f=1;char ch=getchar();
    while(ch<‘0‘|ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    x*=f;
}

int n;
int v[N],pr[N];
int pos[N];

int main(){

    rint i,j;

    read(n);
    for(i=1;i<=n;++i)
        read(v[i]);
    mem(pos,-1);
    pos[0]=0;
    for(i=1;i<=n;++i)
    {
        pr[i]=(pr[i-1]+v[i])%n;
        if(pos[pr[i]]!=-1)
        {
            printf("%d\n",i-pos[pr[i]]);
            for(j=pos[pr[i]]+1;j<=i;++j)
                printf("%d ",j);
            printf("\n");
            break;
        }
        pos[pr[i]]=i;
    }
}

T1

T2 read

我还以为是什么高级数学题

结果...

很显然是让求最多出现次数的书出现了多少次

那么先 利用有用的最大出现次数一定>$\frac{n+1}{2}$的性质

设 id=0,cnt=0

扫到cnt=0,就id=当前位置值,cnt=1

if(cnt>0)

如果当前v不等于id,--cnt

否则++cnt

扫到最大值的编号id,但是cnt不准

所以再扫一遍,求出出现次数

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#define ll long long
#define rint register int
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=1000006;
inline void read(int &x)
{
    x=0; int ff=1; char q=getchar();
    while(q<‘0‘|q>‘9‘) { if(q==‘-‘) ff=-1; q=getchar(); }
    while(q>=‘0‘&&q<=‘9‘) x=x*10+q-‘0‘,q=getchar();
    x*=ff;
}

int n,m,K;
int c[1006],X[1006],Y[1006],Z[1006];

int main(){

    rint i,j;

    read(m); read(K);
    for(i=1;i<=m;++i) read(c[i]);
    for(i=1;i<=m;++i) read(X[i]);
    for(i=1;i<=m;++i) read(Y[i]);
    for(i=1;i<=m;++i) read(Z[i]);
    int maxp=(1<<K)-1,id=-2e9,cnt=0,an; n=0; ll las;
    for(i=1;i<=m;++i)
    {
        ++n; las=X[i];
        if(cnt==0)
            id=las,cnt=1;
        else
        {
            if(las!=id)
                --cnt;
            else
                ++cnt;
        }
        for(j=1;j<c[i];++j)
        {
            las=(las*Y[i]+Z[i])&maxp;
            ++n;
            if(cnt==0)
                id=las,cnt=1;
            else
            {
                if(las!=id)
                    --cnt;
                else
                    ++cnt;
            }
        }
    }
    n=0; cnt=0;
    for(i=1;i<=m;++i)
    {
        ++n; las=X[i];
        if(las==id) ++cnt;
        for(j=1;j<c[i];++j)
        {
            las=(las*Y[i]+Z[i])&maxp;
            ++n;
            if(las==id) ++cnt;
        }
    }
    an=cnt-1-(n-cnt);
    if(an<0) an=0;
    cout<<an;
}

T2

T3 race

考试直接上01trie,然后就懵逼了...

正解:

把求$x^2$转化成求前面比他大的数两两配对的对数

然后发现在01trie上行走,每到一位有$2^{m-1}$天左边比右边大,有$2^{m-1}$天右边比左边大

设当前到了第i个人,$f_i$为到了01trie上第i位 要走儿子的对立儿子的size

$$ans=\sum_{2*f_i*f_k*2^{m-2}} 的异或和 $$

$2*f_i*f_k$是在枚举有序对

$2^{m-2}$是在求交集的个数

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define rint register int
using namespace std;
const int mod=1e9+7;
inline void read(int &x)
{
    x=0; int ff=1; char q=getchar();
    while(q<‘0‘||q>‘9‘) { if(q==‘-‘) ff=-1; q=getchar(); }
    while(q>=‘0‘&&q<=‘9‘) x=x*10+q-‘0‘,q=getchar();
    x*=ff;
}
const int N=200006;

int n,m;
int A[N];
ll an;
int cnt[42];
ll f[2][2006];

struct trie
{
    int sum;
    trie *ch[2];
    trie(){sum=0;ch[0]=ch[1]=NULL;}
}tong[N*30],*root;
int size;
void add(int vv)
{
    ++root->sum;
    trie *now=root; int i,tt;
    for(i=m-1;~i;--i)
    {
        tt=((1<<i)&vv)>>i;
        if(now->ch[tt]==NULL)
            now->ch[tt]=&tong[size++];
        now=now->ch[tt];
        ++now->sum;
    }
}
void dfs(trie *x,ll pr,ll sum)
{
    if(x->ch[0]==NULL&&x->ch[1]==NULL)
    {
        an^=sum;
        return ;
    }
    int tt;
    if(x->ch[0]!=NULL)
    {
        tt=(x->ch[1]==NULL?0:x->ch[1]->sum);
        dfs(x->ch[0],(pr+tt)%mod,(sum+1LL*tt*(pr+tt)%mod*(1<<(m-1))%mod)%mod);
    }
    if(x->ch[1]!=NULL)
    {
        tt=(x->ch[0]==NULL?0:x->ch[0]->sum);
        dfs(x->ch[1],(pr+tt)%mod,(sum+1LL*tt*(pr+tt)%mod*(1<<(m-1))%mod)%mod);
    }
}

int main(){

    //freopen("T3.in","r",stdin);
    //freopen("T3.out","w",stdout);

    rint i,j,k; int tt,sum,now,pr,q1;

    read(n); read(m);
    for(i=1;i<=n;++i)
        read(A[i]);
    root=&tong[size++];
    for(i=1;i<=n;++i)
        add(A[i]);
    dfs(root,0,0);
    cout<<an;
}

T3

11.02早上

T1 hanoi

它不一定是在中间m-2个柱子上均匀铺开最优...

$f_{i,j}$ 表示i个盘子j个柱子的最小次数

$$ f_{i,j}=min(f_{k,j}+f_{i-k,j-1})$$

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define rint register int
using namespace std;
void read(int &x)
{
    x=0; char q=getchar();
    while(q<‘0‘||q>‘9‘) q=getchar();
    while(q>=‘0‘&&q<=‘9‘) x=x*10+q-‘0‘,q=getchar();
}

int n,m;
ll f[106][106];

int main(){

    rint i,j,k;

    read(n); read(m);
    mem(f,127);
    for(j=3;j<=m;++j)
        f[1][j]=1;
    for(i=2;i<=n;++i)
        f[i][3]=f[i-1][3]*2+1;
    for(i=2;i<=n;++i)
        for(j=4;j<=m;++j)
            for(k=1;k<i;++k)
                f[i][j]=min(f[i][j],f[k][j]*2+f[i-k][j-1]);
    cout<<f[n][m];
}

T1

T2 rank

贪心就行了

如果rank和rank+1后面的位置仍然满足大小关系

说明这一位可以相等,解决纠纷留到下一次

否则必须++

最后大于26个取值就不合法...

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define rint register int
using namespace std;
void read(int &x)
{
    x=0; char q=getchar();
    while(q<‘0‘||q>‘9‘) q=getchar();
    while(q>=‘0‘&&q<=‘9‘) x=x*10+q-‘0‘,q=getchar();
}
const int N=200006;

int n;
int ran[N],pos[N];
int an[N];

int main(){

    rint i;

    read(n);
    for(i=1;i<=n;++i)
        read(ran[i]),pos[ran[i]]=i;
    an[pos[1]]=0;
    for(i=1;i<n;++i)
    {
        if(ran[pos[i]+1]<ran[pos[i+1]+1])
            an[pos[i+1]]=an[pos[i]];
        else
            an[pos[i+1]]=an[pos[i]]+1;
    }
    int ff=0;
    for(i=1;i<=n;++i)
        if(an[i]>=26)
            ff=1;
    if(ff)
        puts("-1");
    else
        for(i=1;i<=n;++i)
            printf("%c",an[i]+‘a‘);
}

T2

T3 tree

又是两遍dfs的傻逼题...

$f_{x}$ 表示从x走到父亲的期望次数

转移方程经过一波化简后就会变成整数

没有分数...

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define rint register int
using namespace std;
void read(int &x)
{
    x=0; char q=getchar();
    while(q<‘0‘||q>‘9‘) q=getchar();
    while(q>=‘0‘&&q<=‘9‘) x=x*10+q-‘0‘,q=getchar();
}
const int mod=1e9+7;
const int N=100006;
int first[N],nt[N<<1],ver[N<<1],e;
void addbian(int u,int v)
{
    ver[e]=v;
    nt[e]=first[u];
    first[u]=e++;
}

int n,Q;
int maxk;
ll f[N],g[N],sumf[N][21],sumg[N][21];
int st[N][21];

int fa[N],dep[N];
void dfs1(int x)
{
    f[x]=1;
    int i;
    for(i=first[x];i!=-1;i=nt[i])
        if(ver[i]!=fa[x])
        {
            fa[ver[i]]=x;
            dep[ver[i]]=dep[x]+1;
            dfs1(ver[i]);
            f[x]=(f[x]+f[ver[i]]+1)%mod;
        }
}
void dfs2(int x)
{
    int i;
    for(i=first[x];i!=-1;i=nt[i])
        if(ver[i]!=fa[x])
        {
            if(fa[x]!=-1) g[ver[i]]=1;
            g[ver[i]]=(g[ver[i]]+g[x]+1+(f[x]-1-f[ver[i]]-1))%mod;
            dfs2(ver[i]);
        }
}
void ST()
{
    rint i; int j;
    while((1<<maxk)<=n) ++maxk; --maxk;
    mem(st,-1);
    for(i=1;i<=n;++i)
        st[i][0]=fa[i],sumf[i][0]=f[i],sumg[i][0]=g[i];
    for(j=1;(1<<j)<=n;++j)
        for(i=1;i<=n;++i)
            if(st[i][j-1]!=-1)
                st[i][j]=st[st[i][j-1]][j-1],
                sumf[i][j]=(sumf[i][j-1]+sumf[st[i][j-1]][j-1])%mod,
                sumg[i][j]=(sumg[i][j-1]+sumg[st[i][j-1]][j-1])%mod;
}
int LCA(int x,int y)
{
    if(dep[x]<dep[y]) x^=y,y^=x,x^=y;
    int j;
    for(j=maxk;~j;--j)
        if(dep[x]-(1<<j)>=dep[y])
            x=st[x][j];
    if(x==y) return x;
    for(j=maxk;~j;--j)
        if(st[x][j]!=-1&&st[x][j]!=st[y][j])
            x=st[x][j],y=st[y][j];
    return fa[x];
}
ll getf(int x,int y)
{
    if(dep[x]<=dep[y]) return 0;
    ll an=0; int j;
    for(j=maxk;~j;--j)
        if(dep[x]-(1<<j)>=dep[y])
            an=(an+sumf[x][j])%mod,x=st[x][j];
    return an;
}
ll getg(int x,int y)
{
    if(dep[x]<=dep[y]) return 0;
    ll an=0; int j;
    for(j=maxk;~j;--j)
        if(dep[x]-(1<<j)>=dep[y])
            an=(an+sumg[x][j])%mod,x=st[x][j];
    return an;
}

int main(){

    //freopen("T3.in","r",stdin);

    rint i; int tin1,tin2,tt;
    mem(first,-1);

    read(n); read(Q);
    for(i=1;i<n;++i)
    {
        read(tin1); read(tin2);
        addbian(tin1,tin2);
        addbian(tin2,tin1);
    }
    fa[1]=-1; dfs1(1);
    dfs2(1);
    ST();

    /*printf("\n");
    for(i=1;i<=n;++i)
        printf("%lld ",f[i]);
    printf("\n");
    for(i=1;i<=n;++i)
        printf("%lld ",g[i]);
    printf("\n");*/

    for(i=1;i<=Q;++i)
    {
        read(tin1); read(tin2);
        tt=LCA(tin1,tin2);
        //printf("%d %d %d\n",tin1,tin2,tt);
        printf("%lld\n",(getf(tin1,tt)+getg(tin2,tt))%mod);
    }
}

T3

还有一些,不想写了....

最近老是犯一些智障错误

正解不会,暴力打挂...

我也很无奈啊...

时间: 2024-08-30 18:34:40

好多考试....的相关文章

我在51CTO微职位学软考——一次通过信息系统项目管理师考试

本人2013年自学参加软考通过了中级网络工程师考试,截止2018年,一直在单位聘为中级职称,为了能提升一下自身的专业技能,说白了也是想提高一下工资待遇,于是我通过度娘找到了51CTO学院,当时记得很清楚那是18年5月24日,上半年软考考前的前两天,当时通过QQ与我沟通的是周丽云老师,毕竟已经有5年时间没有考过试,家庭.工作上的事情还很多,看着公司的宣传广告,心动了,但是静下心来想想自身现在的状况,而且是第一次在网络上学习,平时时间怎么分配,而且高项全国通过率也是有限制,高级考试不像中级,还有论文

课程结束小结

一.软工前,软工后 开学初对于软件工程课程的想象: 还没开始学习软件工程时,我一直觉得这门课包括实践就是在教我们做项目,当然,是偏向于如何编写代码的那一种,告诉我们一种语言,告诉我们如何去写.当时并没有意识到开发一款软件还要需求分析,所有东西需要画出流图,而且要自学那么多工具的使用. 这门课程的实践给我带来的提升:了解一个项目经理需要做的是什么,知道需求文档的重要性,自学了许多工具和语言.包括原型创作软件Balsamiq Mockups,画用例图,流程图的PowerDesigner,markdo

【Qt5开发及实例】7、综合:修改用户资料

给个目标实现以下: 代码展示, 首先创建一个项目,不要界面,选择基类是QDialog这个,后面名字的话随便改改 我的类名是:Content. baseinfo.h #include <QDialog> #include <QLabel> #include <QLineEdit> #include <QComboBox> //多选行 #include <QTextEdit> #include <QGridLayout> //网格布局 #

Beta 冲刺 (6/7)

队名:Boy Next Door 燃尽图 代码写入 https://github.com/mangoqiqi/paybook/tree/master/Desktop/Web%E8%B4%A6%E5%8D%95%E7%AE%A1%E5%AE%B6 晗(组长) 今日完成 今天没做什么 明日工作 复习-- 还剩下哪些任务 自动获取账单的前后端整合还有点问题 困难 好多考试 解决方法 用头撞 松雄 今日完成 界面优化(1/5) -数据库优化添增预定功能 -联系我们的页面制作 剩余工作量 -界面优化(1/

关于项目管理专业(PMP)认证考试5P的个人心得

写点个人心得,谨供参考. 7月26日,焦急地等了一个月后成绩发布了,之后以焦急是因为考完后几乎没信心能通过,更别提5P,所以这个成绩完全是出乎我意料的.因此,我跟同组同学交流的一句话心得便是:考试很变态,考完都没信心,所以还是要把基础打好,把知识点尽量掌握牢固,然后就是考场发挥好.下边就来按倒序来细谈下这句心得. 一.首先是认识一下PMP考试 个人认为PMP考试还是较为变态的,要有提前的认识,打一场有准备的胜战 1:考试时间长得变态,PMP一场考试时长4个小时,加上提前半小时进场熟悉考场规则,再

9.5 考试 第二题 通讯题解

问题 B: 通讯 时间限制: 1 Sec  内存限制: 256 MB 题目描述 "这一切都是命运石之门的选择." 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部必须尽快将这个消息通过地下秘密通讯 网络,传达到所有分部. SERN共有N个部门(总部编号为0),通讯网络有M条单向通讯线路,每条线 路有一个固定的通讯花费Ci. 为了保密,消息的传递只能按照固定的方式进行:从一个已知消

我的2017上半年网工考试之路

最初有参加这个考试的想法是在2016年,由于各种原因没来得及报名参加.2017元宵节当天,正好51cto学院有微职位培训活动,我就不假思索的报了培训班.我想我应该是第一个报培训班的吧,结果进了班里一看已经有好多同学了,而且我的学号也有原来的23号改成了50多号,我对学号无所谓,反正最后能过就行. 从元宵节开始,我就进入了我的网工培训班学习生涯,每天晚上我都坚持要求自己至少看完一个视频章节,而且不懂的地方反复看.结合每章节后面的练习题目,练习题我从未做过满分,而且连我自己都不满意,心想这次考试会不

11g ocm认证考试经历

从2012年北漂以来到现在有近5个年头了,dba这活儿正了八经的玩数据库其实是从这两三年,学校学的sql server当时理解的不深,只学会了一些简单的sql语句,2012-2014年因为在大学做运维工作相对轻松,所以决定考一下ocp,当时最初的相做数据库的原因很简单,上智联和前程上搜了一下dba的工作招聘需求量很大,而且在那会儿工资比我干的工作薪资高,很单纯的一个想法,北漂吗?出来飘的,毕竟钱这玩意儿在北京是活命的东西,多点还是有用的! 不扯别的了,萌生考ocm的念头在14年拿到ocp那会儿就

暑假第二次考试 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱

题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n-2 个路口,分别标上号,A 农场为 1 号,B 农场为 n 号,路口分别为 2...n-1 号,从 A 农场到 B 农场有很多条路径可以到达,而 CG 发现有的路口是必须经过的,即每条路径都经过的路口,CG 要把它们记录下来,这样 CG 就可以先到那个路口,观察新牛们有没有偷懒,而你的任务就是找出所有必经路口. [输入格式] 第一行两个用空格隔开的