Ball King 線段樹或dp)

2021-08-26 12:39:29 字數 1935 閱讀 4770

題目描述

hpu601球王爭霸賽即將舉行,acmer紛紛參加.

現在有n個人報名參賽,每個人都有乙個實力值 ai,實力值較大者獲勝.

為保證比賽公平,我們定義比賽規則:

第一輪:[1, 2]pk,然後[3, 4]pk...最後[2i − 1, 2i]pk.

第二輪:[1, 2]w inner同[3, 4]w inner進行pk,然後[5, 6]w inner同[7, 8]w inner...

······

第m輪:最後乙個w inner.

現在有q次詢問,每次詢問(u, v),第u輪第v個勝出者的編號?

輸入第一行乙個正整數t,代表有t組測試資料. (1 ≤ t ≤ 10)

每組資料第一行輸入正整數n, q,接下來n個正整數ai,表示實力值.(1 ≤ n, ai ≤ 2^16)(1 ≤ q ≤ 10)

接下來q行每行兩個整數(u, v),詢問第u輪第v個勝出者的編號.(0 ≤ u ≤ 16),(1 ≤ v ≤ 2^16)

輸入保證每位選手的實力值ai都不相同,且詢問合法

輸入樣例

12 2

2 10 2

1 1輸出樣例21

#include #include #include using namespace std;

int a[1000009];

int dp[17][1000009];

int qwe(int n)

ans=ans*2; }}

int asd(int x)

return ans;

}int main()

int t=qwe(n);

for(int i=1;i<=t;i++)

}int u,v;

for(int i=1;i<=q;i++)

} return 0;

}

//線段樹

#pragma gcc optimize ("o3")

#pragma gcc optimize ("o2")

#include #include using namespace std;

using namespace __gnu_cxx;

#define met(s) memset(s, 0, sizeof(s))

#define rep(i, a, b) for(int i = a; i <= b; ++i)

template inline void scan_d(t &ret) }

typedef long long ll;

typedef unsigned long long ull;

typedef pairpii;

const int inf = 0x3f3f3f3f;

const int mod = 1e9 + 7;

const int maxn = (1 << 16) + 10;

int a[maxn], fac[30];

pii dp[maxn];

inline void up(int rt)

inline void build(int rt, int l, int r)

int mid = (l + r) >> 1;

build(rt << 1, l, mid);

build(rt << 1 | 1, mid + 1, r);

up(rt);

}inline pii qr(int rt, int l, int r, int l, int r)

if(r > mid)

return ans;

}int main()

} return 0;

}

思維 線段樹dp

不得不說這題是真的難,看題解都差點沒用理解。給定平面上若干 1e5 點,每個點ab兩個權值,要求將其分為兩組,a組的a權值和加b組的b權值和最大,劃分條件轉化一下就是,不能有a出現在b的右下,也就是要找到一條不降的折線,其上是a,其下是b。我們認為位於折線上的那些點屬於b。暴力dp是可做的,離散化x...

線段樹優化dp

等離子炮有n個操作訊號,第i個操作訊號的強度為b i 總體強度為各操作訊號的強度之和。由於有些訊號太弱了了 強度 0 水寶寶想把它們刪除。但是水寶寶自己不會刪除訊號,所以他找來了同船的隊友幫忙。有 m位隊友,第ii 位隊友只會刪除編號在 l i 和 r i 之間的訊號,且每刪除乙個訊號,花費 c i...

線段樹區間異或

題目描述 akn 覺得第一題太水了,不屑於寫第一題,所以他又玩起了新的遊戲。在遊戲中,他發現,這個遊戲的傷害計算有乙個規律,規律如下 擁有乙個傷害串,是乙個長度為 nnn 的只含字元 0 和字元 1 的字串。規定這個字串的首字元是第乙個字元,即下標從 111 開始。給定乙個範圍 l,r l,r l,...