bzoj4167 永远亭的竹笋采摘
来源:互联网 发布:剑三高冷正太捏脸数据 编辑:程序博客网 时间:2024/04/28 03:19
由于是随机数据,用分块加乱搞就可以水过。
详情参见大佬的博客:题解
贴个代码:
#include<cstdio> #include<cstring> #include<vector> #include<cmath> #include<algorithm> using namespace std; #define MAXN 50500 #define MAXM 250 int A[MAXN],n,k; const int inf=0x3c3c3c3c; void _r(int& x) { char c=getchar(); while(c<'0'||c>'9') { c=getchar(); } for(x=0;c>='0'&&c<='9';c=getchar()) { x=(x<<1)+(x<<3)+c-'0'; } return ; } #define lowbit(x) (x&-x) int tr[MAXN]; void modify(int x,int d) { for(;x<=n;x+=lowbit(x)) { tr[x]=min(tr[x],d); } return ; } int get(int x) { int an=inf; for(;x;x-=lowbit(x)) { an=min(an,tr[x]); } return an; } int size,dis[MAXN][MAXM],st[MAXN],top,num; int F[MAXN][MAXM*4+50]; vector<int>P[MAXN]; int cc=0;void work(int pos,int nn,int lim,int& an) { int up=min(nn*size,n),tmp; for(int i=lim;i<=up;i++) { tmp=abs(A[pos]-A[i]); if(tmp>0&&tmp<an) { an=tmp; if(an<get(i)) { modify(i,an); //printf("%d %d %d\n",++cc,pos,i); P[i].push_back(pos); } } } return ; } int main() { freopen("r.in","r",stdin); freopen("w.out","w",stdout); _r(n); _r(k); for(size=1;size*size<=n;++size); num=(n-1)/size+1; for(int i=1;i<=n;i++) { _r(*(A+i)); } memset(tr,0x3c,(n+1)<<2); memset(dis,0x3c,sizeof(dis)); int l,r; for(int i=1;i<=num;i++) { l=(i-1)*size+1; r=min(i*size,n); top=0; for(int j=l;j<=r;j++) { *(st+(++top))=A[j]; } sort(st+1,st+1+top); l=0; r=1; for(int j=1;j<=n;j++) { while(l<top&&*(st+l+1)<j) { ++l; } while(r<=top&&*(st+r)<=j) { ++r; } if(l>0) { dis[j][i]=min(dis[j][i],j-st[l]); } if(r<=top) { dis[j][i]=min(dis[j][i],st[r]-j); } } } int pos,tmp; for(int i=n;i>=1;i--) { pos=(i-1)/size+1; tmp=inf; for(int j=pos;j<=num;j++) { if(dis[A[i]][j]<tmp) { work(i,j,max(i,(pos-1)*size+1),tmp); } } } memset(F,0x3c,sizeof(F)); F[0][0]=0; for(int i=1;i<=n;i++) { F[i][0]=0; for(int j=1;j<=k;j++) { F[i][j]=F[i-1][j]; for(int p=0;p<(int)P[i].size();p++) { F[i][j]=min(F[i][j],F[P[i][p]-1][j-1]+abs(A[i]-A[P[i][p]])); } /*if(F[i][j]==inf) { break; } */ } } printf("%d\n",F[n][k]); return 0; }
阅读全文
0 0
- BZOJ4167: 永远亭的竹笋采摘 分块
- bzoj4167 永远亭的竹笋采摘
- HN2015集训 永远亭的竹笋采摘
- 竹笋的营养
- 竹笋的营养价值及使用方法
- 竹笋和榕树的管理学
- 竹笋炒肉的cocoon学习笔记
- 采摘!采摘!
- 永远永远的挚爱
- Vijos P1501 笨笨的果实采摘
- 北京周边~~一个可以烧烤,采摘,垂钓的地方
- 采摘最好的VPN服务器软件,对市场
- 永远的激情!永远的黄健翔!
- 永远跳票的 永远的毁灭公爵
- 永远的星辰,永远的SMIS
- 花生采摘
- 花生采摘
- 花生采摘
- 人机大战,历史的见证
- 加密软件哪个最好用?首选几维安全
- 离散题目17
- java web项目实现上传功能
- app接口 web接口简单理解
- bzoj4167 永远亭的竹笋采摘
- Python2.7编码问题
- Linux 远程ssh连接出现:REMOTE HOST IDENTIFICATION HAS CHANGED解决方法
- JDBC底层代码
- 1android app 压力测试(二)
- 脚本.bat
- Spring-允许访问静态资源
- 如何解决failed to push some refs to git
- 拉格朗日条件优化