jzoj3512 遊戲節目 樹狀陣列,雙向dfs

2021-08-21 14:17:51 字數 1521 閱讀 6923

有n個節目,每個節目對3個東西貢獻不同,要求選擇至少k個讓第乙個東西的值最大。求方案數

至少k個我們可以計算選擇任何個數的結果減去選擇k個的結果。由於k比較小,我們考慮直接暴搜

資料不是很大,我們可以將節目分成兩段進行搜尋所有結果。

然後第一部分計算第1個東西的值減去第2個東西的值ab

1ia b1

i,和減去第3個東西的值ac

1ia c1

i。

第二部分一樣計算ab

2ia b2

i,ac

2ia c2

i。

問題就變成了選擇兩個數

i i

,j' role="presentation">j

j使得 ab

1i−a

b2j>

0 ab1

i−ab

2j

>

0and

a nd

ac1i−ac

2j>

0 ac1

i−ac

2j

>

0然後我們將兩個中的ab

a

b合在一起進行離散化,之後用乙個樹狀陣列或權值線段數進行第二部分查詢每個區間內數的個數,這樣就可以nl

ogn nlo

gn

查詢了。

總共時間複雜度 o(

217×l

og217

+1676116

) o(2

17×lo

g217+

1676116

)

#include

#include

#define ll long long

#define n 131080*4

#define lobit(x) x&(-x)

using

namespace

std;

struct ansnodeans[n];

ll n,k,a[51],b[51],c[51],t,nz;

long

long sum,tr[n],ans1;

void dfs(ll dep,ll w,ll sum1,ll sum2,ll sum3)//暴力處理k以內的結果

for (ll i=dep+1;i<=n;i++) dfs(i,w+1,sum1+a[i],sum2+b[i],sum3+c[i]);

}void dfs1(ll dep,ll sum1,ll sum2,ll sum3)//第一部分搜尋

void dfs2(ll dep,ll sum1,ll sum2,ll sum3)//第二部分搜尋

bool cmp1(ansnode x,ansnode y)//排序

}long

long find(ll x)//樹狀陣列——查詢

return ans;

}int main()

printf("%lld",sum-ans1);//輸出

}

JZOJ 規律 遊戲

有一堆金塊,king和貓老大輪流抽金塊,每次抽的個數必然是2的次方冪,求勝利 抽走最後一塊 的是誰 三行每行乙個數 n 0對於每局,如果 king 必勝則輸出一行 king will win.否則第一行輸出 maolaoda willwin.第二行輸出他第一次拿的最小數量。8 42maolaoda ...

jzoj遊戲 規律 數論

description king 很喜歡賭博,這次 king邀請貓老大來玩乙個遊戲。king 拿出了 n 塊 0 input 三行每行乙個數 n 0 output 對於每局,如果 king 必勝則輸出一行 king will win.否則第一行輸出 maolaoda willwin.第二行輸出他第一...

JZOJ 數字遊戲 DP

小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,a2,a3,an,然後給你m個回合的機會,每回合你可以從中選擇乙個數字擦去它,接著剩下來的每個數字ai都要遞減乙個值bi,即a1減掉b1,a2減掉b2,如此重複m個回合,所有你擦去的數字之和就是你所得的分數。小w和他的好朋友小y玩了這個遊戲,可是他發...