Hướng dẫn giải của Bedao Regular Contest 07 - LIS


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Tác giả: bedao

Ta nhận thấy, tổng độ dài của các dãy con tăng ngặt dài nhất kết thúc tại ~i~ đạt được khi dãy đó được sắp xếp tăng dần. Vì vậy, ta có cách làm như sau:

  • Sắp xếp mảng tăng dần.
  • Duyệt từ ~1~ đến ~n~, với mỗi ~i~ ta cộng thêm vào kết quả tích của số lần xuất hiện của phần tử thứ ~i~ với số phần tử khác nhau từ ~1~ đến ~i~.

Lưu ý: Với mỗi phần tử khác nhau chỉ cộng một lần.

Code mẫu

#include <bits/stdc++.h>
#define int long long 
#define ii pair<int,int>
#define st first
#define nd second
using namespace std;
const int MOD = 1e9 + 7;
const int MAXN = 2e5 + 5;
int n, a[MAXN];
void program(){
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    sort (a + 1, a + n + 1);
    map<int,int> m;
    int ans = 0;
    for (int i = 1; i <= n; i++){
        m[a[i]]++;
        ans += (int)m.size();
    }
    cout << ans << endl;
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int test = 1;
    while (test --> 0){
        program();
    }
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.