update
This commit is contained in:
parent
16fb1df69b
commit
a0e5239fce
@ -1,76 +1,32 @@
|
||||
#include <cstdint>
|
||||
#include <iostream>
|
||||
#include <set>
|
||||
#include <utility>
|
||||
#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);
|
||||
}
|
||||
|
||||
ll k;
|
||||
std::vector<std::pair<ll, ll>> v;
|
||||
|
||||
std::set<ll> s;
|
||||
|
||||
enum struct nt{
|
||||
p,
|
||||
l
|
||||
};
|
||||
|
||||
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;
|
||||
int main(){
|
||||
std::cin>>k;
|
||||
for(ll i=1;i<=k;i++){
|
||||
std::cin>>v[i].first>>v[i].second;
|
||||
s.insert(v[i].first);
|
||||
s.insert(v[i].second);
|
||||
}
|
||||
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]);
|
||||
}
|
||||
auto it = s.begin();
|
||||
ll ln=1;
|
||||
while(it!=s.end()){
|
||||
|
||||
}
|
||||
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]插入树状数组,以便后续查询。
|
||||
输出结果:最终累加的逆序对数量即为答案。
|
||||
|
||||
*/
|
||||
}
|
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