一开始就明白那个N*1《k的算法了,
可无奈删除操作耗时还是太多,最后学习了STL set,map相应的用法,方便好多。
STL真的是一个好工具
#include<iostream> #include<cstdio> #include<map> #include<set> #include<vector> #include<cstring> using namespace std; multiset<int> a[60005]; int x[60005][6]; int main() { int n,k,op,num; while(scanf("%d%d",&n,&k)!=EOF) { for(int i=0;i<1<<k;i++) a[i].clear(); for(int i=1;i<=n;i++) { scanf("%d",&op); if(op==0) { for(int j=0;j<k;j++) scanf("%d",&x[i][j]); for(int j=0;j<1<<k;j++) { int s=0; for(int q=0;q<k;q++) { if(j&1<<q) s+=x[i][q]; else s-=x[i][q]; } a[j].insert(s); } } else { scanf("%d",&num); for(int j=0;j<1<<k;j++) { int s=0; for(int q=0;q<k;q++) { if(j&1<<q) s+=x[num][q]; else s-=x[num][q]; } multiset<int>::iterator sum=a[j].find(s); a[j].erase(sum); } } int ans=-100000000; for(int j=0;j<1<<k;j++) { multiset<int>::iterator t=a[j].end(); t--; int t1=(*t); t=a[j].begin(); int t2=(*t); ans=max(ans,t1-t2); } printf("%d ",ans); } } return 0; }
接下来是POJ2926这道题用上面的方法奇葩的是G++WA,C++TLE,,无语中。。。
把multiset去了稍微改一下就过了,,囧,,,,
#include<iostream> #include<cstdio> #include<cstring> #include<map> #include<set> #define inf 999999999 using namespace std; double x[100005][6]; double a[1<<5+1][2]; int main() { int n; scanf("%d",&n); { for(int i=0;i<1<<5;i++) { a[i][0]=-inf; a[i][1]=inf; } for(int qq=1;qq<=n;qq++) { for(int j=0;j<5;j++) scanf("%lf",&x[qq][j]); for(int i=0;i<(1<<5);i++) { double sum=0; for(int j=0;j<5;j++) { if(i&(1<<j)) sum+=x[qq][j]; else sum-=x[qq][j]; } if(sum>=a[i][0]) a[i][0]=sum; if(sum<=a[i][1]) a[i][1]=sum;//是所有数的相减。。 } } double ans=-inf; for(int i=0;i<(1<<5);i++) { // printf("%.2lf %.2lf ",a[i][0],a[i][1]); double temp=a[i][0]-a[i][1]; ans=max(ans,temp); } printf("%.2lf ",ans); } return 0; }