[NOI 2014]起床困難綜合癥
Description
21 世紀,許多人得了一種奇怪的病:起床困難綜合癥,其臨床表現為:起床難,起床後精神不佳。作為一名青春陽光好少年,atm 一直堅持與起床困難綜合癥作鬥爭。通過研究相關文獻,他找到了該病的發病原因:在深邃的太平洋海底中,出現了一條名為 drd 的巨龍,它掌握著睡眠之精髓,能隨意延長大家的睡眠時間。正是由於 drd 的活動,起床困難綜合癥愈演愈烈,以驚人的速度在世界上傳播。為了徹底消滅這種病,atm 決定前往海底,消滅這條惡龍。歷經千辛萬苦,atm 終於來到了 drd 所在的地方,準備與其展開艱苦卓絕的戰鬥。drd 有著十分特殊的技能,他的防禦戰線能夠使用一定的運算來改變他受到的傷害。具體說來,drd 的防禦戰線由 n
Input
第1行包含2個整數,依次為n,m,表示drd有n扇防禦門,atm的初始攻擊力為0到m之間的整數。接下來n行,依次表示每一扇防禦門。每行包括一個字符串op和一個非負整數t,兩者由一個空格隔開,且op在前,t在後,op表示該防禦門所對應的操作, t表示對應的參數。n<=10^5
Output
一行一個整數,表示atm的一次攻擊最多使 drd 受到多少傷害。
Sample Input
3 10AND 5
OR 6
XOR 7
Sample Output
1HINT
【樣例說明1】 atm可以選擇的初始攻擊力為0,1,...,10。 假設初始攻擊力為4,最終攻擊力經過了如下計算 4 AND 5 = 4 4 OR 6 = 6 6 XOR 7 = 1 類似的,我們可以計算出初始攻擊力為1,3,5,7,9時最終攻擊力為0,初始攻擊力為0,2,4,6,8,10時最終攻擊力為1,因此atm的一次攻擊最多使 drd 受到的傷害值為1。題解
預處理出真值表,按位貪心。
1 //It is made by Awson on 2018.1.26 2 #include <set> 3 #include <map> 4 #include <cmath> 5 #include <ctime> 6 #include <queue> 7 #include <stack> 8 #include <cstdio> 9 #include <string> 10 #include <vector> 11 #include <cstdlib> 12 #include <cstring> 13 #include <iostream> 14 #include <algorithm> 15 #define LL long long 16 #define RE register 17 #define lowbit(x) ((x)&(-(x))) 18 #define Max(a, b) ((a) > (b) ? (a) : (b)) 19 #define Min(a, b) ((a) < (b) ? (a) : (b)) 20 #define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b)) 21 using namespace std; 22 const int INF = ~0u>>1; 23 void read(int &x) { 24 char ch; bool flag = 0; 25 for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == ‘-‘)) || 1); ch = getchar()); 26 for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar()); 27 x *= 1-2*flag; 28 } 29 void write(int x) { 30 if (x > 9) write(x/10); 31 putchar(x%10+48); 32 } 33 34 int n, m, t, flag0, flag1 = INF, ans; 35 char ch[4]; 36 37 void work() { 38 read(n), read(m); 39 while (n--) { 40 scanf("%s", ch); read(t); 41 if (ch[0] == ‘A‘) flag0 &= t, flag1 &= t; 42 else if (ch[0] == ‘O‘) flag0 |= t, flag1 |= t; 43 else flag0 ^= t, flag1 ^= t; 44 } 45 for (int i = 31; i; i--) { 46 if (flag0&(1<<(i-1))) ans += (1<<(i-1)); 47 else if (flag1&(1<<(i-1)) && ((1<<(i-1)) <= m)) m -= (1<<(i-1)), ans += (1<<(i-1)); 48 } 49 printf("%d\n", ans); 50 } 51 int main() { 52 work(); 53 return 0; 54 }
[NOI 2014]起床困難綜合癥