GZOI 2017配對統計 樹狀陣列

2022-02-03 07:34:39 字數 1409 閱讀 3196

最開始讀題的時候沒有讀的太懂,以為i是在選定區間內給的,實際上不是,這道題的意思應該是在l和r的區間內找出有多少個好的配對,這裡好的配對是對於整個區間來說的,既然是對於整個區間,我們就不難想到找出好的配對的方法,所以我們可以先找出所有好的配對,然後用樹狀陣列維護個數。

如何找出好的配對呢?我們先來分析什麼叫好的配對,選定的兩點間距離比其中一點到除對方外任意一點的距離都小,也就是說這兩點差的絕對值最小,這樣的話,這兩個點在sort排序後一定相鄰,這個很好推出,於是我們只要考慮這個點的另乙個配對是左邊的點還是右邊的點,寫乙個判斷就行了,注意特判1和n。

找出好的配對來,就又向答案接近了一步,現在我們只要進行更新就行了,這裡的更新我們列舉左端點,上一步我們已經求出了好的配對(l,r)如果查詢的左端點在l的左邊,那麼從r開始向右就一定至少存在乙個好的配對,所以讓樹狀陣列中的r對應的位置更新就行。注意我們要倒序列舉左端點,因為我們加入r後所產生的配對只能是在詢問區間包含l的情況下才有效。

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int n=3e5+10;7

#define ll long long

8struct

node

13}a[n];

14 vectorpoint[n],p1[n],p2[n];

15ll lowbit(ll x)

18void

ins(ll x,ll y)

21ll m,n,c[n];

22void

add(ll x)27}

28ll query(ll x)

34return

ans;35}

36ll ans[n];

37int

main()

42 sort(a+1,a+n+1

);43

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

48if(i!=n&&a[i+1].val-a[i].val51if(i!=1&&a[i].val-a[i-1].val==min)ins(a[i].id,a[i-1

].id);

52if(i!=n&&a[i+1].val-a[i].val==min)ins(a[i+1].id,a[i].id);//

取兩個端點最小值53}

54for(int i=1;i<=m;i++)

60for(int i=n;i>=1;i--)

64 ll sum=0;65

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

66 sum+=ans[i]*i;

67 printf("

%lld\n

",sum);

68 }

草地排水 (網路流)gzoi

農夫john不僅知道每條溝渠每分鐘可以傳輸多少加侖的水,而且知道溝渠的精確布局,將水從池塘中排出,通過複雜的網路注入到每條溝渠和溪流中。給出所有的有關資訊,確定可以從池塘中流出並流入溪流中的水的最大速率。對每個溝渠,水流的方向是唯一的,但水可以迴圈流動。輸入 輸入包含若干測試用例。對於每個測試用例,...

物件導向部分 201

小夥伴們,還在為不知道怎麼下手而頭疼嗎,我們程式競賽協會來幫你們啦 啦啦啦。另外,如果有對程式設計含有濃厚興趣的同學,我們隨時歡迎你們的加入喲 策劃 譚兆飛 程式設計 管懷文 協助 一號人員要求給她打碼 乾脆二號也打碼好了o o 其實只是提供了題目啦 物件導向部分 201 include inclu...

2 01揹包問題

有 nn 件物品和乙個容量是 vv 的揹包。每件物品只能使用一次。第 ii 件物品的體積是 vivi,價值是 wiwi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,vn,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n...