1. 程式人生 > >Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1)

Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1)

比賽傳送門

A題.水題

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    bool flag=false;
    while(t--)
    {
        int n;
        scanf("%d",&n);
        if(n) flag=true;
    }
    if(flag) cout<<"hard"<<endl;
    else cout<<"easy"<<endl;
    return 0;
}

B題.判斷點是否在一個矩形內

#include <bits/stdc++.h>
using namespace std;
const double eps=1e-8;
struct line{
double lv,jue;
};
struct CPoint
{
    double x,y;
}point[103];
int dcmp(double x)
{
    if(x<-eps) return -1;
    else   return (x>eps);
}
double cross(CPoint p0,CPoint p1,CPoint p2)
{
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
double dot(CPoint p0,CPoint p1,CPoint p2)
{
    return (p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);
}
int PointOnSegment(CPoint p0,CPoint p1,CPoint p2)
{
    return dcmp(cross(p0,p1,p2))==0&&dcmp(dot(p0,p1,p2))<=0;
}
int PointInPolygon(CPoint cp,CPoint p[],int n)
{
    int i,k,d1,d2,wn=0;
  //  double sum=0;
    p[n]=p[0];
    for( i=0;i<n;i++)
    {
        if(PointOnSegment(cp,p[i],p[i+1])) return 2;
        k=dcmp(cross(p[i],p[i+1],cp));
        d1=dcmp(p[i+0].y-cp.y);
        d2=dcmp(p[i+1].y-cp.y);
        if(k>0&&d1<=0&&d2>0)wn++;
        if(k<0&&d2<=0&&d1>0)wn--;
    }
    return wn!=0;
}
int main()
{
    int n,n1,d;
    n1=4;
    while(cin>>n>>d)
    {
        point[0].x=0,point[0].y=d;
        point[1].x=d,point[1].y=0;
        point[2].x=n,point[2].y=n-d;
        point[3].x=n-d,point[3].y=n;
        int m;
        cin>>m;
        CPoint temp;
        line a1,a2,a3,a4;
        a1.lv=((double)point[1].y-point[0].y)/(point[1].x-point[0].x),a1.jue=(double)point[0].y-a1.lv*point[0].x;
        a2.lv=((double)point[0].y-point[3].y)/(point[0].x-point[3].x),a2.jue=(double)point[0].y-a2.lv*point[0].x;
        a3.lv=((double)point[1].y-point[2].y)/(point[1].x-point[2].x),a3.jue=(double)point[1].y-a3.lv*point[1].x;
        a4.lv=((double)point[2].y-point[3].y)/(point[2].x-point[3].x),a4.jue=(double)point[2].y-a1.lv*point[2].x;
        for(int j=1;j<=m;j++)
        {
            cin>>temp.x>>temp.y;
            if(PointInPolygon(temp,point,n1)==1||fabs(a1.lv*temp.x+a1.jue-temp.y)<=eps||fabs(a2.lv*temp.x+a2.jue-temp.y)<=eps||fabs(a3.lv*temp.x+a3.jue-temp.y)<=eps||fabs(a4.lv*temp.x+a4.jue-temp.y)<=eps)
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
        }
    }
    return 0;
}

C題.字首和+尺取

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000+5;
bool p[maxn];
char s[maxn];
void is_prime()
{
    memset(p,true,sizeof(p));
    p[0]=p[1]=false;
    for(int i=2;i*i<=maxn;i++)
    {
        if(p[i]) {
            for(int j=i*i;j<=maxn;j+=i)
                p[j]=false;
        }
    }
}
int main()
{
    is_prime();
    int n;
    scanf("%d",&n);
    scanf("%s",s);
    int a[maxn],sum=0,z=-1;
    for(int i=0;i<n;i++)
    {
        a[i]=s[i]-'0';
        sum+=a[i];
        z=max(z,a[i]);
    }
        bool flag=false;
        int sum1[maxn];
        memset(sum1,0,sizeof(sum1));
        sum1[0]=a[0];
        for(int i=1;i<n;i++)
        {
            sum1[i]=sum1[i-1]+a[i];
        }
    //cout<<z<<endl;
    if(sum==0||(p[sum]&&z==1)) {
        cout<<"yes";
        return 0;
    }
        for(int i=z;i<sum;i++)
        {
            if(flag) break;
            if(sum%i==0) {
                //以i作為一段和
                int last=-1;
                for(int j=0;j<n;j++)
                {
                    if(last==-1) {
                        if(sum1[j]==i) {
                            last=j;
                        }
                    }
                    else {
                        if(sum1[j]-sum1[last]==i||sum1[j]==sum1[last]) {
                            last=j;
                        }
                    }
                }
                if(last==n-1&&i!=sum) flag=true;
            }
        }
        if(flag) cout<<"yes";
        else cout<<"no";
    return 0;
}

D題.計算幾何+暴力

//全部以直角三角形來畫
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
    LL n,m,k,solve;
    scanf("%lld%lld%lld",&n,&m,&k);
    solve=(LL)n*m*2;
    if(solve%k==0) {
        //a*b==solve 尋找一組a b滿足條件 a<=n b<=m
        LL a,b;
        bool flag=false;
        //對k進行找因子的過程
        if(k&1) {
                //k為奇數時
                LL k1,k2,k3,k4;
                for(int i=1;i*i<=k;i++)
                {
                    if(flag) break;
                    if(k%i==0) {
                        k1=i;
                        k2=k/i;
                        if(((LL)2*n%k1==0&&(LL)m%k2==0)||((LL)2*n%k2==0&&(LL)m%k1==0)) {
                            if((LL)2*n%k1==0&&(LL)m%k2==0) {
                                k3=(LL)2*n/k1;
                                k4=(LL)m/k2;
                                if((k3<=n&&k4<=m)||(k4<=n&&k3<=m)) {
                                    a=k3;
                                    b=k4;
                                    if(k4<=n&&k3<=m) {
                                        swap(a,b);
                                    }
                                    flag=true;
                                }
                            }
                            else {
                                if((LL)2*n%k2==0&&(LL)m%k1==0) {
                                    k3=(LL)2*n/k2;
                                    k4=(LL)m/k1;
                                    if((k3<=n&&k4<=m)||(k4<=n&&k3<=m)) {
                                        a=k3;
                                        b=k4;
                                        if(k4<=n&&k3<=m) swap(a,b);
                                        flag=true;
                                    }
                                }
                            }
                        }
                        if(((LL)2*m%k1==0&&(LL)n%k2==0)||((LL)2*m%k2==0&&(LL)n%k1==0)) {
                            if((LL)2*m%k1==0&&(LL)n%k2==0) {
                                k3=(LL)n/k2;
                                k4=(LL)2*m/k1;
                                if((k3<=n&&k4<=m)||(k4<=n&&k3<=m)) {
                                    a=k3;
                                    b=k4;
                                    if(k4<=n&&k3<=m) {
                                        swap(a,b);
                                    }
                                    flag=true;
                                }
                            }
                            else {
                                if((LL)2*m%k2==0&&(LL)n%k1==0) {
                                    k3=(LL)n/k1;
                                    k4=(LL)2*m/k2;
                                    if((k3<=n&&k4<=m)||(k4<=n&&k3<=m)) {
                                        a=k3;
                                        b=k4;
                                        if(k4<=n&&k3<=m) swap(a,b);
                                        flag=true;
                                    }
                                }
                            }
                        }
                    }
                }
        }
        else {
            k>>=1;
            LL k1,k2;
            for(int i=1;i*i<=k;i++)
            {
                if(flag) break;
                if(k%i==0) {
                    k1=i;
                    k2=k/i;
                    if((n%k1==0&&m%k2==0)||(n%k2==0&&m%k1==0)) {
                        flag=true;
                        if(n%k1==0&&m%k2==0) {
                            a=(LL)n/k1;
                            b=(LL)m/k2;
                        }
                        else if(n%k2==0&&m%k1==0) {
                            a=(LL)n/k2;
                            b=(LL)m/k1;
                        }
                    }
                }
            }
        }
       //cout<<b<<endl;
        if(flag) {
            cout<<"yes"<<endl;
            printf("0 0\n%lld 0\n0 %lld\n",a,b);
        }
        else cout<<"no"<<endl;
    }
    else cout<<"no"<<endl;
    return 0;
}