Advertisement
MinhNGUYEN2k4

Code no AC

Mar 19th, 2021
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. //Nguyen Huu Hoang Minh
  2. #include <bits/stdc++.h>
  3. #define sz(x) int(x.size())
  4. #define all(x) x.begin(),x.end()
  5. #define reset(x) memset(x, 0,sizeof(x))
  6. #define pb push_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define N 100005
  11. #define remain(x) if (x > MOD) x -= MOD
  12. #define ii pair<int, int>
  13. #define iiii pair< ii , ii >
  14. #define viiii vector< iiii >
  15. #define vi vector<int>
  16. #define vii vector< ii >
  17. #define bit(x, i) (((x) >> (i)) & 1)
  18. #define Task "test"
  19. #define int long long
  20.  
  21. using namespace std;
  22.  
  23. typedef long double ld;
  24. const int inf = 1e10;
  25. const int minf = -1e10;
  26. const int mod = 1000000007;
  27.  
  28. int n, a[N];
  29. vector<vector<int>> bit;
  30.  
  31. void readfile()
  32. {
  33.     ios_base::sync_with_stdio(false);
  34.     cin.tie(0);cout.tie(0);
  35.     if (fopen(Task".inp","r"))
  36.     {
  37.         freopen(Task".inp","r",stdin);
  38.         //freopen(Task".out","w",stdout);
  39.     }
  40.     cin >> n;
  41.     for(int i=1; i<=n; i++) cin >> a[i];
  42. }
  43.  
  44. int res = 0;
  45.  
  46. void preproc()
  47. {
  48.     vector<int> b(n+1,inf);
  49.     b[0] =  minf;
  50.     for(int i=1; i<=n; i++)
  51.     {
  52.         int k = lower_bound(b.begin(),b.end(),a[i])-b.begin();
  53.         res = max(res,k);
  54.         b[k] = a[i];
  55.     }
  56. }
  57.  
  58. void compress()
  59. {
  60.     set<int> s(a+1,a+1+n);
  61.     vector<int> b(s.begin(),s.end());
  62.     for(int i=1; i<=n; i++)
  63.     {
  64.         int x = a[i];
  65.         int k = lower_bound(b.begin(),b.end(),x)-b.begin()+1;
  66.         a[i] = k;
  67.     }
  68. }
  69.  
  70. void up(int val, int i, int k)
  71. {
  72.     for(; i <= n; i += i & -i) bit[i][k] = (bit[i][k]+val)%mod;
  73. }
  74.  
  75. int get(int x, int k)
  76. {
  77.     int ans = 0;
  78.     for(; x > 0; x -= x & -x) ans += bit[x][k];
  79.     return ans%mod;
  80. }
  81.  
  82. int f[N][1005];
  83.  
  84. void proc()
  85. {
  86.     compress();
  87.     bit.resize(n+2,vector<int>(res+2,0));
  88.     for(int i=1; i<=n; i++)
  89.     {
  90.         for(int k=1; k<=res; k++)
  91.         {
  92.             if (k==1)
  93.             {
  94.                 f[i][k] = 1;
  95.                 up(f[i][k],a[i],k);
  96.             }
  97.             else{
  98.                 f[i][k] = (f[i][k] + get(a[i]-1,k-1))%mod;
  99.                 up(f[i][k],a[i],k);
  100.             }
  101.         }
  102.     }
  103.     int ans =0;
  104.     for(int i=res; i<=n; i++) ans = (ans + f[i][res])%mod;
  105.     cout << ans;
  106. }
  107.  
  108. signed main()
  109. {
  110.     readfile();
  111.     preproc();
  112.     proc();
  113.     return 0;
  114. }
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement