題目描述
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,...