当前位置: 首页 > news >正文

2019 ICPC 徐州区域赛 - A Cat(异或性质)

题目链接


题目大意

[ 1 , 1 0 18 [1,10^{18} [1,1018个物品每个物品的价值为 i i i,给出一个区间 [ L , R ] [L,R] [L,R]的物品,只能买连续的东西其总价值为这几个连续的物品价值异或结果,问 S S S最多能买多少物品。

解题思路

关于本题最重要的结论是:每个偶数和与它相邻且大于它的那个奇数异或之后结果一定为1。此外还需要知道异或运算具有交换律和结合律,任何数和它本身异或之后为 0 0 0,任何数和 0 0 0异或值不变。

然后这道题就差不多是模拟了,当区间长度超过 4 4 4之后一定能把 4 k 4k 4k的数异或成 0 0 0。然后就是分情况考虑,区间长度小于 4 4 4直接暴力,大于四了,按左区间和右区间奇偶性分四个情况讨论。(写的代码略啰嗦)需要注意的地方是位运算的优先性比四则运算甚至比较运算符都低,防止错误的话在每次位运算时加上括号。

代码:

#include <iostream>

using namespace std;
typedef long long ll;
ll solve(ll l,ll r,ll s){
    ll p=r-l+1;
    if(p<5){
        if(p==1){
            if(l<=s) return 1;
            else return 0;
        }else if(p==2){
            if( (l^r)<=s) return 2;
            else if(l<=s) return 1;
            else return 0;
        }else if(p==3){
            ll t=l^(l+1)^r;
            if(t<=s) return 3;
            else if( (l^(l+1))<=s || (r^(l+1))<=s) return 2;
            else if(l<=s) return 1;
            else return 0;
        }else if(p==4){
            ll t=l^(l+1)^(l+2)^r;
            if(t<=s) return 4;
            else if( (t^r)<=s || (t^l)<=s) return 3;
            else if( (l^(l+1))<=s || ((l+1)^(l+2))<=s || ((l+2)^r)<=s) return 2;
            else if(l<=s) return 1;
            else return 0;
        }
    }else{
        ll d=p/4;
        if( (l&1) && !(r&1)){
            if(p%4){
                ll q=4*d;
                if( (l^r)<=s) return q+2;
                else if(l<=s) return q+1;
                else return q;
            }else{
                d--; ///这个有可能会漏
                ll q=4*d;
                if( (l^1^r)<=s) return q+4;
                else if( (l^1)<=s || (1^r)<=s) return q+3;
                else if(1<=s) return q+2;
                else if(l<=s) return q+1;
                else return q;
            }
        }else if( (l&1) && (r&1) ){
            ll t=p%4;
            ll q=4*d;
            if(t==1){
                if(l<=s) return q+1;
                else return q;
            }else if(t==3){
                if((l^1)<=s) return q+3;
                if(1<=s) return q+2;
                else if(l<=s) return q+1;
                else return q;
            }
        }else if( !(l&1) && (r&1) ){
            ll t=p%4;
            ll q=4*d;
            if(t){
                if(1<=s) return q+2;
                else return q;
            }else{
                return q;
            }
        }else if( !(l&1) && !(r&1) ){
            ll t=p%4;
            ll q=4*d;
            if(t==1){
                if(r<=s) return q+1;
                else return q;
            }else if(t==3){
                if((1^r)<=s) return q+3;
                else if(1<=s) return q+2;
                else return q;
            }
        }
    }
}
int main(){
    ll T,l,r,s;
    scanf("%lld",&T);
    while(T--){
        scanf("%lld%lld%lld",&l,&r,&s);
        ll ans=solve(l,r,s);
        if(!ans) printf("-1\n");
        else printf("%lld\n",ans);
    }
    return 0;
}

相关文章:

  • 2019 ICPC 南昌区域赛 - C And and Pair(思维+组合数学)
  • Android开发指南-框架主题-清单文件
  • 2019 ICPC 南昌区域赛 - G Eating Plan(技巧+暴力)
  • 离职的日子
  • 2019 ICPC 南京区域赛 - A A Hard Problem(找规律)
  • 走向架构师之路---开博寄语
  • JavaWeb拦截器拦截了静态资源的解决办法
  • 职业方向的选择
  • 2019 ICPC 南京区域赛 - H Prince and Princess(博弈+思维)
  • M2M----物联网的未来值得期待
  • 2019 ICPC 徐州区域赛 - E Multiply(Pollard-Rho质因数分解)
  • 备战3G —OMA 协议简介及公共文档下载
  • 2019 ICPC 银川区域赛 - B So Easy(思维)
  • 我的技术博客索引
  • 2019 ICPC 徐州区域赛 - F The Answer to the Ultimate Question of Life, The Universe, and Everything.(打表)
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Create React App 使用
  • git 常用命令
  • Git 使用集
  • interface和setter,getter
  • Java程序员幽默爆笑锦集
  • Java方法详解
  • Js基础——数据类型之Null和Undefined
  • Next.js之基础概念(二)
  • php ci框架整合银盛支付
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • supervisor 永不挂掉的进程 安装以及使用
  • windows-nginx-https-本地配置
  • 成为一名优秀的Developer的书单
  • 订阅Forge Viewer所有的事件
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 入门到放弃node系列之Hello Word篇
  • 收藏好这篇,别再只说“数据劫持”了
  • 问题之ssh中Host key verification failed的解决
  • 系统认识JavaScript正则表达式
  • 线性表及其算法(java实现)
  • 小试R空间处理新库sf
  • 用quicker-worker.js轻松跑一个大数据遍历
  • # Apache SeaTunnel 究竟是什么?
  • ###C语言程序设计-----C语言学习(3)#
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (007)XHTML文档之标题——h1~h6
  • (八十八)VFL语言初步 - 实现布局
  • (原創) 未来三学期想要修的课 (日記)
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net 使用ajax控件后如何调用前端脚本
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET连接数据库方式
  • .NET命名规范和开发约定
  • .Net下的签名与混淆