标签:tmp maxx int sum long Strongest vector Build CF1574D
【题意】
给定n行数,每行$c_i$个,保证$a_{i,j}<a_{i,j+1}$,现在让你每行选出第$b_i$个元素,这种选择方案记为${b_1,b_2,...,b_n}$,给定m个不能选择的方案,问剩下的方案中和最大为多少
【分析】
先全选最大看合不合法,如果不行给m个依次替换一位找到合法的当中最大的即可
复杂度$O(nmlogm)$
【代码】
#include<bits/stdc++.h> using namespace std; typedef long long ll; vector <vector<int> > a,b; int n,m; int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); scanf("%d",&n); a.resize(n); for(int i=0;i<n;i++) { int x; scanf("%d",&x); a[i].resize(x); for(int j=0;j<x;j++) scanf("%d",&a[i][j]); } scanf("%d",&m); b.resize(m); for(int i=0;i<m;i++) { b[i].resize(n); for(int j=0;j<n;j++) { scanf("%d",&b[i][j]); b[i][j]--; } } sort(b.begin(),b.end()); vector <int> fin(n); for(int i=0;i<n;i++) fin[i]=int(a[i].size())-1; if(!binary_search(b.begin(),b.end(),fin)) { for(int i=0;i<n;i++) printf("%d ",fin[i]+1); printf("\n"); return 0; } vector <int> res(n,-1); int maxx=0; for(int i=0;i<m;i++) { vector <int> tmp=b[i]; int sum=0; for(int j=0;j<n;j++) sum+=a[j][tmp[j]]; for(int j=0;j<n;j++) if(tmp[j]!=0) { tmp[j]--; if(!binary_search(b.begin(),b.end(),tmp) && sum-a[j][tmp[j]+1]+a[j][tmp[j]]>maxx) { maxx=sum-a[j][tmp[j]+1]+a[j][tmp[j]]; res=tmp; } tmp[j]++; } } for(int i=0;i<n;i++) printf("%d ",res[i]+1); printf("\n"); return 0; }
vector真香啊
标签:tmp,maxx,int,sum,long,Strongest,vector,Build,CF1574D 来源: https://www.cnblogs.com/andylnx/p/15335320.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。