1. 程式人生 > 實用技巧 >洛谷 U140602 屠龍

洛谷 U140602 屠龍

洛谷 U140602 屠龍

洛谷傳送門

題目背景

“你知道什麼叫做‘屠龍少年終成惡龍’麼?”SeawaySeawa**y指著一道毒瘤題如是說道。為了貫徹“毒瘤出題人biss”的方針,SeawaySeawa**y帶領FDF**D少年團,毅然決然地踏上了屠龍的征途。

題目描述

歷經千辛萬苦,SeawaySeawa**y帶著JZWJZW和XDX**D終於來到了惡龍所在的地方,並準備與其展開艱苦卓絕的戰鬥。但是,惡龍有著十分特殊的技能,他的防禦戰線能夠反彈一定的傷害。具體地,防線會使用一定的運算來改變惡龍所受到的傷害。具體說來,防禦戰線由nn扇防禦門組成。每扇防禦門的配置包括一個運算opo**p和一個引數tt

,其中運算一定是\text{OR},\text{XOR},\text{AND}OR,XOR,AND中的一種,引數一定為非負整數。

防線的工作原理是這樣的:對於一道攻擊、一扇防禦門來講:如果還未通過防禦門時攻擊力為xx,則其通過這扇防禦門後攻擊力將變為x\ op\ tx o**p t。最終惡龍受到的傷害為對方初始攻擊力xx依次經過所有nn扇防禦門後轉變得到的攻擊力。

由於SeawaySeawa**y水平有限,他的初始攻擊力只能為00到mm之間的一個整數。但在通過防禦門之後的攻擊力不受mm的限制)。為了節省體力,他希望通過選擇合適的初始攻擊力使得他的攻擊能讓惡龍受到最大的傷害,請你幫他計算一下,他的一次攻擊最多能使惡龍受到多少傷害。

輸入格式

從檔案fuckdragon.infuckdrago**n.i**n中讀入資料。

第一行包括兩個正整數nn和mm。nn表示防禦門個數,mm表示初始攻擊力為00到mm。接下來的nn行描述每一扇防禦門。每行包括空格隔開的一個字串opo**p和一個非負整數tt

輸出格式

輸出到檔案fuckdragon.outfuckdrago**n.out中。

一行一個整數,表示SeawaySeawa**y發動的一次攻擊最多使得惡龍受到多少傷害。


命題背景:

不是防彈少年團(狗頭保命)

是F**k Dragon少年團


題解:

位運算性質:按位獨立。

所以可以分別預處理每一位是0時是什麼結果,是1時什麼結果。然後從最高位到最低位貪心就行了。

程式碼:

#include<cstdio>
#define int long long
using namespace std;
int n,m,t;
char s[10];
int x=0,y=(1ll<<30)-1;
int ans;
signed main()
{
	scanf("%lld%lld",&n,&m);
	while(n--)
	{
		scanf("%s%lld",s+1,&t);
		if(s[1]=='A')
			x&=t,y&=t;
		else if(s[1]=='O')
			x|=t,y|=t;
		else
			x^=t,y^=t;
	}
	for(int i=32;i>=0;i--)
	{
		if(x&(1ll<<i))
			ans+=(1ll<<i);
		else if(y&(1ll<<i)&&(1ll<<i)<=m)
		{
			m-=(1ll<<i);
			ans+=(1ll<<i);
		}
	}
	printf("%lld\n",ans);
	return 0;
}