1 #include 2 #include 3 #include 4 #include 5 #include 6view codeusing
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 }
題目大意:給定一種運算,為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 的?因為每次求森林最長鏈時其實真正有用的點 邊並不多,而演算法將大量時間花費在了無用點 孤立點 上。如果找有用邊時順便記錄有...