最開始讀題的時候沒有讀的太懂,以為i是在選定區間內給的,實際上不是,這道題的意思應該是在l和r的區間內找出有多少個好的配對,這裡好的配對是對於整個區間來說的,既然是對於整個區間,我們就不難想到找出好的配對的方法,所以我們可以先找出所有好的配對,然後用樹狀陣列維護個數。
如何找出好的配對呢?我們先來分析什麼叫好的配對,選定的兩點間距離比其中一點到除對方外任意一點的距離都小,也就是說這兩點差的絕對值最小,這樣的話,這兩個點在sort排序後一定相鄰,這個很好推出,於是我們只要考慮這個點的另乙個配對是左邊的點還是右邊的點,寫乙個判斷就行了,注意特判1和n。
找出好的配對來,就又向答案接近了一步,現在我們只要進行更新就行了,這裡的更新我們列舉左端點,上一步我們已經求出了好的配對(l,r)如果查詢的左端點在l的左邊,那麼從r開始向右就一定至少存在乙個好的配對,所以讓樹狀陣列中的r對應的位置更新就行。注意我們要倒序列舉左端點,因為我們加入r後所產生的配對只能是在詢問區間包含l的情況下才有效。
1 #include2 #include3 #include4 #include5using
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...