[贪心 堆 链表] BZOJ 3502 PA2012 Tanie linie
2016-05-02 13:53
351 查看
做法同2280 1150
多年前的代码丑
多年前的代码丑
#include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++; } inline void read(ll &x) { char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } const ll N=1000005; ll n,m,tmp,cnt; ll _a ,v ; ll pre ,next ; ll ans,tot; ll H[2*N],maxn; ll back[2*N]; inline ll val(ll i) { return abs(v[H[i]]); } inline ll F(ll i) { return (i<<1)==maxn?(i<<1):(val(i<<1)<val(i<<1|1)?(i<<1):(i<<1|1)); } inline ll Swp(ll x,ll y) { swap(H[x],H[y]); swap(back[H[x]],back[H[y]]); } inline void Down(ll x) { if (x>maxn) return; for (ll i=x,tmp;(i<<1)<=maxn && val(tmp=F(i))<val(i);) Swp(i,tmp),i=tmp; } inline void Up(ll x) { if (x>maxn) return; for (ll i=x;i!=1 && val(i)<val(i>>1);) Swp(i,i>>1),i>>=1; } inline void Del(ll x) { Swp(x,maxn); maxn--; Down(x); Up(x); } inline void Ins(ll x) { H[++maxn]=x; back[x]=maxn; Up(maxn); } inline void Solve() { ll k,a,b; for (ll i=1;i<=cnt;i++) Ins(i); while (tot>m) { k=H[1]; if (pre[k]==-1) { if (v[k]>0) ans-=abs(v[k]),Del(1),tot--; else Del(1); pre[next[k]]=pre[k]; } else if (next[k]==-1) { if (v[k]>0) ans-=abs(v[k]),Del(1),tot--; else Del(1); next[pre[k]]=next[k]; } else { ans-=abs(v[k]); a=next[k]; b=pre[k]; pre[k]=pre[b]; if (pre[b]!=-1) next[pre[b]]=k; next[k]=next[a]; if (next[a]!=-1) pre[next[a]]=k; v[k]+=v[a]+v[b]; v[a]=v[b]=0; Down(1); Del(back[a]); Del(back[b]); tot--; } } } int main() { read(n); read(m); for (ll i=1;i<=n;i++) { read(_a[++tmp]); if (!_a[tmp]) tmp--; } v[++cnt]=_a[1]; for (ll i=2;i<=tmp;i++) if ((_a[i]>0 && _a[i-1]>0) || (_a[i]<0 && _a[i-1]<0)) v[cnt]+=_a[i]; else v[++cnt]=_a[i]; for (ll i=1;i<=cnt;i++) if (v[i]>0) ans+=v[i],tot++; for (ll i=1;i<=cnt;i++) pre[i]=i-1,next[i]=i+1; pre[1]=next[cnt]=-1; Solve(); printf("%lld\n",ans); return 0; }
相关文章推荐
- Android自定义控件,旋转头像直接用在你的项目中(酷毙了)
- EntityFramework之创建数据库及基本操作(一)
- Java 线程局部存储
- 设计模式(十九)命令模式
- 第十一周项目1.1point类就两点之间的距离
- 剑指offer:左旋转字符串
- HDU 5386 构造
- 在一个二维数组中,每一行都从左到右递增,每一列都从上到下递增,在这样一个数组里查找一个数
- POJ2125 Destroying The Graph
- SCTP关联终止和TCP四次挥手
- POJ 1141 Brackets Sequence 括号匹配 区间DP
- 袁腾飞——周王朝
- OpenStreetMap数据导入
- 加密算法逆向
- HDOJ 5677 ztr loves substring (Manacher+背包型DP)
- C++程序变量在内存中的分配问题
- java并发编程(6)--synchronized
- 栈的压入、弹出序列
- Android中的数据储存
- 输入一个链表的头结点,从尾到头反过来打印每个节点的值。