diff --git a/src/7/17/T634198.cpp b/src/7/17/T634198.cpp index ecdea91..ffdb935 100644 --- a/src/7/17/T634198.cpp +++ b/src/7/17/T634198.cpp @@ -1,76 +1,32 @@ #include #include +#include +#include #include -#include - -using namespace std; using ll = int64_t; -const ll MAX_N = 100000; -struct Sm { - vector 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> v; + +std::set s; + +enum struct nt{ + p, + l }; -int main() { - ios::sync_with_stdio(false); - cin.tie(0); - ll k; - cin >> k; - vector 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]插入树状数组,以便后续查询。 -输出结果:最终累加的逆序对数量即为答案。 - -*/ \ No newline at end of file +} \ No newline at end of file diff --git a/src/7/17/T634198ds.cpp b/src/7/17/T634198ds.cpp new file mode 100644 index 0000000..ecdea91 --- /dev/null +++ b/src/7/17/T634198ds.cpp @@ -0,0 +1,76 @@ +#include +#include +#include +#include + +using namespace std; + +using ll = int64_t; +const ll MAX_N = 100000; + +struct Sm { + vector 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 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]插入树状数组,以便后续查询。 +输出结果:最终累加的逆序对数量即为答案。 + +*/ \ No newline at end of file