洛谷 P4883 mzf的考驗 解題報告

2022-04-30 03:18:08 字數 2584 閱讀 3621

\(mzf\)立志要成為乙個豪傑,當然,他也是乙個\(oier\)。 他希望自己除了會\(oi\)之外還會各種東西,比如心理學、吉他、把妹等等。 為了讓自己有更大的魅力,他不駝背,不熬夜,整天鍛鍊,雙目炯炯有神,是我們機房最不像\(oier\)的人。 然而,在與我們格格不入若干天並且將《易經》研究透徹之後,承受不住我們對他另類的言論,他爆發了。 機房在那一剎那彷彿天塌地陷,世界末日。

八卦有幹、坤、震、巽、坎、離、艮、兌; 兩兩組合,一上一下,形成了六十四卦,每卦六爻,一共三百八十四爻。 爻分陰陽,陽爻性屬陽剛,陰爻性屬陰柔。天下之大,無奇不有。千奇百怪,皆出此處。 \(mzf\)研究透徹了易經之後,畫出了\(n\)個奇怪的圖案。他說那是他改進出來的更強大的卜卦體系。 每乙個圖案有二十行,每一行要麼是陰爻\((0)\),要麼是陽爻\((1)\),作為乙個\(oier\),我們可以將卦象看成乙個個二進位制串; 他將\(n\)個圖案畫在了符紙上,然後進行\(m\)次操作:

操作1:翻轉區間\([l,r]\)的圖案,比如\((3,1,2,5)\)變成\((5,2,1,3)\);

操作2:\(mzf\)畫地為卦,將\([l,r]\)之間的卦象都異或上新畫的那個卦象;

操作3:\(mzf\)會詢問機房裡的其他人\([l,r]\)之間卦象代表的二進位制數權值和。

如果不能正確回答每個操作\(3\),那麼機房風水格局將會改變,我們都將...!

由於\(mzf\)瘋狂之下將我們都捆♂綁♂了起來,所以只能求求你來幫我們解決這個問題。

第一行兩個正整數:\(n\),\(m\)(\(n\)為序列長度,\(m\)為操作個數)

第二行\(n\)個正整數:\(a[i]\) (用\(10\)進製數表示每個卦象)(\(1<=i<=n\))

接下來\(m\)行:每行首先乙個正整數\(opt\)表示操作型別

\(opt==1\):兩個正整數:\(l\),\(r\)。請翻轉區間\([l,r]\);

\(opt==2\):三個正整數:\(l\),\(r\),\(d\)。請將區間\([l,r]\)中的所有卦象都異或卦象\(d\)。(\(0<=d<=10^5\))

\(opt==3\):兩個正整數:\(l\),\(r\)。請查詢區間\([l,r]\)的卦象權值和。

對於每個 \(opt==3\) 的情況,輸出一行答案。

對於\(20\%\)的資料,\(n<=1000\),\(m<=1000\)

對於另外\(20\%\)的資料,不存在操作\(1\)

對於另外\(20\%\)的資料,保證\(n\)為\(2\)的次冪,且在操作\(1\)中,保證\(l=i\times(2^j)+1,r=(i+1)\times(2^j)\),其中\(i\),\(j\)為任意值

對於\(100\%\)的資料,\(n<=10^5\),\(m<=5\times 10^4\),\(1<=l<=r<=n\),\(0<=d<2^\)

發現,區間翻轉要用平衡樹,區間異或要用線段樹打標記

平衡樹不能打標記的原因是不能快速更新子樹答案

我們可以把每一位拆開,然後對每一位維護區間1的個數,就可以快速更新子樹答案啦

複雜度:\(o(mlogdlogn)\)

code:

#include #include #define ls ch[now][0]

#define rs ch[now][1]

#define ll long long

const int n=1e5+10;

int ch[n][2],dxor[n],siz[n],val[n],tag[n],tmp,root;

int n,m,a[n];

ll sum[n][21],dat[n][21],pow[21];

void reverse(int now)

void updata(int now)

void eor(int now,int x)

dxor[now]^=x;

}void pushdown(int now)

if(dxor[now])

}void split(int now,int k,int &x,int &y)

pushdown(now);

if(siz[ls]+1<=k)

x=now,split(rs,k-siz[ls]-1,rs,y);

else

y=now,split(ls,k,x,ls);

updata(now);

}int merge(int x,int y)

int now=rand()%(r+1-l)+l;

val[now]=pre+rand();

for(int i=0;i<=20;i++)

dat[now][i]=1ll*(a[now]>>i&1);

ls=build(l,now-1,val[now]);

rs=build(now+1,r,val[now]);

updata(now);

return now;

}int main()

{ scanf("%d%d",&n,&m);

for(int i=1;i<=n;i++) scanf("%d",a+i);

for(int i=0;i<=20;i++) pow[i]=1ll<2018.9.9

洛谷P1684 考驗(貪心)

貪心 盡可能的在已經連線起來的詩歌後面接上新的詩歌 新建乙個last儲存上次匹配串的末尾的後乙個字元 每當當前點的位置到last的長度大於四,有可能成為新串的時候 暴力判斷是否可以成為詩歌,若成功更新答案和last 我們用f i 表示以i結尾的詩歌數 所以每次更新是f last 1 1 若不成功f ...

洛谷P3372解題報告

題目描述如下 在這裡插入描述 由於是一道模板題就直接給注釋詳細的 include includeusing namespace std typedef long long ll long long int sum 0ll struct node tree 500005 void build ll l...

洛谷P1342 請柬解題報告

求去的路徑與回來的路徑和 1 n m 1000000 1 le n,m le 1000000 1 n,m 1000 000最短路 對於第一次碰到這種模型的oiers,這個地方可以講講的。顯然我們可以暴力跑n遍最短路。但是我們可以這麼想 我們出去是從乙個點到所有其他點,那麼我們能回來也從乙個點到所有其...