제출 #574430

#제출 시각아이디문제언어결과실행 시간메모리
574430Bad_day_toCodeKnapsack (NOI18_knapsack)C++17
100 / 100
117 ms36212 KiB
#include <bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; typedef tree< int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; #define ll long long int #define fo(i, n) for (ll i = 0; i < n; i++) #define Fo(i, k, n) for (ll i = k; i < n; i++) #define fvr(it, v) for (auto it = v.rbegin(); it != v.rend(); ++it) #define ALL(c) (c).begin(), (c).end() // handy for function like "sort()" #define mod 1000000007 #define ff first #define ss second const long long MOD = 998244353; const long long INF = 1e9 + 7; typedef vector<int> vi; typedef vector<vi> vvi; typedef vector<ll> vli; typedef pair<int, int> pii; long long sq(int x) { return 1ll * x * x; } const int MAXN = 20000001; // Sieve // ll d[MAXN], divCnt[MAXN]; // vector<ll> primes; // void sieve(ll n) // { // fo(i, n) // { // d[i] = i; // } // Fo(i, 2, n) // { // if (d[i] == i) // primes.push_back(i); // for (ll j = 0; j < ((ll)primes.size()) && primes[j] <= d[i] && primes[j] * i < n; j++) // { // d[i * primes[j]] = primes[j]; // } // } // Fo(i, 2, n) // { // ll j = i / d[i]; // divCnt[n] = divCnt[j] + (d[i] != d[j]); // } // } // ll primeFactors(ll n) // { // set<ll> factors; // while (n != 1) // { // factors.insert(d[n]); // n /= d[n]; // } // return factors.size(); // } ll mul(ll x, ll y) { return (x * 1ll * y) % MOD; } ll binpow(ll a, ll b, ll c) { ll res = 1; a = a % c; while (b > 0) { if (b & 1) res = (res * a) % c; b = b >> 1; a = (a * a) % c; } return res; } long long gcd(long long int a, long long int b) { if (b == 0) return a; return gcd(b, a % b); } // int fact[200043]; // void precalc() // { // fact[0] = 1; // for (int i = 1; i < 200043; i++) // fact[i] = mul(fact[i - 1], i); // } // Function to return LCM of two numbers // int lcm(int a, int b) // { // return (a / gcd(a, b)) * b; // } ll inv(ll x, ll c) { return binpow(x, c - 2, c); } // int divide(int x, int y, int c) // { // return mul(x, inv(y, c)); // } // int nCr(int n, int r, int c) // { // return divide(fact[n], mul(fact[r], fact[n - r]), c); // } bool cmp1(const pair<ll, ll> &a, const pair<ll, ll> &b) { if (a.first == b.first) { return a.second > b.second; } return a.first > b.first; } bool cmp2(const pair<ll, ll> &a, const pair<ll, ll> &b) { if (a.second == b.second) { return a.first < b.first; } return a.second > b.second; } ll find_sum(ll idx, vector<ll> &bit) { ll ans = 0; for (; idx > 0; idx -= idx & (-idx)) ans += bit[idx]; return ans; } void update(ll pos, ll val, vector<ll> &bit) { for (; pos <= bit.size(); pos += pos & (-pos)) { bit[pos] += val; } } void solve() { ll S,n; cin>>S>>n; map<ll,vector<pair<ll,ll>>> weight; fo(i,n){ ll v,w,k; cin>>v>>w>>k; weight[w].push_back({v,k}); } ll cur=1; ll dp[weight.size()+1][S+1]; fo(i,weight.size()+1){ fo(j,S+1)dp[i][j]=-LONG_LONG_MAX; } dp[0][0]=0; ll ans=0; for(auto& x:weight){ ll w=x.first; auto k=x.second; sort(ALL(k),cmp1); fo(i,S+1){ dp[cur][i]=dp[cur-1][i]; ll amount=0, a=0,p=0,used=0; while((amount+1)*w<=i && a<k.size()){ amount++; p+=k[a].first; if(dp[cur-1][i-amount*w]!=-LONG_LONG_MAX){ // cout<<dp[cur][i]<<" "<<i<<" "<<amount<<" "<<w<<" "<<cur<<endl; dp[cur][i]=max(dp[cur][i],dp[cur-1][i-amount*w]+p); ans=max(ans,dp[cur][i]); } used++; if(used==k[a].second){ used=0; a+=1; } } } cur+=1; } cout<<ans<<endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t, i = 0; t = 1; // freopen("feast.in", "r", stdin); // freopen("feast.out", "w", stdout); // cin >> t; while (t--) { i++; // cout<<"Case #"<<i<<": "; solve(); } }

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

knapsack.cpp: In function 'void update(long long int, long long int, std::vector<long long int>&)':
knapsack.cpp:148:16: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |     for (; pos <= bit.size(); pos += pos & (-pos))
      |            ~~~~^~~~~~~~~~~~~
knapsack.cpp: In function 'void solve()':
knapsack.cpp:17:35: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::map<long long int, std::vector<std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 | #define fo(i, n) for (ll i = 0; i < n; i++)
......
  168 |     fo(i,weight.size()+1){
      |        ~~~~~~~~~~~~~~~~~           
knapsack.cpp:168:5: note: in expansion of macro 'fo'
  168 |     fo(i,weight.size()+1){
      |     ^~
knapsack.cpp:182:39: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  182 |             while((amount+1)*w<=i && a<k.size()){
      |                                      ~^~~~~~~~~
#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...