update
This commit is contained in:
parent
16fb1df69b
commit
a0e5239fce
@ -1,76 +1,32 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <set>
|
||||||
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
using ll = int64_t;
|
using ll = int64_t;
|
||||||
const ll MAX_N = 100000;
|
|
||||||
|
|
||||||
struct Sm {
|
|
||||||
vector<ll> tree;
|
ll k;
|
||||||
ll n;
|
std::vector<std::pair<ll, ll>> v;
|
||||||
Sm(ll size) {
|
|
||||||
n = size;
|
std::set<ll> s;
|
||||||
tree.assign(n + 1, 0);
|
|
||||||
}
|
enum struct nt{
|
||||||
void update(ll i, ll v) {
|
p,
|
||||||
while (i <= n) {
|
l
|
||||||
tree[i] += v;
|
|
||||||
i += i & -i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ll query(ll i) {
|
|
||||||
ll sum = 0;
|
|
||||||
while (i) {
|
|
||||||
sum += tree[i];
|
|
||||||
i -= i & -i;
|
|
||||||
}
|
|
||||||
return sum;
|
|
||||||
}
|
|
||||||
ll query(ll l, ll r) {
|
|
||||||
if (l > r) return 0;
|
|
||||||
return query(r) - query(l - 1);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
ios::sync_with_stdio(false);
|
std::cin>>k;
|
||||||
cin.tie(0);
|
for(ll i=1;i<=k;i++){
|
||||||
ll k;
|
std::cin>>v[i].first>>v[i].second;
|
||||||
cin >> k;
|
s.insert(v[i].first);
|
||||||
vector<ll> arr(MAX_N + 1);
|
s.insert(v[i].second);
|
||||||
for (ll i = 1; i <= MAX_N; i++) {
|
|
||||||
arr[i] = i;
|
|
||||||
}
|
|
||||||
for (ll i = 0; i < k; i++) {
|
|
||||||
ll x, y;
|
|
||||||
cin >> x >> y;
|
|
||||||
if (x <= MAX_N && y <= MAX_N) {
|
|
||||||
swap(arr[x], arr[y]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Sm sm(MAX_N);
|
|
||||||
long long ans = 0;
|
|
||||||
for (ll j = 1; j <= MAX_N; j++) {
|
|
||||||
if (arr[j] < MAX_N) {
|
|
||||||
ans += sm.query(arr[j] + 1, MAX_N);
|
|
||||||
}
|
|
||||||
sm.update(arr[j], 1);
|
|
||||||
}
|
|
||||||
cout << ans << endl;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
auto it = s.begin();
|
||||||
|
ll ln=1;
|
||||||
|
while(it!=s.end()){
|
||||||
|
|
||||||
/*
|
}
|
||||||
|
}
|
||||||
初始化:首先,初始化一个数组arr,其中arr[i] = i,表示初始状态下第i天的温度是i。
|
|
||||||
模拟交换:读取每次交换操作,如果交换的两个位置都在1到100,000的范围内,则交换数组中这两个位置的值。
|
|
||||||
计算逆序对:
|
|
||||||
使用树状数组(Fenw)来高效计算逆序对数量。
|
|
||||||
遍历数组,对于每个元素arr[j],查询树状数组中值大于arr[j]的元素数量(这些元素位于j之前),并将这个数量累加到答案中。
|
|
||||||
将当前元素arr[j]插入树状数组,以便后续查询。
|
|
||||||
输出结果:最终累加的逆序对数量即为答案。
|
|
||||||
|
|
||||||
*/
|
|
76
src/7/17/T634198ds.cpp
Normal file
76
src/7/17/T634198ds.cpp
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
#include <cstdint>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
using ll = int64_t;
|
||||||
|
const ll MAX_N = 100000;
|
||||||
|
|
||||||
|
struct Sm {
|
||||||
|
vector<ll> tree;
|
||||||
|
ll n;
|
||||||
|
Sm(ll size) {
|
||||||
|
n = size;
|
||||||
|
tree.assign(n + 1, 0);
|
||||||
|
}
|
||||||
|
void update(ll i, ll v) {
|
||||||
|
while (i <= n) {
|
||||||
|
tree[i] += v;
|
||||||
|
i += i & -i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ll query(ll i) {
|
||||||
|
ll sum = 0;
|
||||||
|
while (i) {
|
||||||
|
sum += tree[i];
|
||||||
|
i -= i & -i;
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
ll query(ll l, ll r) {
|
||||||
|
if (l > r) return 0;
|
||||||
|
return query(r) - query(l - 1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
ios::sync_with_stdio(false);
|
||||||
|
cin.tie(0);
|
||||||
|
ll k;
|
||||||
|
cin >> k;
|
||||||
|
vector<ll> arr(MAX_N + 1);
|
||||||
|
for (ll i = 1; i <= MAX_N; i++) {
|
||||||
|
arr[i] = i;
|
||||||
|
}
|
||||||
|
for (ll i = 0; i < k; i++) {
|
||||||
|
ll x, y;
|
||||||
|
cin >> x >> y;
|
||||||
|
if (x <= MAX_N && y <= MAX_N) {
|
||||||
|
swap(arr[x], arr[y]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Sm sm(MAX_N);
|
||||||
|
long long ans = 0;
|
||||||
|
for (ll j = 1; j <= MAX_N; j++) {
|
||||||
|
if (arr[j] < MAX_N) {
|
||||||
|
ans += sm.query(arr[j] + 1, MAX_N);
|
||||||
|
}
|
||||||
|
sm.update(arr[j], 1);
|
||||||
|
}
|
||||||
|
cout << ans << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
初始化:首先,初始化一个数组arr,其中arr[i] = i,表示初始状态下第i天的温度是i。
|
||||||
|
模拟交换:读取每次交换操作,如果交换的两个位置都在1到100,000的范围内,则交换数组中这两个位置的值。
|
||||||
|
计算逆序对:
|
||||||
|
使用树状数组(Fenw)来高效计算逆序对数量。
|
||||||
|
遍历数组,对于每个元素arr[j],查询树状数组中值大于arr[j]的元素数量(这些元素位于j之前),并将这个数量累加到答案中。
|
||||||
|
将当前元素arr[j]插入树状数组,以便后续查询。
|
||||||
|
输出结果:最终累加的逆序对数量即为答案。
|
||||||
|
|
||||||
|
*/
|
Loading…
Reference in New Issue
Block a user