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;
}
原文地址:https://www.cnblogs.com/groundwater/p/14340651.html