トピック:https://www.luogu.org/problemnew/show/P2114
問題の意味:それぞれが可能AND、OR、XORの数も、操作がnです。
初期値が0〜Mの間の数であり、最大値はQ、N、演算後、どのくらいを得ることができる経過しました。
アイデア:
この数は、0が1であるビットではありませんので、我々は操作1を行うための整数と整数nは0を使用することができます。次いで、この数を決定するために、各ビットは、リスト上の0又は1であるべきです。
ハイからローへの貪欲な始まり。0と1がより貪欲な選択のように比較的少数の後にあるため、選挙の1、その後、0を得ることができる場合。
1つの単語だけが、この数はメートルを超えないときに表示するために1対1を得ることができる場合。いいえ、これに複数の回答が1になることはできません。
1 // の#include <ビット/ STDC ++> 2の#include <stdio.hの> 3の#include <iostreamの> 4の#include <アルゴリズム> 5の#include <CStringの> 6の#include <STDLIB.H> 7の#include <キュー> 8の#include <地図> 9の#include <スタック> 10の#include < 設定 > 11 12 // の#define LL __int128 13 の#define ULLのunsigned long長い 14 の#define INF 0x7f7f7f7f 15 16のtypedef 長い 長LL。 17 使って 名前空間はstd; 18 19 のint N、M。 20 21 22 のint main()の 23 { 24 のscanf(" %D%dの"、&N、&M)。 25 INT allone = 0x7FFFFFFFで、allzero = 0 。 26 のために(int型 I = 0 ; iがN <; Iは++ ){ 27 チャー OP [ 10 ]。 28 int型のT; 29 GETCHAR()。 30 のscanf(" %sの%D"OP& T)、 31 であれば(のstrcmp(OP、" AND ")== 0 ){ 32 allone&= T; 33 allzero&= T; 34 } 35 そう であれば(のstrcmp(OP、" OR 」) == 0 ){ 36 allone | = T; 37 allzero | = T; 38 } 39 他{ 40 allone ^ = T; 41 allzero ^ = T; 42 } 43 } 44 INT ANS = 0、T = 0 。 45 のためには、(int型私は= 30、I> = 0 ; i-- ){ 46 であれば(allzero&(1 << I)){ 47の ANS | =(1つの << I)。 48 } 49 そう であれば(allone&(1 << I)&& M> =(T |(1 << I))){ 50の ANS | =(1 << I)。 51 T | =(1 << I)。 52 } 53 } 54 のprintf(" %d個の\ n " 、ANS)。 55 リターン 0 ; 56 }