1394 差和問題
基準時間限制:1 秒 空間限制:131072 kb 分值: 80
難度:5級演算法題
有乙個集合s,初始狀態下有n個元素,對他進行如下操作:
1、向s裡面新增乙個值為v的元素。輸入格式為1 v
2、向s裡面刪除乙個值為v的元素。輸入格式為2 v
3、詢問s裡面的元素兩兩之差絕對值之和。輸入格式為3
對於樣例,
操作3,|1-2|+|1-3|+|2-3|=4
操作1 4之後,集合中的數字為1 2 3 4
操作3,|1-2|+|1-3|+|2-3|+|1-4|+|2-4|+|3-4|=10
操作2 2之後,集合中的數字為1 3 4
操作3,|1-3|+|1-4|+|3-4|=6
input
第一行輸入兩個整數n,q表示集合中初始元素個數和操作次數。(1<=n,q<=100,000)output第二行給出n個整數a[0],a[1],a[2],…,a[n-1],表示初始集合中的元素。(0<=a[i]<=1,000,000,000)
接下來q行,每行乙個操作。(0<=v<=1,000,000,000)
對於第2類操作,如果集合中不存在值為v的元素可供刪除,輸出-1。input示例對於第3類操作,輸出答案。
3 5output示例1 2 3
31 4
32 2
3
4先思考乙個簡單的問題,給定n個數字,求兩兩之間差的絕對值之和。106
這個很明顯先排個序,這樣就可以把絕對值去掉了。然後從小到大統計每乙個和其它組成的差絕對值之和。
再聯絡到本題中。n+q<=2e5,那麼先把所有的資料讀入,最多有2e5種數字,離散化一下,對應到樹狀陣列之中。插入和刪除乙個數字的時候要統計一下這個對答案的影響。
當前數字為x,比當前數字小的有cnt個,總和為sum,那麼這一部分對答案的影響是x*cnt-sum.對於求比當前數字大的數字類似的道理。
總的複雜度是(n+q)log(n+q)。
以後記住了,這種增刪查的樹狀陣列很方便。。。另外,visual c++提交~
**:
#pragma warning(disable:4996)
#include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
const int maxn = 100005;
ll n;
ll n, q;
struct o
oper[maxn];
mapma;
ll val[2 * maxn], val2[2 * maxn];
ll ans[2 * maxn], nnn[2 * maxn];
ll exsit[2 * maxn];
ll res_wc;
ll lowbit(ll x)
void add(ll x,ll y)
}void add2(ll v,ll x, ll y)
}ll sum(ll x)
return res;
}ll sum2(ll x)
return res;
}int main()
j = n;
for (i = 1; i <= q; i++) }
n = j;
sort(val + 1, val + n + 1);
sort(val2 + 1, val2 + j + 1);
k = 0;
for (i = 1; i <= j; i++)
res_wc = 0;
ll temp, temp_a, temp_b, temp_before_sum, temp_after_sum;
ll su = 0;//所有元素的和
for (i = 1; i <= n; i++)
for (i = 1; i <= q; i++)
else if (oper[i].op == 2)
else
}else
}//system("pause");
return 0;
}
1394 差和問題
1394 差和問題 基準時間限制 1 秒 空間限制 131072 kb 有乙個多重集合s 即裡面元素可以有重複 初始狀態下有n個元素,對他進行如下操作 1 向s裡面新增乙個值為v的元素。輸入格式為1 v 2 向s裡面刪除乙個值為v的元素。輸入格式為2 v 3 詢問s裡面的元素兩兩之差絕對值之和。輸入...
51nod 迷宮問題
1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...
51nod編輯距離問題
編輯距離,又稱levenshtein距離 也叫做edit distance 是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。例如將kitten一字轉成sitting sitten k s sittin e i sit...