2019牛客暑期多校训练营(第一场)

J Fraction Comparision 签到题 __int128
A Equivalent Prefixes 单调栈
B Integration 数学题,微积分
C Euclidean Distance 前缀和
F Random Point in Triangle概率+几何

A Equivalent Prefixes

#include<bits/stdc++.h>
using namespace std;
 
const int maxn = 1e5 + 10;
int a[maxn],b[maxn];
int dp1[maxn],dp2[maxn];
 
 
int main()
{
    int n;
    while(scanf("%d",&n) != EOF) {
        for(int i = 1; i <= n; ++i)  scanf("%d",&a[i]);
        for(int i = 1; i <= n; ++i)  scanf("%d",&b[i]);
//      for(int i = 1; i <= n; ++i)  printf("%d ",a[i]);
//      for(int i = 1; i <= n; ++i)  printf("%d ",b[i]);
//      cout << endl;
        dp1[1] = a[1],dp2[1] = b[1];
        int len1 = 1,len2 = 1;
        for(int i=2;i<=n;i++){
            if(a[i] >= dp1[len1]){
                dp1[++len1]=a[i];
            }
            else{
                int j=upper_bound(dp1+1,dp1+len1+1,a[i])-dp1;
//              dp1[j]=a[i];
//              if(a[i] < mmin1){
//                  mmin1 = a[i];
//                  len1 = 1;
//                  dp1[len1] = a[i];
//              }
                len1 = j;
                dp1[len1] = a[i];
            }
            if(b[i] >= dp2[len2]){
                dp2[++len2]=b[i];
            }
            else{
                int j=upper_bound(dp2+1,dp2+len2+1,b[i])-dp2;
//              dp2[j]=b[i];
//              if(b[i] < mmin2){
//                  mmin2 = b[i];
//                  len2 = 1;
//                  dp2[len2] = b[i];
//              }
                len2 = j;
                dp2[len2] = b[i];
            }
//          cout << len1 << "?" << len2 << "   ";
            if(len1 != len2){
                printf("%d\n",i - 1);
                break;
            }
        }
        if(len1 == len2)    printf("%d\n",n);
    }
    return 0;
}

B Integration

在这里插入图片描述

# include <bits/stdc++.h>
using namespace std;

//const double PI=atan(1)*4;
typedef long long LL;
const LL PI=3;
LL a[1100];
LL mod=1e9+7;
LL quick_pow(LL a,LL b)
{
	LL ret=1;
	while(b)
	{
		if(b&1) ret=ret*a%mod;
		a=a*a%mod;
		b=b/2;
	}
	return ret%mod;
}
int main()
{
	int n;
	while(~scanf("%d",&n)){
		LL ans1=1;
		LL sum=0;
		for(int i=1;i<=n;i++){
			scanf("%lld",&a[i]);
		}
		
		for(int i=1;i<=n;i++){
			LL ans2=1;
			for(int j=1;j<=n;j++){
				LL aa;
				if(j!=i){
					aa=a[j]*a[j]-a[i]*a[i];
					ans2=(ans2*(aa%mod+mod)%mod)%mod;
				}
			}
			LL ans=1;
			//cout<<"@@@"<<ans2<<endl;
			ans1=((2*a[i])%mod*ans2)%mod;
			ans=quick_pow(ans1,mod-2);
			ans=(1*ans)%mod;
			sum=(sum+ans)%mod; 
			//cout<<"@@@"<<ans1<<" "<<ans2<<endl;
		}
		printf("%lld\n",sum);
	}
	
	
	
	return 0;
}

C Euclidean Distance

尽可能一样的和是最小的我是看这位大大的,再怎么写也不可能比这位大大好,大家看这位大大的吧

# include <bits/stdc++.h>
using namespace std;

const int MAXN=1e4+100;
int a[MAXN];
typedef long long LL;
LL sum[MAXN];
int cmp(int a,int b)
{
	return a>b;
}
LL gcd(LL a,LL b)
{
	return b==0?a:gcd(b,a%b);
}
int main()
{
    int n,m;
	while(~scanf("%d %d",&n,&m)){
		int now=n;
		LL ansa,ansb;
		memset(sum,0,sizeof(sum));
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
		}
		sort(a+1,a+n+1,cmp);
		sum[0]=-m;
		for(int i=1;i<=n;i++){
			sum[i]=sum[i-1]+a[i];
		}
		for(int i=1;i<n;i++){
			if(sum[i]>a[i+1]*i){
				now=i;
				break;
			}
		}
		ansa=sum[now]*sum[now]*now;
		ansb=now*now;
		for(int i=now+1;i<=n;i++){
			ansa+=a[i]*a[i]*now*now;
		} 
		ansb=ansb*m*m;
		LL gd=gcd(ansa,ansb);
		ansa=ansa/gd;
		ansb=ansb/gd;
		//cout<<"@@@";
		if(ansb==1||ansa==0) printf("%lld\n",ansa);
		else printf("%lld/%lld\n",ansa,ansb);
	}
    
    return 0;
}

F Random Point in Triangle

在这里插入图片描述

# include <bits/stdc++.h>
using namespace std;

typedef long long LL; 
//给三角形的三个坐标点,求三角形的面积
LL area(LL x1,LL y1,LL x2,LL y2,LL x3,LL y3)
{
    LL sum=11*abs(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2);
    
    return sum;
}
int main()
{
	LL x1,y1,x2,y2,x3,y3;
	
	while(cin>>x1>>y1>>x2>>y2>>x3>>y3){
		cout<<area(x1,y1,x2,y2,x3,y3)<<endl;
	}
	
	return 0;
}

J Fraction Comparision

签到题,可以用__int128过,比较x * b和y * a即可

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(void){
    LL a,x,b,y;
    while(~scanf("%lld %lld %lld %lld",&x,&a,&y,&b)){
        __int128 aa=x; aa=aa*b;
        __int128 bb=y; bb=bb*a;
         
        if(aa>bb){
            printf(">\n");
        }else if(aa==bb){
            printf("=\n");
        }else{
            printf("<\n");
        }  
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值