답안 #721855

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
721855 2023-04-11T07:55:37 Z n0sk1ll Bali Sculptures (APIO15_sculpture) C++14
0 / 100
1 ms 340 KB
#include <bits/stdc++.h>

#define FAST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);cerr.tie(0)
#define mp make_pair
#define xx first
#define yy second
#define pb push_back
#define pf push_front
#define popb pop_back
#define popf pop_front
#define all(x) x.begin(),x.end()
#define ff(i,a,b) for (int i = a; i < b; i++)
#define fff(i,a,b) for (int i = a; i <= b; i++)
#define bff(i,a,b) for (int i = b-1; i >= a; i--)
#define bfff(i,a,b) for (int i = b; i >= a; i--)

using namespace std;
long double typedef ld;
unsigned int typedef ui;
long long int typedef li;
pair<int,int> typedef pii;
pair<li,li> typedef pli;
pair<ld,ld> typedef pld;
vector<vector<int>> typedef graph;
unsigned long long int typedef ull;
//const int mod = 998244353;
const int mod = 1000000007;







//Note to self: Check for overflow

li a[2006];
li pre[2006];

int reach[2006]; //koliko najvise sme udesno
int dp[2006]; //za svaki suffix, koliko minimalno treba particija
int nreach[2006];

int main()
{
    FAST;

    int n,k; cin>>n>>k>>k;
    fff(i,1,n) cin>>a[i];
    fff(i,1,n) pre[i]=pre[i-1]+a[i];

    bool mostbit=false;
    //da li je most bit odredjen?

    li ans=0;

    bff(b,0,50)
    {
        if (!mostbit)
        {
            int kolko=1;
            li tsum=0;
            fff(i,1,n)
            {
                if (a[i]>=(1ll<<b)) goto setmostbit;
                tsum+=a[i];
                if (tsum>=(1ll<<b)) tsum=0,kolko++;
            }
            if (kolko>k) goto setmostbit;

            continue;

            setmostbit:
                int r=0;
                tsum=0;
                fff(i,1,n)
                {
                    while (r<n && tsum+a[r+1]<(1ll<<(b+1))) tsum+=a[++r];
                    reach[i]=r,tsum-=a[i];
                }
                ans|=(1ll<<b);
                mostbit=true;
        }
        else
        {
            fff(i,1,n) dp[i]=mod;
            dp[n+1]=0;

            bfff(i,1,n)
            {
                bool curi=0; //current iskljucen
                fff(j,i,n)
                {
                    curi^=((bool)((1ll<<b)&a[j]));
                    if (!curi && j<=reach[i]) dp[i]=min(dp[i],dp[j+1]+1),nreach[i]=j;
                }
            }

            if (dp[1]>k) ans|=(1ll<<b);
            else
            {
                fff(i,1,n) reach[i]=nreach[i];
            }
        }
    }

    cout<<ans<<"\n";
}

//Note to self: Check for overflow

/*

6 1 3
8 1 2 1 5 4

10 1 10
1 1 1 1 1 1 1 1 1 1

*/
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 324 KB Output is correct
4 Correct 1 ms 320 KB Output is correct
5 Incorrect 1 ms 212 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Incorrect 1 ms 340 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 324 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 324 KB Output is correct
5 Incorrect 1 ms 340 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 320 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Incorrect 1 ms 340 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 324 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 256 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Incorrect 1 ms 340 KB Output isn't correct
6 Halted 0 ms 0 KB -