我的隔天Codeforces——Round #371 (Div. 2)

明天网络赛青岛赛区,后天沈阳赛区。今天趁着有空把codeforces371撸掉,明后天以万全的状态去再试试比较正式一点的比赛。

A. Meeting of Old Friends

分析:签到题把,虽然我WA了两次。就是求两条线段的交集长度,中间的特判一下。唉,一开始没有想清楚,WA了两发,气死了。

int main(){
    //freopen("d:\\acm\\in.in","r",stdin);
    ll l1,r1,l2,r2,k;
    scanf("%lld %lld %lld %lld %lld",&l1,&r1,&l2,&r2,&k);
    if(l1>l2){
        swap(l1,l2);
        swap(r1,r2);
    }
    if(r1<l2)puts("0");
    else {
        ll ans=min(r1,r2)-l2+1;
        if(l2<=k&&k<=min(r1,r2))ans--;
        cout<<ans<<endl;
    }
    return 0;
}


B. Filya and Homework

分析:同签到题,这次WA了三发。很快看出来就是查有多少不同的数,三个以下yes,三个以上No,三个的时候要特判。因为选择加减的数必须是相同的,那么三个数必须满足等差数列才是yes。唉,一开始没有看清题目,结果以为三个就是yes,WA了三发,真TM亏。

int main(){
    //freopen("d:\\acm\\in.in","r",stdin);
    int ln;
    ll dat[10];
    scanf("%d",&ln);
    int cnt=0;
    while(ln--){
        ll a;
        scanf("%lld",&a);
        if(cnt==0)dat[cnt++]=a;
        else if(cnt>0){
            bool flag=false;
            for(int i=0;i<cnt;i++)
                if(a==dat[i]){
                    flag=true;
                    break;
                }
            if(!flag)dat[cnt++]=a;
            if(cnt>3)cnt=-1;
        }
    }
    if(cnt==3){
        sort(dat,dat+3);
        if(dat[0]+dat[2]==2*dat[1])puts("YES");
        else puts("NO");
    }
    else if(cnt>0)puts("YES");
    else puts("NO");
    return 0;
}


C. Sonya and Queries

分析:这题稍微有点意思,多说两句。

题意:+ a 代表在一个集合里+一个数, - a代表集合里减掉这个a, ? 010001代表集合里每个数字a从右往左跟那个01组成的串匹配,是1代表偶数,0代表奇数,如果其中一个短了,用0补齐,输出现在集合多少个匹配

做法:一开始以为是01字典树,想写但总觉得哪里不对劲,然后又想了想,发现这道题就是一道简单思维题。这道题具体的数字是没有意义的,真正有意义的是数字的每个位置的奇偶。而且因为匹配的时候是从右往左匹配的,前面没有的部分可以补零,那么从左边开始数到第一个奇数位之前,都是没有意义的。这样的话,不如考虑将10进制转换成2进制,每个10进制位是奇数就转化为1,是偶数就转化为0,得到一个2进制数,当然只有存储时是2进制,我们看到的是另一个10进制数。数字最大到 1018 ,转化后的数不会超过1000000,那么只要直接,开数组加减个数,输入即可!

int dat[maxn];
char str[20];
int cal(){
    int len=strlen(str);
    int ans=0;
    for(int i=0;i<len;i++)
        if((str[i]-'0')&1)ans=(ans*2+1);
        else ans=(ans*2);
    return ans;
}
int main(){
    //freopen("d:\\acm\\in.in","r",stdin);
    int n;
    scanf("%d",&n);
    char op[5];
    int a;
    while(n--){
        scanf("%s %s",op,str);
        a=cal();
        //cout<<a<<endl;
        if(op[0]=='+')dat[a]++;
        else if(op[0]=='-')dat[a]--;
        else printf("%d\n",dat[a]);
    }
    return 0;
}


D. Searching Rectangles

分析:看到这道题,我是懵逼的,完全没有懂是什么意思。后来听我的同学说了下,才有点明白。首先这是一道交互题,其实区域赛不会搞交互题,最后这种题基本只有老毛子会出,结论那我搞个屁啊!。



E. Sonya and Problem Wihtout a Legend

分析:看到这道题一点思路没有,然后就基本断定是DP题了,DP小白暂时就不看DP了把,真心连题解都看不懂。

给个dalao的博客:http://blog.csdn.net/miracle_ma/article/details/52537208

虽然这篇题解写得有点水哈,但是写粗来总是好的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值