2018 BUPT Winter Training #5 Div.2

12 篇文章 0 订阅
5 篇文章 0 订阅

A - 解方程

看着吓人,实则low得一比,就是求(a,b)到(c,d)的距离。

#include <cstdio>
#include <cmath>
using namespace std;
double dis(double x1,double y1,double x2,double y2){
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main(){
    double a,b,c,d;
    int t;
    for(scanf("%d",&t);t--;){
        scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
        printf("%.1lf\n",dis(a,b,c,d));
    }
}

B - Project Euler #1: Multiples of 3 and 5

简单容斥原理。_3+_5后_15会被重算一次,所以求出_3,_5,_15这道题就出来了。

#include <cstdio>
int main(){
    int n,t;long long _3,_5,_15;
    for(scanf("%d",&t);t--;){
        scanf("%d",&n);
        _3=(n-1)/3;
        _3=(_3+1)*_3/2;
        _5=(n-1)/5;
        _5=(_5+1)*_5/2;
        _15=(n-1)/15;
        _15=(_15+1)*_15/2;
        printf("%lld\n",_3*3+_5*5-_15*15);
    }
}

C - Laser

和上题一样,依然是判断重合部分,这道题就能过了。

#include <cstdio>
int main(){
    int t;long long a,b,c,d,box1,box2,tt,m,n;
    for(scanf("%d",&t);t--;){
        scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&a,&b,&c,&d);
        if(c<a)tt=c,c=a,a=tt;
        if(d<b)tt=b,b=d,d=tt;
        c=c-a+1;d=d-b+1;a=1;b=1;
        box1=(n-c+1)*(m-d+1);
        if(n-c+1-c+1<=0||m-d+1-d+1<=0)box2=0;
        else box2=(n-c+1-c+1)*(m-d+1-d+1);
        printf("%lld\n",(long long)n*m-box1*2+box2);
    }
}

D - Pride

DP水过去,开开心心…

#include <cstdio>
#include <algorithm>
using namespace std;
int gcd(int x,int y){
    int t;
    while(y){t=x%y;x=y;y=t;}
    return x;
}
int dp[2005][2005];
int main(){
    int n,flag,ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&dp[i][i]),ans+=(dp[i][i]!=1);
    for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)dp[i][j]=gcd(dp[i][j-1],dp[j][j]);
    for(int s=1;s<=n;s++){
        flag=0;
        for(int i=1,cur;(cur=i+s-1)<=n;i++){
            if(dp[i][cur]==1){
                if(s==1)printf("%d",ans);
                else printf("%d",n+s-2);
                return 0;
            }
        }
    }
    printf("-1");
}

E - Strange Counter

模拟,完全水题。

#include <cstdio>
#define beg 3
int main(){
    long long t,val;
    while(~scanf("%lld",&t)){
        val=beg;
        while(t>val)t-=val,val<<=1;
        printf("%lld\n",val-t+1);
    }
}

F - Simple Skewness

搞出差分后二分。

#include <cstdio>
#include <algorithm>
#define FF(_i,_l,_r) for(int _i=_l;_i<=(_r);_i++)
#define INTMAX 0x7fffffff
#define MAXN 200000
using namespace std;
typedef long long ll;
int n,ansi=1,len=0;
int A[MAXN+5];double S[MAXN+5];
inline double solve(int i,int cur){
    return (S[n]-S[n-cur]+S[i]-S[i-cur-1])/(2*cur+1);
}
int main() {
    scanf("%d",&n);
    FF(i,1,n)scanf("%d",&A[i]);
    sort(A+1,A+1+n);
    FF(i,1,n)S[i]=S[i-1]+A[i];
    int l,r,m,llen;
    double ans=-INTMAX,anss=0;
    FF(i,1,n){
        int l=1,r=min(i-1,n-i),llen=0;
        while(r>=l){
            m=(l+r)>>1;
            if(solve(i,m)>solve(i,m-1))llen=m,l=m+1;
            else r=m-1;
        }
        if((anss=solve(i,llen)-A[i])>ans)ans=anss,len=llen,ansi=i;
    }
    printf("%d\n",len*2+1);
    FF(i,ansi-len,ansi)printf("%d ",A[i]);
    FF(i,n-len+1,n)printf("%d ",A[i]);
}

G - Bash and a Tough Math Puzzle

线段树维护gcd。

#include <cstdio>
using namespace std;
const int N=500000;
int gcd(int a,int b){
    int r;
    while(b){r=a%b;a=b;b=r;}
    return a;
}
inline int readi(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int sgt[(N<<2)+5],n;
void bui(int pos,int l,int r){
    if(l==r)sgt[pos]=readi();
    else{
        int m=(l+r)>>1,lc=pos<<1;
        bui(lc,l,m);
        bui(lc|1,m+1,r);
        sgt[pos]=gcd(sgt[lc],sgt[lc|1]);
    }
}
int ans,tl,tr,a,v;
void upd(int pos,int l,int r){
    if(l==r&&r==a)sgt[pos]=v;
    else{
        int m=(l+r)>>1,lc=pos<<1;
        if(a>m)upd(lc|1,m+1,r);
        else upd(lc,l,m);
        sgt[pos]=gcd(sgt[lc],sgt[lc|1]);
    }
}
void qry(int pos,int l,int r){
    if(ans>1)return ;
    if(l==r)ans++;
    else{
        int m=(l+r)>>1,lc=pos<<1;
        if(m>=tl&&sgt[lc]%v)qry(lc,l,m);
        if(m<tr&&sgt[lc|1]%v)qry(lc|1,m+1,r);
    }
}
int main(){
    bui(1,1,n=readi());
    int Q,q;
    for(Q=readi();Q--;){
        q=readi();
        if(--q){
            a=readi();v=readi();
            upd(1,1,n);
        }
        else {
            ans=0;
            tl=readi();tr=readi();v=readi();
            qry(1,1,n);
            if(ans<=1)puts("YES");
            else puts("NO");
        }
    }
}

H - Masha and Cactus

仙人掌…完全不懂,还是磨练磨练再a这题吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值