Noi2016十連測第五場 二進位制的世界

2022-05-06 11:30:11 字數 1045 閱讀 5674

1 #include 2 #include 3 #include 4 #include 5 #include 6

using

namespace

std;

7#define maxn 100005

8#define maxk 256

9int

n,type,ans,sum,a[maxn],f[maxk][maxk],g[maxk][maxk];

10bool

v[maxk];

11char st[5

];12

void read(int &x)

17int hs(int x,int

y)22

intmain()

34if (type==1) printf("

%d %d\n

",ans,sum);

35else printf("

%d\n

",ans);36}

37for (int j=0;j<256;j++)41}

42return0;

43 }

view code

題目大意:給定一種運算,為or,ans,xor中的一種,以及乙個長度為n的序列,第i個數為ai,我們設第i個人與第j個人的友好度為ai與aj位運算,這種位運算是題目給定的,求第2個人到第n個人與其左邊的人友好程度的最大值及達到該最大值的方案數。n<=100000;ai<=2^16;

做法:如果考慮暴力做,因為ai小於等於2^16,所以暴力做可以做到加入o1,而查詢o(2^16),顯然是不可以的,然而o(2^8*n)是可以過此題的,根據莫隊演算法的思想,我可以平衡這種暴力,使得兩種操作都達到根號n的複雜度。

正解:我們考慮dp,設f[i][j]表示前8位為i,後8位為j位運算後使得後8位的最大值及方案數,怎麼做呢,我們在加入乙個數時,我們列舉j,設該數前8位為a,後8位為b,我們用j~b(~表示位運算)來更新f[a][j],查詢時,設該數前8位為a,後8位為b,我們可以列舉i用f[i][b]|((i~a)<<8)更新答案即可,複雜度為o(2^8*n)。

dp。

BZOJ十連測 線段樹

在若干次操作後,某乙個位置的值可以表示成若干各區間的最大值。例如位置k kk,我們找到當前操作前最後乙個 編號最大但小於當前編號 覆蓋當前區間左端點的操作的左端點,最後乙個覆蓋當前當前區間右端點的操作的右端點,把這個左右端點當成乙個新的操作區間,然後重複執行上述操作。也就是我們需要一直向左找,一直向...

BFS BZOJ省選十連測 Cycle

蛤?這題絕對有問題。複雜度明顯不對頭。它的想法其實就是找到乙個點,判斷它與它周圍的點能否構成環,然後不能再刪去這個點。然而。他每次都memset了一發,這不t?服都服了。include include include include define sf scanf define pf printf ...

NOIp2016十連測第五場T2 walk 題解

傳送門 最近由於參加noi集訓,好久沒有更新部落格啦tot 正解要從第二種部分分思路想。這個思路為什麼是o n max w o n times max w o n max w 的?因為每次求森林最長鏈時其實真正有用的點 邊並不多,而演算法將大量時間花費在了無用點 孤立點 上。如果找有用邊時順便記錄有...