码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 3668 [NOI2014]起床困难综合症

时间:2018-05-02 20:52:52      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:bsp   for   div   pre   ==   \n   二进制   noi2014   之间   

题意:有一些位运算操作,找出一个小于m的整数使其经过这些操作后得到的数最大.

对于这个整数的每一位之间运算互不影响,所以我们从高位到地位贪心填二进制数,使其这一位能得到1

#include<cstdio>
using namespace std;
const int N=1e5+5;
int n,m;
int op[N],w[N];
char s[233];
int calc(int x)
{
  for(int i=1;i<=n;i++)
    {
      if(op[i]==1) x&=w[i];
      if(op[i]==2) x|=w[i];
      if(op[i]==3) x^=w[i];
    }
  return x;
}
int main()
{
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++)
    {
      scanf("%s",s);
      if(s[0]==A) op[i]=1;
      else if(s[0]==O) op[i]=2;
      else op[i]=3;
      scanf("%d",&w[i]);
    }
  int u=1,qaq=calc(0);
  for(;u<=m;u<<=1);
  u>>=1;
  int ans=0;
  for(;u;u>>=1)
    {
      if(qaq&u) continue;
      if(ans+u>m) continue;
      if(u&calc(u))ans+=u;
    }
  printf("%d\n",calc(ans));
  return 0;
}

 

BZOJ 3668 [NOI2014]起床困难综合症

标签:bsp   for   div   pre   ==   \n   二进制   noi2014   之间   

原文地址:https://www.cnblogs.com/pigba/p/8981981.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!