• JSOI2018真题感悟


    D1T1潜入行动:

    大水题,可是本菜鸡手一抖MLE了,GG

    #include<iostream>
    #include<cstdio>
    #define llint long long int 
    using namespace std;
    
    const llint maxn = 200005;
    const llint maxk = 107;
    const llint modd = 1e9+7;
    llint n, k;
    
    struct atree {//choose safe
        int dp[100005][maxk][2][2];
        llint st[maxn], to[maxn], nx[maxn], tm, up[maxn], tt;
        void adde(llint aa, llint bb) {
            tm++;
            nx[tm]=st[aa];
            to[tm]=bb;
            st[aa]=tm;
            return;
        }
        void count(llint x, llint fa) {
            //cout<<x<<endl;
            llint i, y, j, p, tt, t[2][2];
            dp[x][0][0][0]=1;
            dp[x][1][1][0]=1;
            up[x]=1;
            for(i=st[x]; i != 0; i=nx[i]) {
                y=to[i];
                if(y == fa) continue;
                count(y, x);
                for(j=up[x]; j >= 0; j--) {
                    t[0][0]=dp[x][j][0][0];
                    t[0][1]=dp[x][j][0][1];
                    t[1][0]=dp[x][j][1][0];
                    t[1][1]=dp[x][j][1][1];
                    dp[x][j][0][0]=dp[x][j][0][1]=dp[x][j][1][0]=dp[x][j][1][1]=0;
                    for(p=min(up[y], k-j); p >= 0; p--) {
                        up[x]=max(up[x], j+p);
                        
                        tt=dp[x][j+p][0][0];
                        tt+=t[0][0]*dp[y][p][0][1]%modd;
                        tt%=modd;
                        dp[x][j+p][0][0]=tt;
                        
                        tt=dp[x][j+p][0][1];
                        tt+=t[0][0]*dp[y][p][1][1]%modd;
                        tt+=t[0][1]*dp[y][p][0][1]%modd;
                        tt+=t[0][1]*dp[y][p][1][1]%modd;
                        tt%=modd;
                        dp[x][j+p][0][1]=tt;
                        
                        tt=dp[x][j+p][1][0];
                        tt+=t[1][0]*dp[y][p][0][1]%modd;
                        tt+=t[1][0]*dp[y][p][0][0]%modd;
                        tt%=modd;
                        dp[x][j+p][1][0]=tt;
                        
                        tt=dp[x][j+p][1][1];
                        tt+=t[1][0]*dp[y][p][1][1]%modd;
                        tt+=t[1][0]*dp[y][p][1][0]%modd;
                        tt+=t[1][1]*dp[y][p][0][0]%modd;
                        tt+=t[1][1]*dp[y][p][0][1]%modd;
                        tt+=t[1][1]*dp[y][p][1][0]%modd;
                        tt+=t[1][1]*dp[y][p][1][1]%modd;
                        tt%=modd;
                        dp[x][j+p][1][1]=tt;
                    }
                }
            }
            return;
        }
    } T;
    
    int main() {
        llint i, ta, tb, tt;
        cin>>n>>k;
        for(i=1; i < n; i++) {
            cin>>ta>>tb;
            T.adde(ta, tb);
            T.adde(tb, ta);
        }
        T.count(1, 0);
        tt=T.dp[1][k][0][1]*1ll+T.dp[1][k][1][1]*1ll;
        cout<<((tt)%modd+modd)%modd<<endl;
    }

    D2T3列队:

    蛮水的吧,可是我Naive地认为卡卡常直接二分能过

    卡了很久以后才想起来写主席树上二分.

    loj稳过,luogu迷之TLE

    #include<iostream>
    #include<cstdio>
    #define llint long long int 
    using namespace std;
    
    const llint maxn = 20000005;
    llint mp;
    llint a[maxn];
    
    struct atree {
        llint num[maxn];
        int tn, st[maxn], ls[maxn], rs[maxn], tm;
        void build(int x, int l, int r) {
            num[x]=0;
            if(l == r) return;
            int mid=(l+r)/2;
            tm++; ls[x]=tm; build(ls[x], l, mid);
            tm++; rs[x]=tm; build(rs[x], mid+1, r);
            return;
        }
        void add_do(int x1, int x2, int l, int r, int p1, llint num1) {
            if(l == r) {num[x1]=num[x2]+num1; return;}
            int mid=(l+r)/2;
            if(p1 <= mid) {
                tm++; ls[x1]=tm; rs[x1]=rs[x2];
                add_do(ls[x1], ls[x2], l, mid, p1, num1);
            }
            else {
                tm++; rs[x1]=tm; ls[x1]=ls[x2];
                add_do(rs[x1], rs[x2], mid+1, r, p1, num1);
            }
            num[x1]=num[ls[x1]]+num[rs[x1]];
            return;
        }
        inline void add(int p1, llint num1) {
            tn++; tm++; st[tn]=tm;
            add_do(st[tn], st[tn-1], 0, mp, p1, num1);
        }
        llint ask_do(int x1, int x2, int l, int r, int pl, int pr) {
            if(r < pl || pr < l) return 0;
            if(num[x2]-num[x1] == 0) return 0;
            if(pl <= l && r <= pr) return num[x2]-num[x1];
            int mid=(l+r)/2;
            llint anst;
            anst=
            ask_do(ls[x1], ls[x2], l, mid, pl, pr) +
            ask_do(rs[x1], rs[x2], mid+1, r, pl, pr);
            return anst;
        }
        inline llint ask(int b1, int b2, int pl, int pr) {
            if(pr > mp) pr=mp;
            if(pl > pr) return 0;
            return ask_do(st[b1-1], st[b2], 0, mp, pl, pr);
        }
        llint find_it(int x1, int x2, int l, int r, llint tk) {
            if(r == l) return l;
            int mid=(l+r)/2;
            if(num[ls[x2]]-num[ls[x1]] > (mid-tk+1)) 
                return find_it(rs[x1], rs[x2], mid+1, r, tk+num[ls[x2]]-num[ls[x1]]);
            else return find_it(ls[x1], ls[x2], l, mid, tk);
        }
        inline llint find(int b1, int b2, llint tk) {
            return find_it(st[b1-1], st[b2], 0, mp, tk);
        }
    } T1, T2;
    
    inline llint csum(llint l, llint r) {
        if(l > r) return 0;
        return (l+r)*(r-l+1ll)/2ll;
    }
    
    inline llint read(){
       llint s=0,w=1;
       char ch=getchar();
       while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
       while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
       return s*w;
    }
    inline void write( llint x ) {
        char F[2000] ;
        if(x == 0) putchar('0');
        llint tmp = x > 0 ? x : -x ;
        if( x < 0 ) putchar( '-' ) ;
        int cnt = 0 ;
           while( tmp > 0 ) {
               F[ cnt ++ ] = tmp % 10 + '0' ;
               tmp /= 10 ;
           }
           while( cnt > 0 ) putchar( F[ -- cnt ] ) ;
    }
    int main() {
        //freopen("line.in", "r", stdin);
        //freopen("line.out", "w", stdout);
        T1.tm=1; T1.tn=0; T1.st[0]=1;
        T2.tm=1; T2.tn=0; T2.st[0]=1;
        llint i, ta, tb, tk, ans, ansp, n, m;
        n=read(), m=read();
        for(i=1; i <= n; i++) {
            a[i]=read();
        }
        mp=1000005;
        T2.build(1, 0, mp);
        T1.build(1, 0, mp);
        //cout<<T1.tm<<endl;
        for(i=1; i <= n; ++i) {
            T1.add(a[i], 1);
            T2.add(a[i], a[i]);
        }
        
        for(i=1; i <= m; ++i) {
            ta=read();
            tb=read();
            tk=read();
            ans=0;
            ansp=T1.find(ta, tb, tk);
            if(ansp == 1000005) ansp=tk+tb-ta;
            ans+=csum(tk, ansp)-T2.ask(ta, tb, 1, ansp);
            ans+=T2.ask(ta, tb, ansp+1, mp)-csum(ansp+1, tk+tb-ta);
            write(ans);
            putchar('
    ');
        }
        return 0;
    }

    D1T3绝地反击:

    想出来爬山+二分了,结果没敢想网络流

    不行,我还是Too Young,Too Simple


    D2T1战争:

    哦我的天哪,这个菜鸡不会计算几何还敢刷省选题呐

    嗯,不会


    D2T2机器人:

    至今犹记考场上打表找出循环节的规律结果并无卵用照样不会

     


    D1T2防御网络:

     

  • 相关阅读:
    java----设计模式--创建型模式(GOF23)
    java----作用域
    java和python对比----实例化的对象属性:
    java----关键字
    java----Java的栈,堆,代码,静态存储区的存储顺序和位置
    java----面对对象
    算法----取0~30不重复的10个整数
    算法----二分查找算法
    织梦 验证码不显示问题
    dedecms 后台修改系统设置,但是config.cache.inc.php文件不能写入
  • 原文地址:https://www.cnblogs.com/crraphael/p/11562962.html
Copyright © 2020-2023  润新知