20160802 推销员 贪心 堆
来源:互联网 发布:lol mac美服 打不开 编辑:程序博客网 时间:2024/04/29 11:31
这题最重要的结论就是X=i时的选择必定包含X=i-1时的所有点。。。这样我们记录当前选择的最远距离,在其左右分别维护一个堆,左边的不算距离,右边的算距离(要减去当前最远距离),每次从两堆顶中选择最优解,如果更新了最远距离,就要将右边堆中这个距离左边的点都拿出来减去距离扔到左堆里。重复N次即可。
这个时候再次体现了万恶的STL数据封装有多坑,要想直接将某一编号的节点从堆中删除,只能使用带有pos的手写堆。
自己的代码:
#include<cstdio>#define gm 100001using namespace std;typedef unsigned long long ull;int n;int s[gm],a[gm];ull ans[gm]={};int lst=0;struct zh{ int no; int val; bool operator <(const zh &b) const {return val<b.val;}}hp[2][gm];int pos[2][gm];int figr[2]={};void add(int k,const zh &v){ zh* h=hp[k]; int* p=pos[k]; int x=++figr[k]; while(x>1) { if(h[x>>1]<v) { h[x]=h[x>>1]; p[h[x].no]=x; x>>=1; } else break; } h[x]=v; p[v.no]=x;}void del(int k,int popoqqq){ zh* h=hp[k]; int* p=pos[k]; zh v=h[figr[k]--]; int x=p[popoqqq],j; while((x<<1)<=figr[k]) { j=x<<1; if(j+1<=figr[k]&&h[j]<h[j+1]) j++; if(v<h[j]) { h[x]=h[j]; p[h[x].no]=x; x=j; } else break; } h[x]=v; p[v.no]=x;}#define top(k) figr[k]?hp[k][1]:(zh){0,0}int main(){ freopen("salesman.in","r",stdin); freopen("salesman.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) {scanf("%d",&s[i]);s[i]*=2;} for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) add(1,(zh){i,s[i]+a[i]}); for(int i=1;i<=n;i++) { zh s1=top(0),s2=top(1),s3; ans[i]=ans[i-1]; if(s1.val<s2.val-s[lst]) { for(int j=lst+1;j<s2.no;j++) { s3=hp[1][pos[1][j]]; del(1,j); s3.val-=s[j]; add(0,s3); } ans[i]+=s2.val-s[lst]; lst=s2.no; del(1,s2.no); } else { ans[i]+=s1.val; del(0,s1.no); } } for(int i=1;i<=n;i++) printf("%llu\n",ans[i]); return 0;}
0 0
- 20160802 推销员 贪心 堆
- 推销员(优先队列+贪心)
- |洛谷|NOIP2015|堆|P2672 推销员
- luogu2672推销员-贪心-(noip2015普及t4)
- 推销员
- 推销员
- 推销员
- code vs 5126 推销员 NOIP2015 (线段树+贪心)
- 【codevs 5126】[NOIP2015 普及组T4]推销员(贪心)
- poj3253【贪心+堆(STL)】
- 【贪心+堆】锯木
- 【bzoj2151】【种树】【堆+贪心】
- POJ3614 贪心 堆
- 堆+贪心 逃亡
- bzoj 1029 贪心+堆
- bzoj 2802 贪心+堆
- bzoj 1572 贪心+堆
- bzoj 1724 堆+贪心
- LAMP centos7中网页浏览遇到访问权限问题
- Java并发之ReentrantLock详解
- Leetcode:136. Single Number
- Strassen矩阵相乘算法
- 数据结构实验之二叉树的建立与遍历
- 20160802 推销员 贪心 堆
- 自定义protobuf编解码器
- Impala实践之一:基本原理
- 可能是史上最全面的内存管理文章
- Java 去除字符串中的空格、回车、换行符、制表符
- Impala实践之二:Hive元数据
- 使用 github, gitbook, markdown 写博客/写书
- mysql常用语句优化
- 数据结构方面