mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-12-19 13:41:42 +00:00
Compare commits
2 Commits
80860dc70b
...
5a9d1efd5d
| Author | SHA1 | Date | |
|---|---|---|---|
| 5a9d1efd5d | |||
| 07d7cadbc7 |
3
.gitignore
vendored
3
.gitignore
vendored
@ -2,4 +2,5 @@
|
|||||||
/.cache
|
/.cache
|
||||||
test.*
|
test.*
|
||||||
*.in
|
*.in
|
||||||
*.ans
|
*.ans
|
||||||
|
*.out
|
||||||
@ -3,19 +3,19 @@
|
|||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <istream>
|
#include <istream>
|
||||||
|
#include <iterator>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <set>
|
#define printf
|
||||||
#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;
|
||||||
bool isnotok=false;
|
|
||||||
m.clear();
|
m.clear();
|
||||||
|
bool isnotok=false;
|
||||||
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,57 +25,85 @@ sl void solve(){
|
|||||||
isnotok=true;
|
isnotok=true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
last=a;
|
|
||||||
m[a]+=b;
|
m[a]+=b;
|
||||||
|
last=a;
|
||||||
}
|
}
|
||||||
while(q--){
|
while(q--){
|
||||||
ll nq;
|
ll nq,ans=0;
|
||||||
std::cin>>nq;
|
std::cin>>nq;
|
||||||
printf("getq = %lld\n",nq);
|
auto nm = m;
|
||||||
auto nm=m;
|
if(nm.empty()){
|
||||||
ll ans=0;
|
std::cout<<"-1\n";
|
||||||
while(nm.size()){
|
continue;
|
||||||
|
}
|
||||||
|
while(nm.size()&&nq){
|
||||||
|
P(nq);
|
||||||
auto pm = nm.lower_bound(nq);
|
auto pm = nm.lower_bound(nq);
|
||||||
if(nq==0||pm->first>nq)break;
|
if(pm==nm.begin()){
|
||||||
ans++;
|
ans=-1;
|
||||||
ll min=1e9+7;
|
break;
|
||||||
if(pm!=nm.end())pm++;
|
|
||||||
for(auto wp=nm.begin();wp!=pm;wp++){
|
|
||||||
min=std::min(min,wp->second);
|
|
||||||
}
|
}
|
||||||
printf("got min=%lld, pm->first=%lld\n",min,pm->first);
|
if(pm!=nm.end()&&pm->first>nq){
|
||||||
ll maxget = nq/pm->first;
|
if(pm!=nm.begin()){
|
||||||
printf("maxget=%lld\n",maxget);
|
pm--;
|
||||||
ll get=std::min(maxget,min);
|
}else{
|
||||||
printf("get=%lld\n",get);
|
ans=-1;
|
||||||
bool isrm=false;
|
break;
|
||||||
std::vector<decltype(nm.begin())> rm;
|
}
|
||||||
for(auto wp=nm.begin();wp!=pm;wp++){
|
}
|
||||||
if(isrm){
|
ll getnum = nq/(std::prev(pm)->first+1);
|
||||||
rm.push_back(wp);
|
P(std::prev(pm)->first+1);
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
wp->second-=get;
|
i->second-=getnum;
|
||||||
if(wp->second==0){
|
if(i->second==0){
|
||||||
isrm=true;
|
erasekey=i->first;
|
||||||
rm.push_back(wp);
|
iserase=true;
|
||||||
|
i=nm.erase(i);
|
||||||
|
}else{
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(auto i:rm){
|
if (erasekey) {
|
||||||
nm.erase(i);
|
auto p=nm.lower_bound(erasekey);
|
||||||
|
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;
|
|
||||||
std::cin>>T;
|
ll t;
|
||||||
while(T--){
|
std::cin>>t;
|
||||||
|
while(t--){
|
||||||
solve();
|
solve();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
100
src/11/17/P14508.cpp
Normal file
100
src/11/17/P14508.cpp
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
#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();
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user