zoukankan      html  css  js  c++  java
  • GDKOI2021 PJ D3 总结

    不如我们恢复成题解罢

    然后实际情况是爆炸专场。

    终于,在最后一天,我终于找到了如何在没有权限的条件下配置 Sublime 的方法。

    然并卵

    T1 triangle

    这个应该不用解释了。

    除了快读要打负数。

    #include<cmath>
    #include<cstdio>
    #define ll long long
    #define ld long double
    #define EPS 1e-14
    using namespace std;
    ll t,ax1,ax2,ax3,ax4,ax5,ax6,ay1,ay2,ay3,ay4,ay5,ay6;
    char BuF[1<<26],*InF=BuF;
    template<typename T>void read(T &x){
        for(;*InF<33;++InF);
        for(x=0;47<*InF&&*InF<58;x=(x<<3)+(x<<1)+(*InF++^48));
    }
    /*
    template<typename T>void read(T &x){
        bool f=1;
        for(;*InF<33||*InF=='-';f^=*InF++=='-');
        for(x=0;47<*InF&&*InF<58;x=(x<<3)+(x<<1)+(*InF++^48));
        x=f?x:-x;
    }
    */
    ld sqr(ll x){
        return(x*x);
    }
    ld dis(ll x1,ll y1,ll x2,ll y2){
        return(sqrt(sqr(x1-x2)+sqr(y1-y2)));
    }
    bool check(ld a1,ld b1,ld a2,ld b2,ld a3,ld b3){
        ld t1=a1/b1,t2=a2/b2,t3=a3/b3;
        return(abs(t1-t2)<EPS&&abs(t2-t3)<EPS);
    }
    int main(){
        freopen("triangle.in","r",stdin);
        freopen("triangle.out","w",stdout);
        fread(BuF,1,1<<26,stdin);
        for(read(t);t;--t){
            read(ax1);read(ay1);
            read(ax2);read(ay2);
            read(ax3);read(ay3);
            read(ax4);read(ay4);
            read(ax5);read(ay5);
            read(ax6);read(ay6);
            ld a1=dis(ax1,ay1,ax2,ay2),a2=dis(ax2,ay2,ax3,ay3),a3=dis(ax1,ay1,ax3,ay3),
                        b1=dis(ax4,ay4,ax5,ay5),b2=dis(ax5,ay5,ax6,ay6),b3=dis(ax4,ay4,ax6,ay6);
            printf(check(a1,b1,a2,b2,a3,b3)||
                   check(a1,b1,a2,b3,a3,b2)||
                   check(a1,b2,a2,b1,a3,b3)||
                   check(a1,b2,a2,b3,a3,b1)||
                   check(a1,b3,a2,b1,a3,b2)||
                   check(a1,b3,a2,b2,a3,b1)?"YES
    ":"NO
    ");
        }
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
    

    T2 sakura

    总之就是贪心。

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n,k,x,y,p;
    char BuF[1<<26],*InF=BuF;
    template<typename T>void read(T &x){
        for(;*InF<33;++InF);
        for(x=0;47<*InF&&*InF<58;x=(x<<3)+(x<<1)+(*InF++^48));
    }
    int main(){
        freopen("sakura.in","r",stdin);
        freopen("sakura.out","w",stdout);
        fread(BuF,1,1<<26,stdin);
        read(n);read(k);
        x=y=n-1;
        for(int i=0;i<k;++i){
            read(p);
            x=max(x+p-n,0);
            y=max(y-p+1,0);
            printf("%d %d
    ",x+1,n-y);
        }
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
    

    T3 number

    首先线性筛了个 (lambda) 函数,然后预处理最后一个 (Sigma) 里的东西,然后再暴力计算。

    然后发现最后一个 (Sigma) 里的东西不是1就是0,然后发现都是完全平方数,然后就没有然后了。

    据说可以数论分块做到 (O(n^frac{1}{3})) ,但不会。

    #include<cmath>
    #include<cstdio>
    #define mo 998244353
    using namespace std;
    long long n,ans;
    int main(){
        freopen("number.in","r",stdin);
        freopen("number.out","w",stdout);
        for(char c=getchar();32<c;n=(n<<3)+(n<<1)+(c^48),c=getchar());
        for(long long i=1;i*i<=n;++i){
            if((ans+=(n/(i*i))%mo)>=mo){
                ans-=mo;
            }
        }
        printf("%lld",ans);
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
    

    T4 sequence

    这个东西可以随便DP,设 (F_{i,j}) 为放完了前后 (i) 位,前后缀差 (j) 的方案数。

    故事本应到这里就结束了,但我奇数的情况只乘了 (n) ……

    #include<cstdio>
    #include<algorithm>
    #define mo 998244353
    using namespace std;
    int n;
    long long ans,f[110][10010]={1};
    int main(){
        freopen("sequence.in","r",stdin);
        freopen("sequence.out","w",stdout);
        for(char c=getchar();32<c;n=(n<<3)+(n<<1)+(c^48),c=getchar());
        for(register int i=1;i<=n>>1;++i){
            for(register int j=0;j<=(i-1)*n;++j){
                for(register int k=-min(j,n);k<=n;++k){
                    if((f[i][j+k]+=f[i-1][j]*(n-abs(k)+1)%mo)>=mo){
                        f[i][j+k]-=mo;
                    }
                }
            }
        }
        for(register int i=0;i<=n*n>>1;++i){
            if((ans+=f[n>>1][i])>=mo){
                ans-=mo;
            }
        }
        if(n&1){
            ans=ans*n%mo;        //555
            //ans=ans*(n+1)%mo;
        }
        printf("%lld",ans);
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
    
  • 相关阅读:
    Python课程回顾(day26)网络编程
    Python课程回顾(day27)
    Python课程回顾(day25)
    Python课程回顾(day24)
    Python课程回顾(day23)
    Python课程回顾(day22)
    Python课程回顾(day21)
    Python课程回顾(day20)
    Python课程回顾(day19)
    hive小tips(各种解析)
  • 原文地址:https://www.cnblogs.com/groundwater/p/14340651.html
Copyright © 2011-2022 走看看