关闭

[DP 可并堆维护凸包优化] BZOJ 4585 [Apio2016]烟火表演

746人阅读 评论(0) 收藏 举报
分类:

垂死梦中惊坐起,膜拜神犇王梦迪






#include<cstdio>
#include<cstdlib>
#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(int &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 int N=600005;

struct node{
	node *l,*r; ll v;
	node(ll _v=0) { l=NULL; r=NULL; v=_v; }
}nodes[N],*root[N];
int ncnt;
inline int ran(){ static int x=31253125; x+=(x<<4)+1; return x&65536; }
inline node* M(node *p,node *q){
	return (!p||!q)?(!p?q:p):(p->v<q->v?M(q,p):((ran()?p->l=M(p->l,q):p->r=M(p->r,q)),p));
}

int n,m; ll sum;
int d[N],fat[N],w[N];
ll p[N]; int cnt;

int main(){
	freopen("t.in","r",stdin);
	freopen("t.out","w",stdout);
	read(n); read(m);
	for (int i=2;i<=n+m;i++){
		read(fat[i]); read(w[i]);
		sum+=w[i]; d[fat[i]]++;
	}
	for (int i=n+m;i>1;i--){
		ll l=0,r=0;
		if (i<=n){
			while (--d[i])
				root[i]=M(root[i]->l,root[i]->r);
			r=root[i]->v;
			root[i]=M(root[i]->l,root[i]->r);
			l=root[i]->v;
			root[i]=M(root[i]->l,root[i]->r);
		}
		nodes[++ncnt]=node(l+w[i]);
		nodes[++ncnt]=node(r+w[i]);
		root[i]=M(root[i],M(nodes+ncnt,nodes+ncnt-1));
		root[fat[i]]=M(root[fat[i]],root[i]);
	}
	while (d[1]--)
		root[1]=M(root[1]->l,root[1]->r);
	for (int i=1;root[1];i++){  
		p[++cnt]=root[1]->v;
		root[1]=M(root[1]->l,root[1]->r);
	}
	for (int i=1;i<=cnt;i++)  
		sum-=p[i];
	printf("%lld\n",sum);  
	return 0;  
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

OpenGL烟花粒子系统(含源码)

烟花粒子系统是一种基于MFC对话框下的操作,主要是运用了OpenGL库函数。OpenGL是一个功能强大的开放图元库,用户可以很方便地开发所需要地有多种特殊视觉(如光照,纹理,透明,阴影)的三维图形,烟...
  • you_xian
  • you_xian
  • 2013-08-13 18:42
  • 5864

一个漂亮的java烟花程序

一个有趣的java漂亮烟花小程序
  • u013910357
  • u013910357
  • 2014-06-17 11:16
  • 2912

BZOJ 4174 tty的求助 莫比乌斯反演

题目大意:求∑Nn=1∑Mm=1∑m−1k=0⌊nk+xm⌋ mod 998244353\sum_{n=1}^N\sum_{m=1}^M\sum_{k=0}^{m-1}\lfloor\frac{nk+...
  • PoPoQQQ
  • PoPoQQQ
  • 2015-07-09 19:13
  • 2637

[堆与斜率] BZOJ 4585: [Apio2016]烟火表演

SolutionSolutionH(x)=∑|x−wu|H(x)=\sum|x-w_u|这是一个凸包。并且在相近的两个点对(可以有重复)斜率相差11。 考虑如何从子树加入一条连向父亲的边,形成新的凸...
  • Vectorxj
  • Vectorxj
  • 2017-12-13 19:52
  • 231

BZOJ 4585 [Apio2016]烟火表演 可并堆

#include #include #include #define N 300005 using namespace std; typedef long long LL; struct Nod...
  • YihAN_Z
  • YihAN_Z
  • 2017-06-29 11:18
  • 147

CDQ分治维护凸包 优化dp 【NOI2007】货币兑换cash bzoj1492

题目描述: 小 Y 最近在一家金券交易所工作。该金券交易所只发行交易两种金券:A 纪 念券(以下简称 A 券)和 B 纪念券(以下简称 B 券)。每个持有金券的顾客都有 一个自己的帐户。...
  • Todobe
  • Todobe
  • 2017-03-15 23:27
  • 194

[DP 斜率优化 CDQ分治||动态维护凸包] BZOJ 1492 [NOI2007]货币兑换Cash

打了个set维护凸包 cdq等待填坑 #include #include #include #include #include #include #define dprintf(...) f...
  • u014609452
  • u014609452
  • 2016-08-08 22:15
  • 272

[BZOJ1492][NOI2007]货币兑换Cash(斜率优化dp+splay|cdq分治维护凸包)

题目: 我是超链接 题解: f[i]表示第i天最多能获得多少钱,那么f[0]=s 题目中有提示说要不全部买入要不全部卖出,其实比较好理解,因为能赚钱一定要尽量赚 首先考虑一个问题,如果某...
  • Blue_CuSO4
  • Blue_CuSO4
  • 2018-01-11 18:53
  • 34

bzoj 4515 [Sdoi2016]游戏 线段树维护凸包

先树链剖分转成区间问题。 S到T的路径可以拆成S-lca和lca-T。 设d[r]表示根到r的距离。 对于S-lca中的点r,加的值为: a∗(d[s]−d[r])+b=(−a)∗d[r]+(...
  • make_it_for_good
  • make_it_for_good
  • 2016-10-27 21:04
  • 130

bzoj 2726 [SDOI2012]任务安排 CDQ分治维护凸包 dp

单调处理出第一个串往两边K个能覆盖的字符。 然后对四种字符每种字符做一遍FFT。 对于第一个串,如果这个位置不能匹配当前字符,那该位置为1。 对于第二个串,如果这个位置为当前字符,那该位置为1。...
  • make_it_for_good
  • make_it_for_good
  • 2016-12-15 08:57
  • 201
    个人资料
    • 访问:335180次
    • 积分:12687
    • 等级:
    • 排名:第1281名
    • 原创:972篇
    • 转载:3篇
    • 译文:0篇
    • 评论:54条
    最新评论