bartekltg

mop

Dec 9th, 2021 (edited)
472
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdint>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <iterator>
  6. #include <string>
  7. #include <numeric>
  8.  
  9. using namespace std;
  10.  
  11. constexpr int64_t M = 1000000007;
  12.  
  13. class drzewko{
  14.  
  15.     vector <vector<int>> wartosci2d;
  16.     int64_t total;
  17.     int levels;
  18.  
  19. public:
  20.     drzewko(int m){
  21.         wartosci2d.push_back(vector<int>(m,0));
  22.         while (m>1){
  23.             m = (m+1)/2;
  24.             wartosci2d.push_back(vector<int>(m,0));
  25.         }
  26.         total=0;
  27.     }
  28.  
  29.     void update_K(int i, int K){
  30.         wartosci2d[0][i]=K;
  31.         int level = 1;
  32.         for (level = 1; level<wartosci2d.size(); level++){
  33.            i=i/2;
  34.            wartosci2d[level][i]=(K+wartosci2d[level][i])%M;
  35.         };
  36.         total = (total+K)%M;
  37.     }
  38.  
  39.     int suma(int i){//suma od 0 do k bez k.
  40.         i--;
  41.         int64_t aku = 0;
  42.  
  43.         if (i==-1) return 0;
  44.          int level=0;
  45.         while (i>=0){
  46.  
  47.             if (i%2==0){
  48.                 aku = (aku + wartosci2d[level][i] )%M;
  49.                 i = i/2-1;
  50.             }else{
  51.                 i = i/2;
  52.             }
  53.             level++;
  54.         }
  55.         return aku;
  56.     }
  57.     int suma_od(int k){//suma od k do konca.
  58.         return (M + total - suma(k))%M;
  59.     }
  60. };
  61.  
  62.  
  63.  
  64. int main(){
  65.     ios_base::sync_with_stdio(0);
  66.     cin.tie(0);
  67.  
  68.     int n;
  69.     cin>>n;
  70.  
  71.     vector<int64_t> a, cS, sort_S;
  72.     a.push_back(0);
  73.  
  74.     vector<pair<int64_t, int64_t>> sor;
  75.  
  76.     copy_n(istream_iterator<int64_t>(cin),n,back_inserter(a));
  77.  
  78.     partial_sum(begin(a), end(a), back_inserter(cS), [](int64_t x, int64_t y) {return (x+y)%M; } );
  79.  
  80.     vector<int64_t> K (n+1,0);
  81.  
  82.     K[0]=1;
  83.  
  84.     for (int i=0; i<=n; i++){
  85.         sor.push_back(make_pair( cS[i], i ));
  86.     }
  87.     sort(begin(sor), end(sor));
  88.  
  89.     vector<int> indeksy(n+1,0);
  90.  
  91.     sort_S.resize(n+1);
  92.     for (int i=0; i<=n; i++){
  93.         indeksy[sor[i].second]=i;
  94.         sort_S[i]=sor[i].first;
  95.     }
  96.  
  97.     drzewko parzyste(n+1);
  98.     drzewko nieparzyste(n+1);
  99.  
  100.     parzyste.update_K(indeksy[0],1);
  101.  
  102.     K[0]=1;
  103.     for (int k=1; k<=n; k++){
  104.         int podzial = upper_bound(begin(sort_S),end(sort_S),cS[k]) - sort_S.begin();
  105.         int64_t aku=0;
  106.         if (cS[k]%2==0){
  107.             aku+= parzyste.suma(podzial);
  108.             aku+=nieparzyste.suma_od(podzial);
  109.         }else  {
  110.             aku+= nieparzyste.suma(podzial);
  111.             aku+= parzyste.suma_od(podzial);
  112.         }
  113.         K[k] = aku;
  114.         if (cS[k]%2==0){
  115.             parzyste.update_K(indeksy[k],aku);
  116.         }else{
  117.             nieparzyste.update_K(indeksy[k],aku);
  118.         }
  119.     }
  120.     cout<<K[n]<<endl;
  121.     return 0;
  122. }
  123.  
  124.  
Add Comment
Please, Sign In to add comment