제출 #86010

#제출 시각아이디문제언어결과실행 시간메모리
86010liwiBali Sculptures (APIO15_sculpture)C++11
37 / 100
13 ms5088 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;
typedef tree<pair<int,int>, null_type, less<pair<int,int>>, rb_tree_tag,tree_order_statistics_node_update> ordered_set;

#define scan(x) do{while((x=getchar())<'0'); for(x-='0'; '0'<=(_=getchar()); x=(x<<3)+(x<<1)+_-'0');}while(0)
char _;
#define println printf("\n");
#define readln(x) getline(cin,x);
#define pb push_back
#define endl "\n"
#define MOD 1000000007
#define mp make_pair

#define MAXN 2005

typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
typedef unordered_map<int,int> umii;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<int,pii> triple;
typedef int8_t byte;

ll gcd(ll a, ll b) {return b == 0 ? a : gcd(b, a % b);}
ll fpow(ll  b, ll exp, ll mod){if(exp == 0) return 1;ll t = fpow(b,exp/2,mod);if(exp&1) return t*t%mod*b%mod;return t*t%mod;}
ll divmod(ll i, ll j, ll mod){i%=mod,j%=mod;return i*fpow(j,mod-2,mod)%mod;}

int num_elements,A,B,shift;
bool dp[MAXN][MAXN];
ll arr[MAXN],psa[MAXN],current,temp;

inline string getBinary(int num){
    string res = "";
    for(int i=4; i>=0 ;i--)
        if(num&(1<<i)) res+="1";
        else res+="0";
        return res;
}

inline bool valid(ll sum){
    ll first = ~(sum>>shift);
    //string a = getBinary(first), b = getBinary(temp>>shift);
    //cout<<a<<" "<<b<<endl;
    if((first&(temp>>shift)) == (temp>>shift)) return true;
    return false;
}

inline void solve(){
    memset(dp,false,sizeof dp);
    dp[0][0] = true;
    for(int i=1; i<=num_elements; i++){ //idx
        for(int k=1; k<=B; k++){ //groups
            for(int v=i-1; v>=0; v--){ //size of group
                ll sum = psa[i]-psa[v];
                if(valid(sum) && dp[v][k-1]){
                    dp[i][k] = true;
                    break;
                }
            }
        }
    }
}

int main(){
    scanf("%d %d %d",&num_elements,&A,&B);
    for(int i=1; i<=num_elements; i++){
        scanf(" %lld",&arr[i]);
        psa[i] = psa[i-1]+arr[i];
    }
    int lg = (int)log2(psa[num_elements]);
    for(int i=lg; i>=0; i--){
        shift = i;
        temp^=(1<<i);
        solve();
        bool works = false;
        for(int k=A; k<=B; k++){
            if(dp[num_elements][k]){
                works = true;
                break;
            }
        }
        if(!works){
            current^=(1<<i);
            temp^=(1<<i);
        }
    }
    printf("%lld\n",current);
}
/*
6 2 2
2 3 1 2 4 6
ans=11
*/

컴파일 시 표준 에러 (stderr) 메시지

sculpture.cpp: In function 'std::__cxx11::string getBinary(int)':
sculpture.cpp:39:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
     for(int i=4; i>=0 ;i--)
     ^~~
sculpture.cpp:42:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
         return res;
         ^~~~~~
sculpture.cpp: In function 'int main()':
sculpture.cpp:70:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d",&num_elements,&A,&B);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sculpture.cpp:72:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf(" %lld",&arr[i]);
         ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...