題目鏈結 zstu 4241
問題轉化為有很多區間,現在每次給定乙個區間求這個區間和之前所有區間中的某乙個的交集的最大長度。
首先我們把所有的區間預處理出來。
然後去重(那些被包含的小區間可以去掉),再根據左端點公升序排序。
這樣的話這些區間的右端點也是嚴格公升序的。
現在對於給定的$[x, y]$
所有區間大概可以分成三類。
$1$、左端點落在$[1, x - 1]$,對於這類區間查詢右端點最大值即可。
$2$、右端點落在$[y + 1, n]$,對於這類區間查詢左端點最小值即可。
$3$、除了上面兩種的其他區間,對於這類區間查詢區間長度最大值即可。
$1$、$2$直接利用單調性
,二分找到滿足條件的位置即可。
$3$的話……我選擇了$st$表。
最後答案不能超過給定區間的長度。
時間複雜度$o(nlogn)$
#include using namespace std;#define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
typedef long long ll;
const int n = 2e5 + 10;
struct node
} b[n], c[n];
ll a[n], s[n], p[n];
int pos[n];
int n, m, q;
int t;
int num, cnt, ans;
int f[n][22];
int lg[n];
inline ll calc(int l, int r)
inline int solve(int l, int r)
void work()
int main()
int t;
if (calc(pos[i], r) <= p[i]) t = r; else t = l;
++num;
b[num].x = pos[i], b[num].y = t;
} rep(i, 1, m)
int t;
if (calc(l, pos[i]) <= p[i]) t = l; else t = r;
++num;
b[num].x = t, b[num].y = pos[i];
} sort(b + 1, b + num + 1);
cnt = 0;
for (int i = 1, j; i <= num; )
memset(f, 0, sizeof f);
work();
ans = 0;
while (q--)
if (c[r].x < x)
else
}if (c[cnt].y <= y) y = cnt;
else
if (c[l].y > y)
else
}ans = max(ans, solve(x, y));
ans = min(ans, y - x + 1);
printf("%d\n", ans);
} }return 0;
}
zstu2552 馬棚問題 DP
動態規劃基本步驟 本人覺得 1.確定陣列的維數,一維,二維等等 2.弄清陣列下標的含義3.找出狀態轉移方程式 4實現自己的想法 本題思路 二維陣列dp i j i表示前i個馬棚放馬完畢,j表示佇列前j匹馬已經進入馬棚,dp i j 記錄前j匹馬放在前i個馬棚裡的最小不愉快係數,用f a,b 表示只把...
4241 歷史研究
這一題我還是不會做qaq 一開始想了一想,好像可以上莫隊 嗯,怎麼維護修改呢 我們可以對數值進行分塊啊,那麼每次就只需要n 的時間就可以維護好了 v 嗯,看起來是乙個十分優越的做法 時間複雜度就是莫隊 n 也就是n nn 大概是n2 這就跟暴力沒什麼區別嘛,就名字好聽了一點 於是繼續想。什麼都沒想出...
ZSTU4247 萌新的旅行
time limit 1 sec memory limit 128 mb submit 488 solved 57 zstu的萌新們準備去自助旅行,他們租了一輛吉普車,然後選擇了n個城市作為遊覽地點。然後他們驚喜的發現他們選擇的城市剛好繞城乙個環。也就是說如果給所有城市按照0,1,2,n 1編號,0...