제출 #1164303

#제출 시각아이디문제언어결과실행 시간메모리
1164303asli_bgAkcija (COCI21_akcija)C++20
90 / 110
494 ms589824 KiB
#include<bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; #define int long long typedef pair<int,int> pii; typedef vector<pii> vii; typedef vector<int> vi; typedef vector<bool> vb; #define FOR(i,a) for(int i=0;i<(a);i++) #define FORE(i,a,b) for(int i=(a);i<(b);i++) #define all(x) x.begin(),x.end() #define fi first #define se second #define pb push_back #define sp <<" "<< #define cont(x) for(auto el:x) cout<<el<<' ';cout<<endl; #define contp(x) for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl; #define DEBUG(x) cout<<#x sp x<<endl; #define carp(x,y) ((x%MOD)*(y%MOD))%MOD #define topla(x,y) ((x%MOD)+(y%MOD))%MOD #define mid (l+r)/2 const int MAXN=2e3+5; const int INF=1e18; int n,k; vii a; int c; struct Segt{ //segment tree için vi t, lazy; //fracturing search için bitset<2005> cikar; //hangileri çıkacak ya da çıkmayacak //1--> kesin çıkar //0--> free set<int> vec; //hangi elemanlar var int bas; //ilk "bas" elemanı kesin alacam //answerı bulmak için vi tut; int cost; int sz; void build(int nd=1,int l=1,int r=n){ if(l==r){ t[nd]=r; return; } build(nd*2,l,mid); build(nd*2+1,mid+1,r); t[nd]=min(t[nd*2],t[nd*2+1]); } void push(int nd,int l,int r){ if(lazy[nd]==0) return; if(l==r) return; t[nd*2]+=lazy[nd]; t[nd*2+1]+=lazy[nd]; lazy[nd*2]+=lazy[nd]; lazy[nd*2+1]+=lazy[nd]; lazy[nd]=0; } int query(int ql,int qr,int nd=1,int l=1,int r=n){ if(l>r or l>qr or r<ql) return INF; push(nd,l,r); if(ql<=l and r<=qr) return t[nd]; auto bir=query(ql,qr,nd*2,l,mid); auto iki=query(ql,qr,nd*2+1,mid+1,r); return min(bir,iki); } void update(int ql,int qr,int val,int nd=1,int l=1,int r=n){ if(l>r or l>qr or r<ql) return; push(nd,l,r); if(ql<=l and r<=qr){ t[nd]+=val; lazy[nd]=val; return; } update(ql,qr,val,nd*2,l,mid); update(ql,qr,val,nd*2+1,mid+1,r); t[nd]=min(t[nd*2],t[nd*2+1]); } int query2(int nd=1,int l=1,int r=n){ push(nd,l,r); if(l==r){ if(t[nd]!=0) return 0; else return l; } if(t[nd*2+1]==0) return query2(nd*2+1,mid+1,r); else return query2(nd*2,l,mid); } void calc(){ vector<vii> ss(n+1); vb used(n+1,false); for(auto el:vec) used[el]=true; FORE(i,1,n+1){ if(cikar[i]==0 and !used[i]){ //if free and not included ss[a[i].se].pb({a[i].fi,i}); } } set<pii> cur; for(int i=n;i>0;i--){ //i'den büyük min costlu eleman for(auto el:ss[i]) cur.insert(el); if(!cur.empty()) tut[i]=cur.begin()->se; else tut[i]=-1; } } Segt(bitset<2005> cikar,int bas) : cikar(cikar), bas(bas) { t=vi (3*n+100); lazy= vi(3*n+100); tut=vi(n+1); sz=0; cost=0; build(); FORE(i,1,n+1){ if(cikar[i]==0 and query(a[i].se,n)>0){ //alabilirim bu ürünü update(a[i].se,n,-1); sz++; cost+=a[i].fi; vec.insert(i); } } calc(); } }; bool operator<(const Segt&a , const Segt &b){ if(a.sz==b.sz) return a.cost>b.cost; return a.sz<b.sz; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>k; a.resize(n+1); FORE(i,1,n+1) cin>>a[i].fi>>a[i].se; //weightlere göre sortla a'yı sort(all(a)); priority_queue<Segt> pq; bitset<2005> temp; pq.push(Segt(temp,0)); while(k and !pq.empty()){ auto cur=pq.top(); pq.pop(); cout<<cur.sz sp cur.cost<<endl; if(cur.vec.size()==cur.bas){ k--; continue; } auto it=cur.vec.begin(); int ind=0; while(ind<cur.bas){ it++; ind++; } Segt yeni=cur; while(it!=cur.vec.end()){ //i.yi çıkarıyorum //d[i]'den küçük ilk sıfırı bul = c de //j = d[j]'si c'den büyük min costlu eleman //j'yi eklicem int el=*it; //i'yi çıkar yeni.cikar[el]=1; yeni.bas=ind; yeni.update(a[el].se,n,1); yeni.vec.erase(el); yeni.sz--; yeni.cost-=a[el].fi; //j'yi ekle int c=yeni.query2()+1; int j=cur.tut[c]; if(j!=-1){ yeni.update(a[j].se,n,-1); yeni.vec.insert(j); yeni.sz++; yeni.cost+=a[j].fi; } yeni.calc(); pq.push(yeni); it++; ind++; yeni=cur; } k--; } while(k--) cout<<0 sp 0<<endl; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...