제출 #1306373

#제출 시각아이디문제언어결과실행 시간메모리
1306373HoriaHaivasPopeala (CEOI16_popeala)C++20
17 / 100
1558 ms9284 KiB
#include<bits/stdc++.h> #define debug(x) cerr << #x << " " << x << "\n" #define debugs(x) cerr << #x << " " << x << " " #pragma GCC optimize("Ofast") #define int long long using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int range_rng(int l, int r) { return uniform_int_distribution<int>(l,r)(rng); } struct operatie { int l; int r; int x; }; bool got[55][20005]; int score[55]; int dp[20005][55]; int dp2[20005][55]; vector<operatie> st[55]; pair<int,int> interval[55]; const int inf=1e10; struct Node { int minval; int lazy; }; class AINT { public: Node aint[80005]; void build(int l, int r, int val) { if (l==r) { aint[val].minval=0; aint[val].lazy=0; return; } int mid; mid=(l+r)/2; build(l,mid,val*2); build(mid+1,r,val*2+1); aint[val].minval=min(aint[val*2].minval,aint[val*2+1].minval); aint[val].lazy=0; } void prop(int val, int l, int r) { if (aint[val].lazy==0) return; aint[val].minval+=aint[val].lazy; if (l!=r) { aint[val*2].lazy+=aint[val].lazy; aint[val*2+1].lazy+=aint[val].lazy; } aint[val].lazy=0; } void lazy_update(int l, int r, int val, int qa, int qb, int x) { prop(val,l,r); if (qa<=l && r<=qb) { aint[val].lazy+=x; return; } int mid; mid=(l+r)/2; if (qa<=mid) lazy_update(l,mid,val*2,qa,qb,x); if (qb>mid) lazy_update(mid+1,r,val*2+1,qa,qb,x); prop(val*2,l,mid); prop(val*2+1,mid+1,r); aint[val].minval=min(aint[val*2].minval,aint[val*2+1].minval); } int query(int l, int r, int val, int qa, int qb) { prop(val,l,r); if (qa<=l && r<=qb) { return aint[val].minval; } int mid,ans; ans=inf; mid=(l+r)/2; if (qa<=mid) ans=min(ans,query(l,mid,val*2,qa,qb)); if (qb>mid) ans=min(ans,query(mid+1,r,val*2+1,qa,qb)); return ans; } } aint[55]; int sum(int l, int r) { int ans,i; ans=0; for (i=l; i<=r; i++) { ans+=score[i]; } return ans; } signed main() { /* ifstream fin("arbore.in"); ofstream fout("arbore.out"); */ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t,n,s,i,j,k,ceva,previ,l; bool ok; string nush; cin >> n >> t >> s; for (i=1; i<=t; i++) cin >> score[i]; for (i=1; i<=n; i++) { cin >> nush; for (j=0; j<nush.size(); j++) { if (nush[j]=='0') got[i][j+1]=0; else got[i][j+1]=1; } } for (i=1; i<=s; i++) { aint[i].build(1,t,1); if (i!=1) aint[i].lazy_update(1,t,1,1,i-1,inf); } for (i=1; i<=n; i++) { interval[i].first=0; interval[i].second=0; } for (j=1; j<=s; j++) { for (i=1; i<=t; i++) { for (k=1; k<=n; k++) { if (got[k][i]==0) { ///sterge i intervalul if (interval[k].first!=0 && interval[k].second!=0) { interval[k].first=0; interval[k].second=0; } while (!st[k].empty()) { aint[j].lazy_update(1,t,1,st[k].back().l,st[k].back().r,-st[k].back().x); st[k].pop_back(); } } else { ///ajusteaza i intervalul if (interval[k].first==0 && interval[k].second==0) { interval[k].first=i; interval[k].second=i; } else { interval[k].second++; } st[k].push_back({interval[k].first,interval[k].second,score[i]}); aint[j].lazy_update(1,t,1,interval[k].first,interval[k].second,score[i]); } } if (j!=1) dp[i][j]=aint[j].query(1,t,1,1,i); else dp[i][j]=aint[j].query(1,t,1,1,1); if (i+1<=t) aint[j+1].lazy_update(1,t,1,i+1,i+1,dp[i][j]); } for (k=1;k<=n;k++) { st[k].clear(); interval[k].first=0; interval[k].second=0; } } for (i=1; i<=s; i++) cout << dp[t][i] << "\n"; /* for (i=0; i<=t; i++) { for (j=0; j<=s; j++) { dp2[i][j]=inf; } } dp2[0][0]=0; for (i=1; i<=t; i++) { for (j=1; j<=s; j++) { for (previ=0; previ<i; previ++) { ceva=0; for (k=1; k<=n; k++) { ok=true; for (l=previ+1; l<=i; l++) { if (!got[k][l]) ok=false; } if (ok) ceva+=sum(previ+1,i); } dp2[i][j]=min(dp2[i][j],dp2[previ][j-1]+ceva); } } } for (i=1; i<=s; i++) cout << dp2[t][i] << "\n"; */ return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...