首页 > 其他分享 >D. Birthday Gift

D. Birthday Gift

时间:2024-03-27 21:46:44浏览次数:18  
标签:code 01 Gift ll al long Birthday occur

原题链接

题解

1.异或是01变1,11变0,或是01变1,11变1,所以或的越多(即分的组越多),结果越大
2.我们令x=x+1,这样小于等于x的 问题就变成了小于x 的问题,这里我们采用逼近答案的方法。
3.对于某一位而言,如果有奇数个元素在这一位上是1,那么不管怎么分,最后的结果肯定是1,如果是偶数,那么最后的结果可能是0也可能是1,取决于分法
因为要让分的组尽可能多的情况下,最后异或的结果尽可能小,所以我们从高到低遍历,如果遇到含有偶数个1,采用把他变成0的分法,即贪心的两两配对,replace the subsegment [l,r] with al⊕al+1⊕…⊕ar

4.再就是分情况讨论,请看code

code

#define ll long long
#include<bits/stdc++.h>
using namespace std;
void solve()
{
    ll n,x;
    cin>>n>>x;
    x++;//将问题从小于等于变成小于
    vector<ll> a(n);
    for(auto &it:a) cin>>it;

    ll ans=-1;
    for(ll k=30;k>=0;k--)
    {
        vector<ll> b;
        ll occur=0;//occur代表这一位有一的数出现的个数
        for(ll i=0;i<a.size();i++)
        {
            if(occur%2==1) b.back()^=a[i];
            else b.push_back(a[i]);
            if((1LL<<k)&a[i]) occur++;
        }


        if(!(x&(1LL<<k)))//如果这个位x没有
        {
            if(occur%2==1)//但是我有
            {
                cout<<ans<<endl<<endl;//不管怎么分,异或的值肯定大于x,不用再分了,把曾经试过的正确的答案提交了
                return ;
            }
            else a=b;//我也没有,为了消除这个位的一,分法是唯一的
        }
        else
        {
            if(occur%2==0) ans=max(ans,(ll)b.size());//必须小于,逼近答案
            //如果这一位我也有,那么往下一位搜索,因为这时答案不取决于我了
        }
    }

    cout<<ans<<endl<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    ll t;
    cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

标签:code,01,Gift,ll,al,long,Birthday,occur
From: https://www.cnblogs.com/pure4knowledge/p/18100308

相关文章

  • Birthday Gift
    我们将\(x++\),从而最终的答案一定是要小于\(x\)的,也就一定要有一位不同我们从高位到低位枚举最高的一位与\(x\)不同的位置\(i\)(也就是说,认为第\(i+1\)位到最高位都与\(x\)相同,但第\(i\)位不同)我们先考虑更高位置如何相同如果更高位置为\(0\),那么那一位必须只能有偶数个\(1\)(否......
  • 中考英语首字母快速突破007-2021上海金山英语二模-A Candlelit Birthday Dinner Durin
    PDF格式公众号回复关键字:ZKSZM007原文​Onmyfather’sbirthday,myparentsandIwentoutfordinner.Therestaurantwasbrightlylitandverynoisy,withlotsofdiners.Waitersmoveb(71)betweenthetables.​Wehadjustorderedourmeal......
  • E. Anna and the Valentine's Day Gift
    原题链接题解游戏规则总结一句话:安娜要尽可能删掉后导零(翻转),萨沙要尽可能保护后导零(连接),问剩余数字的位数能否达到\(m+1\)位直接模拟即可,统计每个数后导零的长度,然后按照安娜先手的规则求出能保留多少位后导零,最后判断长度code#include<bits/stdc++.h>usingnamespaces......
  • P4090 [USACO17DEC] Greedy Gift Takers P
    原题链接题解1.如果前\(7\)头牛能全部能拿到礼物,但是这前\(7\)头牛里有\(4\)头牛更新在前\(4\)的位置,请问第\(8\)头牛能否得到礼物?答案是不行,因为前\(4\)头牛会在前\(4\)的位置形成循环2.假如恰好第\(x\)头牛没有礼物,那么牛\(x\)之后的牛都得不到礼物,因为不......
  • [USACO17DEC] Greedy Gift Takers
    原题链接首先这道题的数据量1e5那么时间复杂度要保持在O(nlogn)内。先判断单调性,若k头牛拿不到礼物,那么k-1头牛也拿不到礼物,所有这题可以用二分法来做(11110000)。二分部分省略,我们直接来分析check部分(如下)。boolcheck(intk){for(inti=1;i<=n-k+1;i++)b[i]=a[i];s......
  • 初中英语优秀范文100篇-024The Best Gift I've Ever Received -我收到的最好的礼物
    PDF格式公众号回复关键字:SHCZFW024记忆树1AmongallthegiftsIhavereceived,thehand-madescarffromJudyisthebestgiftI'veeverreceived.翻译在我收到的所有礼物中,Judy亲手制作的围巾是我收到的最好的礼物简化记忆围巾句子结构这个句子是一个简单句......
  • As a project I always want to create for myself as a gift, the MVVM framework is
    IusedtowanttobuildaMVVMprojectformyself,especiallysinceIwrotemymementowriterprojectwhichisnojQuery,andthatwasverytimeconsumingandtiringtocreate.Lastyear,Ihadsomeinspiration,andreallywantedtotrytostartfreshthin......
  • CF248E Piglet's Birthday
    提前了一个月,就做掉了这题,不过还是庆祝一下吧。(考虑dp。令\(f_{u,i}\)表示货架\(u\)还剩\(i\)罐未被吃的蜂蜜的概率。答案就是\(\sumf_{u,0}\)。考虑一次修改\(u\tov\),由于被移动的蜜罐都被吃了,所以\(v\)的\(f\)数组不变,只需要考虑\(f_u\)的变化。枚举吃掉了......
  • QOJ # 5573. Holiday Regifting
    题面传送门感觉有点奇妙。首先一个基础的想法就是一个一个往下推,维护每个数往下推的次数,统计当前数在前面的所有数一次归零后会加几次,然后计算这个数需要前面几轮归零,这样将这些系数乘起来就是需要归零的次数了。但是现在有一个问题就是前面每个数往下推的次数可能很大,这东西存......
  • B. Buying gifts[贪心]
    Problem-1801B-Codeforces题意是需要给两个人买礼物,有n个商店,每个商店只能给一个人买,而且每个商店给两个人买的礼物的价钱也可能不同,问给两人买的礼物的最大价格之差最小是多少。我们考虑这种情况。如果当前给b买的礼物最大值为x,那么那些商店里给b礼物价格小于等于x的我们......