Compare commits

..

No commits in common. "5a9d1efd5d7febcd43524a2a2679397ae5f213df" and "80860dc70ba0fab85105fd870749261f1fc86115" have entirely different histories.

3 changed files with 38 additions and 167 deletions

3
.gitignore vendored
View File

@ -2,5 +2,4 @@
/.cache /.cache
test.* test.*
*.in *.in
*.ans *.ans
*.out

View File

@ -3,19 +3,19 @@
#include <cstdio> #include <cstdio>
#include <iostream> #include <iostream>
#include <istream> #include <istream>
#include <iterator>
#include <map> #include <map>
#define printf #include <set>
#include <vector>
using ll = int64_t; using ll = int64_t;
#define sl static inline #define sl static inline
ll n,q; ll n,q;
std::map<ll, ll> m; std::map<ll, ll> m;
#define P(v)do{printf("[DEBUG] %s=%lld\n",#v,(v));}while(false)
sl void solve(){ sl void solve(){
std::cin>>n>>q; std::cin>>n>>q;
m.clear();
bool isnotok=false; bool isnotok=false;
m.clear();
ll last=-1; ll last=-1;
for(ll i=1;i<=n;i++){ for(ll i=1;i<=n;i++){
ll a,b; ll a,b;
@ -25,85 +25,57 @@ sl void solve(){
isnotok=true; isnotok=true;
continue; continue;
} }
m[a]+=b;
last=a; last=a;
m[a]+=b;
} }
while(q--){ while(q--){
ll nq,ans=0; ll nq;
std::cin>>nq; std::cin>>nq;
auto nm = m; printf("getq = %lld\n",nq);
if(nm.empty()){ auto nm=m;
std::cout<<"-1\n"; ll ans=0;
continue; while(nm.size()){
}
while(nm.size()&&nq){
P(nq);
auto pm = nm.lower_bound(nq); auto pm = nm.lower_bound(nq);
if(pm==nm.begin()){ if(nq==0||pm->first>nq)break;
ans=-1; ans++;
break; ll min=1e9+7;
if(pm!=nm.end())pm++;
for(auto wp=nm.begin();wp!=pm;wp++){
min=std::min(min,wp->second);
} }
if(pm!=nm.end()&&pm->first>nq){ printf("got min=%lld, pm->first=%lld\n",min,pm->first);
if(pm!=nm.begin()){ ll maxget = nq/pm->first;
pm--; printf("maxget=%lld\n",maxget);
}else{ ll get=std::min(maxget,min);
ans=-1; printf("get=%lld\n",get);
break; bool isrm=false;
} std::vector<decltype(nm.begin())> rm;
} for(auto wp=nm.begin();wp!=pm;wp++){
ll getnum = nq/(std::prev(pm)->first+1); if(isrm){
P(std::prev(pm)->first+1); rm.push_back(wp);
if(getnum==0){
ans=-1;
break;
}
for(auto i=nm.begin();i!=pm;i++){
getnum=std::min(getnum,i->second);
}
P(getnum);
nq-=getnum*(std::prev(pm)->first+1);
bool iserase=false;
ll erasekey=0;
for(auto i=nm.begin();i!=pm;){
if(iserase){
i=nm.erase(i);
continue; continue;
} }
i->second-=getnum; wp->second-=get;
if(i->second==0){ if(wp->second==0){
erasekey=i->first; isrm=true;
iserase=true; rm.push_back(wp);
i=nm.erase(i);
}else{
i++;
} }
} }
if (erasekey) { for(auto i:rm){
auto p=nm.lower_bound(erasekey); nm.erase(i);
for(;p!=nm.end();){
p=nm.erase(p);
}
} }
ans+=getnum;
}
P(nq);
P(nm.size());
if(nq!=0){
std::cout<<"-1\n";
continue;
} }
std::cout<<(ans==0?-1:ans)<<"\n"; std::cout<<(ans==0?-1:ans)<<"\n";
} }
} }
int main(){ int main(){
// std::iostream::sync_with_stdio(false); std::iostream::sync_with_stdio(false);
// std::cin.tie(nullptr); std::cin.tie(nullptr);
ll T;
ll t; std::cin>>T;
std::cin>>t; while(T--){
while(t--){
solve(); solve();
} }
} }

View File

@ -1,100 +0,0 @@
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <map>
#include <vector>
using ll = int64_t;
#define sl static inline
#define printf
const ll inf=1e9+7;
std::vector<ll> a,b,dp,dpf;
std::map<ll, ll> rstep;
ll n,m;
struct Mu{
ll num,idx;
inline bool operator<(const Mu&o)const{
return num<o.num;
}
};
std::vector<Mu> cminuse;
sl ll minuse(ll val){
if(cminuse[val].idx!=inf){
return cminuse[val].idx;
}
for(ll i=1;i<=m;i++){
const ll num = (val+a[i]-1)/a[i];
cminuse[val]=std::min(cminuse[val],{num*b[i],i});
}
return cminuse[val].idx;
}
sl void solve(){
ll ans=0;
std::cin>>n>>m;
a.clear(),b.clear(),dp.clear(),dpf.clear(),rstep.clear(),cminuse.clear();
a.resize(m+1),b.resize(m+1),dp.resize(n+1,inf),dpf.resize(n+1,inf),cminuse.resize(n+1,{inf,inf});
dp[0]=0;
for(ll i=1;i<=m;i++){
std::cin>>a[i];
}
for(ll i=1;i<=m;i++){
std::cin>>b[i];
}
for(ll i=1;i<=m;i++){
for(ll j=a[i];j<=n;j++){
const ll ndp=dp[j-a[i]]+b[i];
// printf("i=%lld, j=%lld, ndp=%lld\n",i,j,ndp);
if(ndp<dp[j]){
// printf("got new min %lld\n",ndp);
dp[j]=ndp;
dpf[j]=j-a[i];
}
}
}
for(ll i=1;i<=m;i++){
for(ll j=n-a[i];j>=1;j--){
dp[j]=std::min(dp[j],dp[j+a[i]]+b[i]);
}
}
printf("dp[]: ");
for(ll i=1;i<=n;i++){
printf("%lld ",dp[i]);
}
printf("\n");
printf("dpf[]: ");
for(ll i=1;i<=n;i++){
printf("%lld ",dpf[i]);
}
printf("\n");
printf("minuse(%lld)=%lld\n",n,minuse(n));
ll nuse=0;
for(ll i=1;i<=n;){
const ll use=minuse(n-i),k=i+a[use];
nuse+=b[use];
for(ll j=i+1;j<=k&&j<=n;j++){
if(dp[k-j]==inf){
std::cout<<"-1\n";
return;
}else{
ans=std::max(ans,dp[k-j]+nuse);
}
}
i=k;
}
std::cout<<ans<<"\n";
}
int main(){
#ifdef printf
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
#endif
ll c,t;
std::cin>>c>>t;
while(t--){
solve();
}
}