慕容琳的后花园
慕容琳的后花园
游记#2019杭师大ACM

吐槽

奇特的A题速度,第1个小时A了4道,之后花2个小时A了1道,然后就没有了(:з」∠)
莫名其妙的被拍了很多照片,好烦啊(•́へ•́╬)
这里就放一下我之前A掉的和之后订正出来的题吧╮(╯▽╰)╭

T1-Little Sub and Applese

读入字符串,把末尾的句号改成逗号。注意多组数据。

解法

标准签到题,不说了qwq

ac代码

#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
char s[1000000];
int main()
{
    while(gets(s))
    {
        if(s[strlen(s)-1]=='.')s[strlen(s)-1]='!';
        printf("%s\n",s);
    }
    return 0;
}

T2-Little Sub and Balloons

问数列里有多少个不同的数字

解法

解法有很多,因为n很小,就100
所以压进map,丢进set,要是愿意,写个hash也可以,都能过

ac代码

#include<cstring>
#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
int n,x,res;
map<int,int>mp;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if(!mp[x])res++;
        mp[x]=1;
    }
    printf("%d",res);
    return 0;
}

T3-Little Sub and Apples

n个苹果,吃k天,每天吃min(t,rest)个苹果。

解法

这也是标准的签到题,式子就是max(0,n-k*t),注意要开long long

ac代码

#include<cstring>
#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
long long n,k,t;
int main()
{
    scanf("%lld%lld%lld",&n,&k,&t);
    printf("%lld",max(1ll*0,n-k*t));
    return 0;
}

T4-Little Sub and Triples

问区间里有没有三个数能组成三角形的边长

解法

这道题考试的时候想不出来,n和q都有20w,结果正解是暴力???
最暴力的就是每个区间排序后判断相邻的3个能否组成三角形
怎么优化呢,想一下,要构造一个不符合的区间,那就是一个斐波那契数列,到50多项就爆int了,所以如果区间长度大于60,肯定是可行的,对于60以下的,排序暴枚就好了

ac代码

#include<cstring>
#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int n,q,l,r;
long long a[200010],s[100];
int main()
{
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    for(int i=1;i<=q;i++)
    {
        scanf("%d%d",&l,&r);
        if(l<1||r>n||(r-l+1)<3)
        {
            puts("NO");
            continue;
        }
        if(r-l+1>60)
        {
            puts("YES");
            continue;
        }
        for(int i=1;i<=(r-l+1);i++)
            s[i]=a[i+l-1];
        sort(s+1,s+1+r-l+1);
        int flg=1;
        for(int i=3;i<=(r-l+1);i++)
        {
            if(1ll*s[i-2]+1ll*s[i-1]>1ll*s[i])
            {
                flg=0;
                break;
            }
        }
        if(flg)puts("NO");
        else puts("YES");
    }
    return 0;
}

T5-Little Sub and Enigma

26个小写字母有一组双射,求从读入的数据中能观察或推导出的关系。

解法

这道题很坑啊,一共有3条规则,前2条很容易推出来,就是不能一对多或者多对一,那推导是什么意思呢
如果推出了25组关系,那么第26组关系也随之确定emmm考场上智商不在线

ac代码

#include<cstring>
#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
char sa[1000010],sb[1000010];
int a[30],b[30],res,s;
int main()
{
    gets(sa);
    gets(sb);
    int l=strlen(sa);
    for(int i=0;i<l;i++)
    {
        int x=sa[i]-'a'+1;
        int y=sb[i]-'a'+1;
        if(a[x]!=y&&a[x]!=0)
        {
            puts("Impossible");
            return 0;
        }
        if(b[y]!=x&&b[y]!=0)
        {
            puts("Impossible");
            return 0;
        }
        a[x]=y;
        b[y]=x;
    }
    for(int i=1;i<=26;i++)
    {
        if(a[i])res++;
        if(!b[i])s=i;
    }
    for(int i=1;i<=26;i++)
    {
        if(a[i])printf("%c->%c\n",i+'a'-1,a[i]+'a'-1);
        else if(res==25)printf("%c->%c\n",i+'a'-1,s+'a'-1);
    }
    return 0;
}

T6-Little Sub and Counting

问对每个x问x^y>y^x的y个数。

解法

题目的意思也就是给定一个序列,求对于每一个x而言满足上述条件的y有多少个,我们可以找规律
发现x=1时一定是0,x=2时是大于4的数的个数,x=3时是2的个数和大于3的数的个数
x为别的数时答案就是大于x的数的个数,这样就很好做了

ac代码

#include<cstring>
#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
struct p
{
    int x,id;
}a[100010];
int n,ans[100010],cnt;
map<int,int>mp;
bool cmp(p xx,p yy)
{
    return xx.x<yy.x;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].x);
        a[i].id=i;
        mp[a[i].x]++;
    }
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        if(a[i].x==1)ans[a[i].id]=0;
        else if(a[i].x!=a[i-1].x)cnt+=mp[a[i].x],ans[a[i].id]=n-cnt;
        else ans[a[i].id]=ans[a[i-1].id];

    }
    for(int i=1;i<=n;i++)
        if(a[i].x==2)ans[a[i].id]-=mp[3]+mp[4];
        else if(a[i].x==3)ans[a[i].id]+=mp[2];
    for(int i=1;i<=n;i++)printf("%d ",ans[i]);
    return 0;
}

T7-Little Sub and Triangles

问面积为[l,r]的三角形个数

解法

题意就是给定一堆点,然后可以组成很多三角形,对于每个区间[l,r]询问面积在区间内三角形的个数
对于在同一条直线上的点,算一个面积为0的三角形
这道题可以预处理出所有的面积,排个序,二分就好了,唯一的坑是计算面积时的精度损失
由于都是整点,所以能证明出面积的最小分度是0.5,所以二分时加一个0.01就可以了

ac代码

#include<cstring>
#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
using namespace std;
int n,q,cnt;
double x[300],y[300],s[4000000],l,r;
double f(int a,int b)
{
    return sqrt(abs(x[a]-x[b])*abs(x[a]-x[b])+abs(y[a]-y[b])*abs(y[a]-y[b]));
}
int main()
{
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)
        scanf("%lf%lf",&x[i],&y[i]);
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            for(int k=j+1;k<=n;k++)
            {
                double a=f(i,j),b=f(i,k),c=f(j,k);
                s[++cnt]=sqrt(abs(a+b+c)/2.0)*sqrt(abs(a+b-c)/2.0)*sqrt(abs(a-b+c)/2.0)*sqrt(abs(-a+b+c)/2.0);
            }
    sort(s+1,s+1+cnt);
    for(int i=1;i<=q;i++)
    {
        scanf("%lf%lf",&l,&r);
        int ll=lower_bound(s+1,s+1+cnt,l-0.01)-s,rr=upper_bound(s+1,s+1+cnt,r+0.01)-s;
        printf("%d\n",rr-ll);
    }
    return 0;
}
赞赏
https://secure.gravatar.com/avatar/8cbc0c58deea66b18e9a96cd4bdd6eea?s=256&d=monsterid&r=g

慕容琳

文章作者

发表评论

textsms
account_circle
email

慕容琳的后花园

游记#2019杭师大ACM
吐槽 奇特的A题速度,第1个小时A了4道,之后花2个小时A了1道,然后就没有了(:з」∠) 莫名其妙的被拍了很多照片,好烦啊(•́へ•́╬) 这里就放一下我之前A掉的和之后订正出来的题吧╮(╯▽╰)╭ T…
扫描二维码继续阅读
2019-05-06
功能