Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <set>
- #include <map>
- #include <stack>
- #include <queue>
- #include <deque>
- #include <unordered_map>
- #include <numeric>
- #include <iomanip>
- using namespace std;
- #define pii pair<int, int>
- #define FAST ios_base::sync_with_stdio(false); cin.tie(NULL)
- const int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
- const int MOD = 1e9;
- const int MAX = 100005;
- int n;
- int cow[MAX];
- int loc[MAX];
- struct fenwick{
- int arr[MAX];
- int size;
- void init(int p){
- size = p;
- }
- int query(int p) {
- int ret = 0;
- for (; p; p-=p&-p){
- ret += arr[p];
- }
- return ret;
- }
- void update(int p, int v) {
- for(; p < MAX; p+=p&-p){
- arr[p] += v;
- }
- }
- } a, b;
- int main() {
- FAST;
- freopen("sleepy.in", "r", stdin);
- freopen("sleepy.out", "w", stdout);
- cin >> n;
- for(int i = 1; i <= n; i++){
- cin >> cow[i];
- loc[cow[i]] = n + 1 - i;
- }
- a.init(n);
- b.init(n);
- int num_inversions = 0;
- int latest = 1e9;
- for(int i = 1; i <= n; i++){
- int q = a.query(loc[i]);
- // cout << i << " " << loc[i] << " " << q << "\n";
- if(q != 0){
- num_inversions += q;
- latest = min(latest, loc[i]);
- }
- a.update(loc[i], 1);
- }
- latest = n + 1 - latest;
- if(num_inversions == 0){
- cout << 0 << "\n";
- return 0;
- }
- cout << latest << "\n";
- for(int i = latest + 1; i <= n; i++){
- b.update(cow[i], 1);
- }
- for(int i = 1; i <= latest; i++){
- cout << latest - i + b.query(cow[i]);
- if(i != latest){
- cout << " ";
- }
- b.update(cow[i], 1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement