首先將縱座標離散化。 將所有點按照橫座標排序,列舉矩形的上邊界,然後往後依次加入每個點,這樣就確定了 矩形的上下邊界。設 v[y] 表示矩形內部縱座標為 y 的點的權值和,則答案為 v 的最大子段和, 用線段樹維護帶修改的最大子段和即可。 時間複雜度 o(nlogn)。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3f
#define ull unsigned long long
#define endl '\n'
#define clr_0(a) memset(a, 0, sizeof(a))
#define clr_inf(a) memset(a, inf, sizeof(a))
#define lowbit(x) x & -x
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define pb push_back
#define pop pop_back
const
double pi =
acos(-
1);const
int maxn =
2000+10
;const
int maxm =
(maxn<<5)
+5;const ll mod =
998244353
;const
int hash_mod =
19260817
;int t, n, cnt_b;
ll suml[maxn<<2]
, sumr[maxn<<2]
, sum[maxn<<2]
, mx[maxn<<2]
;int b[maxn]
;struct node
}p[maxn]
;void
pushup
(int rt)
void
build
(int rt,
int l,
int r)
void
update
(int rt,
int l,
int r,
int x,
int val)
int mid =
(l + r)
>>1;
if(x <= mid)
update
(lson, x, val);if
(x > mid)
update
(rson, x, val)
;pushup
(rt);}
intmain()
sort
(b +
1, b +
1+ cnt_b)
;int m =
unique
(b +
1, b +
1+ cnt_b)
- b -1;
sort
(p +
1, p +
1+ n)
; ll ans =
-1e18
;for
(int i =
1; i <= n ;
++ i) p[i]
.y =
lower_bound
(b +
1, b +
1+ m, p[i]
.y)- b;
for(
int i =
1; i <= n ;
++ i)
} cout << ans << endl;
}return0;
}
杭電多校第六場(IF)
題意 有命題 將 b 進製數y按位相加,迴圈無窮次,最終結果若 x 0,則有y x 0,反之不然 給出b和x,判斷命題是否成立 打表發現的b x 1時成立,看到有數論大佬推出來的 想看推導的右轉 includeusing namespace std typedef unsigned long lon...
20190807杭電多校第六場
賽中和隊友一直在搞乙個胡搞做法,艱難優化到本地跑10s,可惜始終過不了。最後只好補了題解做法。倒著刪除,用樹狀陣列求lis,維護一條當前的lis的路徑。若被刪除的數不在當前的lis中,則答案不變 否則,重新做一遍lis。據說因為lis的期望長度為sqrt n 所以被選中的概率是 ac include...
2019 杭電多校(第六場)
1005 snowy smile 線段樹 題意給你n個點 讓你畫個矩形 使矩形內所含點的權值和最大 必須有點 思路離散化 列舉矩形的左右區間 線段樹維護y座標的最大欄位和 複雜度 o n n lgn include using namespace std typedef long long ll c...