답안 #914170

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
914170 2024-01-21T10:16:38 Z PieArmy Kpart (eJOI21_kpart) C++17
30 / 100
2000 ms 2076 KB
    #include <bits/stdc++.h>
    using namespace std;
     
    int main(){
        ios_base::sync_with_stdio(false);cin.tie(NULL);
        int t;cin>>t;
        while(t--){
            int n;cin>>n;
            int arr[n];
            int pref[n+1];pref[0]=0;
            for(int i=0;i<n;i++){cin>>arr[i];pref[i+1]=pref[i]+arr[i];}
            vector<int>dp(100001,-1);
            vector<int>nex(n+1,-1);
            vector<int>prev(0);
            int mx=0;
            for(int i=0;i<n;i++){
                prev.resize(pref[i+1]+2,-1);
                prev[pref[i+1]+1]=mx;
                int l=prev.back(),r=pref[i+1]+1;
                while(l!=-1){
                    while(prev[r]>=l+arr[i]){
                        r=prev[r];
                    }
                    if(r==l+arr[i]){
                        dp[l+arr[i]]=max(dp[l+arr[i]],dp[l]);
                    }
                    else{
                        if(r==pref[i+1]+1)mx=l+arr[i];
                        prev[l+arr[i]]=prev[r];
                        prev[r]=l+arr[i];
                        dp[l+arr[i]]=dp[l];
                    }
                    l=prev[l];
                }
                prev[pref[i+1]+1]=-1;
                dp[arr[i]]=i;
                int las=0,pos=nex[0];
                while(pos!=-1){
                    int sum=pref[i+1]-pref[i+1-pos];
                    if((sum&1)||dp[sum>>1]<=i-pos)nex[las]=nex[pos];
                    else las=pos;
                    pos=nex[pos];
                }
                if((pref[i+1]&1)==0&&dp[pref[i+1]>>1]!=-1)nex[las]=i+1;
            }
            vector<int>ans;
            int pos=nex[0];
            while(pos!=-1){
                ans.push_back(pos);
                pos=nex[pos];
            }
            cout<<ans.size()<<" ";
            for(int x:ans)cout<<x<<" ";
            cout<<"\n";
        }
        return 0;
    }
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 860 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 856 KB Output is correct
2 Correct 31 ms 980 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 127 ms 1356 KB Output is correct
2 Correct 332 ms 1196 KB Output is correct
3 Correct 385 ms 1488 KB Output is correct
4 Correct 692 ms 1436 KB Output is correct
5 Correct 1570 ms 1848 KB Output is correct
6 Execution timed out 2041 ms 2076 KB Time limit exceeded
7 Halted 0 ms 0 KB -