/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 2ms 540.0 KiB
#2 Accepted 2ms 540.0 KiB
#3 Accepted 19ms 772.0 KiB
#4 Accepted 6ms 832.0 KiB
#5 Accepted 9ms 1.277 MiB
#6 Accepted 19ms 712.0 KiB
#7 Accepted 5ms 996.0 KiB
#8 Accepted 5ms 896.0 KiB
#9 Accepted 10ms 1.0 MiB
#10 Accepted 11ms 540.0 KiB
#11 Accepted 7ms 700.0 KiB
#12 Accepted 26ms 1.68 MiB
#13 Accepted 40ms 1.953 MiB
#14 Accepted 54ms 1.973 MiB
#15 Accepted 35ms 2.965 MiB
#16 Accepted 63ms 2.828 MiB
#17 Accepted 61ms 2.645 MiB

Code

#include <bits/stdc++.h>
using namespace std;
#define SC               scanf
#define PF               printf
#define ull              unsigned long long
#define ld               long double
#define F                first
#define S                second
#define pb               push_back
#define sort_a(a)        sort(a.begin(),a.end());
#define sort_d(a)        sort(a.rbegin(),a.rend());
#define READ(f)          freopen(f, "r", stdin)
#define WRITE(f)         freopen(f, "w", stdout)
#define rev(s)           reverse(s.begin(),s.end())
#define P(ok)            cout << (ok ? "YES\n": "NO\n")
#define __Heart__              ios_base :: sync_with_stdio(false); cin.tie(NULL);
#define ll long long
typedef pair< ll , ll>                   PII;
const int sz = 6 * 10e3 + 5;
bool notPrime[sz] ;
int parent[sz] , sizeofNode[sz] , n , k ;
vector < int > prime ;
map < int , set < int >> mp ;
int find_set(int v) {
    if (v == parent[v]) return v;
    return parent[v] = find_set(parent[v]);
}
void union_sets(int a, int b) {
    int x = find_set(a);
    int y = find_set(b);

    if (x != y) {
        if (sizeofNode[x] < sizeofNode[y]) swap(x, y);
        parent[y] = x;
        sizeofNode[x] += sizeofNode[y];
    }
}
bool withinRange(int i , int j ,int k){
    return (i <= k  && k <= j) ? 1 : 0 ;
}

int gcd(int a, int b)
{
    if (a == b) return a;
    if (a == 0) return b;
    if (b == 0) return a;

    if (~a & 1)
    {
        if (b & 1) return gcd(a >> 1, b);
        else return gcd(a >> 1, b >> 1) << 1;
    }

    if (~b & 1) return gcd(a, b >> 1);
    if (a > b) return gcd((a - b) >> 1, b);
    return gcd((b - a) >> 1, a);
}
void seive()
{
    for(int  i = 4 ; i < sz ; i += 2) notPrime[i] = 1 ;
    int k = sqrt(sz);
    for(int i = 3 ; i < k ; i += 2)
    {
        for(int j = i*i ; j < sz ; j += i) notPrime[j] = 1 ;
    }
    prime.pb(2) ;
    for(int i = 3  ; i < sz ; i += 2) if(!notPrime[i]) prime.pb(i) ;
}
void primefactor(int n , int pos)
{
    for(int i = 0; prime[i] <= sqrt(n) && i < prime.size(); i++)
    {
        if(n % prime[i] == 0)
        {
            while(n % prime[i] == 0) n /= prime[i] ;
            mp[prime[i]].insert(pos) ;
        }
    }
    if(n != 1) mp[n].insert(pos);

}

void solve()
{
   cin >> n >> k ; int a[n + 5]; ll Ans = 0 ;
   vector < int > disjointArray[n + 5] , v[n + 5];
   multiset < int , greater < > > temp ;
   set < int > pos ;
   mp.clear() ;
   for(int i = 1 ; i <= n ; i++){
    parent[i] = i , sizeofNode[i] = 1 , cin >> a[i] , primefactor(a[i] , i);
    disjointArray[i].clear() ;
    v[i].clear() ;
   }

   /*for(int i = 1 ; i <= n  ; i++){
    for(int j = i + 1 ; j <= n ; j++){
        if(gcd(a[i] , a[j]) > 1) union_sets(i , j) ;
    }
   }*/

   for(auto it : mp){
        int firstValue = 0 ;
       for(auto kt : mp[it.F]){
        if(firstValue) union_sets(firstValue , kt) ;
        else firstValue = kt,union_sets(firstValue , kt)  ;
       }
   }

   for(int i = 1 ; i <= n ; i++){
        int par = find_set(i) ;
     disjointArray[par].pb(i) ;
     pos.insert(par) ;
   }
  // for(auto it : pos) cout << it << " " ; cout << endl ;

  /* for(auto it : pos){
    for(auto kt : disjointArray[it]) cout << kt << " " ;
    cout << endl ;
   } */

   for(int i = 1 ; i <= n ; i++){
    for(auto it : disjointArray[i]){
        temp.insert(a[it]) ;
    }
    for(auto it : temp) v[i].pb(it) ;
    temp.clear() ;
   }

   /*  for(int i = 1 ; i <= n ; i++){
        cout << i << " printing... " << endl ;
       while(!pq[i].empty()){
        cout << pq[i].top() << " " ;
        pq[i].pop() ;
       }
     cout << endl ;

   } */

   for(int i = 1 ; i <= n - k + 1 ; i++){
        ll tempSum = 0 , cnt = 0 , p = 0;
       // cout << "range " << i << " " << i + k - 1 << endl ;
      for(auto it : pos){
            if(cnt == k) break ;
            p = 0 ;
         //   cout <<it << " printing" << endl ;
        for(auto kt : disjointArray[it]){
            if(withinRange(i , i + k - 1 , kt) && cnt < k){
            //    cout << pq[it].top() << " " ;
                tempSum += v[it][p] ;
                p++ ;
                cnt++ ;
            }
           if (cnt == k) break ;
        }
      //  cout << endl ;
      }
      Ans = max(Ans , tempSum) ;
    //  cout << i << " ---- " << Ans << endl ;
   }
   cout << Ans << "\n" ;

}
int main()
{
     __Heart__
     seive() ;
     int t ; cin >> t ; while(t--) solve() ;
}

Information

Submit By
Type
Submission
Problem
P1063 Another Maximum Sum in Subarray
Language
C++20 (G++ 13.2.0)
Submit At
2024-07-14 12:59:14
Judged At
2024-07-14 12:59:14
Judged By
Score
100
Total Time
63ms
Peak Memory
2.965 MiB