Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1)
阿新 • • 發佈:2018-12-11
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;
}