【2014-3】day3 T2 攻城略池
来源:互联网 发布:路由器封端口 编辑:程序博客网 时间:2024/04/27 14:29
参观wwx的代码,这暴力简直神了,我太弱,有些细节还是没看懂
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <string>using namespace std;const int Maxn=100005,inf=999999999+208;typedef long long LL;int n,d[Maxn],ans=0;int fst[Maxn],next[Maxn*2],to[Maxn*2],dis[Maxn*2],En=0;int dist[Maxn],fa[Maxn],Q[Maxn];int get(){ int v;char ch; while (!isdigit(ch=getchar()));v=ch-48; while (isdigit(ch=getchar()))v=v*10+ch-48;return v;}struct node *null;struct node{ int k;LL b;//y=kx-b node *lc,*rc; inline node(){k=0;b=0;lc=rc=null;}}Tnull;class Segment_Tree{ node *root; void Insert(node *&x,int l,int r,int k,int b) { if (x==null) x=new node(); x->k+=k;x->b+=b; if (l==r) return;int mid=(l+r)>>1; if (b<=mid) Insert(x->lc,l,mid,k,b); else Insert(x->rc,mid+1,r,k,b); } int qry(node *x,int l,int r,int D,int k,LL b) { if (l==r) return l; int mid=(l+r)>>1; if ((LL)(x->lc->k+k)*mid-b-x->lc->b>=D) return qry(x->lc,l,mid,D,k,b); return qry(x->rc,mid+1,r,D,k+x->lc->k,b+x->lc->b); } node *Merge(node *x,node *y) { if (x==null) return y; if (y==null) return x; x->k+=y->k;x->b+=y->b; x->lc=Merge(x->lc,y->lc); x->rc=Merge(x->rc,y->rc);delete y;return x; } public: Segment_Tree(){root=null;} void Insert(int _k,int _b){Insert(root,0,inf,_k,_b);} int qry(int D,int dis){return qry(root,0,inf,D,0,0)-dis;} void Merge(Segment_Tree *y){root=Merge(root,y->root);}}*T[Maxn];void addedge(int u,int v,int l){ next[++En]=fst[u];fst[u]=En;to[En]=v;dis[En]=l; next[++En]=fst[v];fst[v]=En;to[En]=u;dis[En]=l;}void work(){ int l=1,r=2;Q[1]=1;fa[1]=0; while (l<r) { int x=Q[l++]; for (int k=fst[x];k;k=next[k]) if (fa[x]!=to[k]) Q[r++]=to[k],dist[to[k]]=dist[x]+dis[k],fa[to[k]]=x; } for (int i=0;i<=n;i++) T[i]=new Segment_Tree(); for (int i=r-1;i;i--) { int x=Q[i],Time=0; if (d[x]) Time=T[x]->qry(d[x],dist[x]); T[x]->Insert(1,Time+dist[x]); ans=max(ans,Time);T[fa[x]]->Merge(T[x]); }}int main(){ freopen("conquer.in","r",stdin); freopen("conquer.out","w",stdout); n=get();null=&Tnull;null->lc=null->rc=null; for (int i=1;i<=n;i++) d[i]=get(); for (int i=1;i<n;i++) { int u=get(),v=get(),l=get();addedge(u,v,l); } work(); printf("%d\n",ans); //system("pause"); return 0;}
标程神一样的6kb,有解释就不放了吧~~~
0 0
- 【2014-3】day3 T2 攻城略池
- 【2014-7】day3 T2 谈笑风生
- 【2014-3】day3 T1 五彩斑斓
- FJWC2017 Day3 T2 recollection (后缀自动机+线段树合并)
- 2017日照夏令营 day3 t2 小z搭积木
- [攻城掠池]
- COCI CONTEST #3 29.11.2014 T2 DOM
- 笔记day3进程池
- python 3 day3
- day3
- DAY3
- DAY3
- day3
- day3
- day3
- day3
- Day3
- day3
- hiho 第三十周 小Hi小Ho的惊天大作战:扫雷·一
- curl模拟登录,并发测试
- select函数 实现三用户简单通信
- 名字,作用域和约束
- poj 2485 prim
- 【2014-3】day3 T2 攻城略池
- logback使用
- BZOJ 2957 楼房重建 分块
- 【JSP】JSP项目相对路径与绝对路径问题
- HDU2523 SORT AGAIN【水题】
- SpringMVC介绍之Validation
- 天声人語 20150201
- CPU型号及寄存器位数
- 关于全志A20的Ubuntu12.04 64位系统下环境配置及编译过程笔记