【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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 反恐精英全球攻势加载地图慢怎么办 老滚5视角锁死了怎么办 苹果描述文件没有了怎么办 苹果6s发热严重怎么办 苹果6s发烫严重怎么办 手机型号不适配全军出击怎么办? 苹果5版本过低怎么办 在泰国买到假货怎么办 在泰国旅游遇到危险该怎么办? 拾到小米手环怎么办 苹果充电打游戏触点怎么办 衣服上金属锈了怎么办 光之子门锁住了怎么办 挖到金矿石了该怎么办 邻居是精神病扔石头怎么办 汽车保养手册丢了怎么办 五号电池没电了怎么办 电脑打印时显示脱机怎么办 博新计划两年后怎么办 门帘粘扣老是掉怎么办 魔术粘贴带双面背胶不粘了怎么办 斜挎包包磨衣服怎么办 电脑ip被别人知道了怎么办 西乐葆不止痛了怎么办 家里鸽子多捣蛋的不行怎么办 联璧倒闭了理财钱怎么办 众筹平台雷了怎么办 App理财无法提现怎么办 喝咖啡喝的心慌怎么办 睾丸被用力捏破流血怎么办 足球大师球队声望过高怎么办 fm17买了好多球员怎么办 fm2018电脑适应了战术怎么办 家纺摆放跑色怎么办 买的t恤太小了怎么办? 汽车全包围脚垫翘边怎么办 针织衣服线跑了怎么办 老板跟老板娘吵架我应该怎么办 偷看老板娘洗澡被发现怎么办? 幽浮2人挂了怎么办 蜻蜓fm业务扣费怎么办