动态dp模板题(树剖+dp+线段树)

动态最大带权独立集

(还有一个是全局平衡二叉树的解法,还没学)


  1 #include"bits/stdc++.h"
  2 
  3 using namespace std;
  4 const int inf = 1e8;
  5 int n,m;
  6 int v[100005];
  7 const int nn = 1e5+10;
  8 
  9 int link[nn<<1],son[nn<<1],nxt[nn<<1];
 10 int tot_;
 11 int top[nn],deep[nn],wson[nn],fa[nn],size[nn],bot[nn];
 12 int f[nn][2];
 13 int dfn[nn];
 14 int id[nn];
 15 int tot;
 16 
 17 
 18 struct Mat
 19 {
 20    int l,r,a[3][3];
 21    Mat(int a1=0,int a2=0,int d1=0,int d2=0,int d3=0,int d4=0)
 22    {
 23       l=a1,r=a2;
 24       a[1][1]=d1,a[1][2] = d2;
 25       a[2][1] = d3,a[2][2] = d4;
 26    }
 27 
 28 
 29 }tr[nn<<2];
 30 
 31 Mat operator*(const Mat a,const Mat b)
 32 {
 33     Mat re=Mat(2,2);
 34 
 35 
 36     re.a[1][1] = max(a.a[1][1]+b.a[1][1],a.a[1][2]+b.a[2][1]);
 37      re.a[1][2] = max(a.a[1][1]+b.a[1][2],a.a[1][2]+b.a[2][2]);
 38 
 39       re.a[2][1] = max(a.a[2][1]+b.a[1][1],a.a[2][2]+b.a[2][1]);
 40        re.a[2][2] = max(a.a[2][1]+b.a[1][2],a.a[2][2]+b.a[2][2]); // 手动
 41 
 42    return re;
 43 }
 44 
 45 inline int rd(){
 46     int x=0;char c=getchar();int neg=1;
 47     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
 48     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
 49     return x*neg;
 50 }
 51 
 52 inline void adde(int x,int y)
 53 {
 54   ++tot_;
 55   nxt[tot_] = link[x];
 56   link[x] = tot_;
 57   son[tot_] = y;
 58 }
 59 
 60 void dfs1(int x,int ff,int dd)
 61 {
 62   fa[x] =ff;
 63   size[x] =1;
 64   f[x][1] = v[x];
 65   f[x][0] = 0;
 66 
 67   for (int i=link[x];i;i=nxt[i])
 68   {
 69      int so = son[i];
 70      if (so==ff) continue;
 71      dfs1(so,x,dd+1);
 72      size[x] += size[so];
 73      if (size[wson[x]]<size[so]) wson[x] = so;
 74      f[x][1] += f[so][0];
 75      f[x][0] += max(f[so][1],f[so][0]);
 76 
 77 
 78   }
 79 
 80 }
 81 
 82 void dfs2(int x,int t)
 83 {
 84    top[x] = t;
 85    dfn[x] = ++tot;
 86    id[tot] =x;
 87 
 88    if (!wson[x]) bot[top[x]] = x;//不要写成t
 89    else dfs2(wson[x],t);
 90 
 91    for ( int i=link[x];i;i=nxt[i])
 92    {
 93       int so =son[i];
 94       if (so==wson[x]||so==fa[x]) continue;
 95       dfs2(so,so);
 96    }
 97 }
 98 
 99 
100 inline void change(int rt,int l,int r,int pos,int a,int b)
101 {
102   if (l==r)
103   {
104      tr[rt].a[1][1]+=a; tr[rt].a[2][1]+=a;
105      tr[rt].a[1][2]+=b;
106      return ;
107   }
108 
109   int mid = l+r>>1;
110   if (pos<=mid) change(rt<<1,l,mid,pos,a,b);
111   else change(rt<<1|1,mid+1,r,pos,a,b);
112   tr[rt]=tr[rt<<1|1]*tr[rt<<1];//注意顺序
113 }
114 
115 
116 inline Mat query(int p,int l,int r,int x,int y){
117     if(x<=l&&r<=y)
118     {
119     return tr[p];
120     }
121     else{
122         int m=l+r>>1;Mat re=Mat(2,2,0,-inf,-inf,0);
123         if(y>=m+1) re=re*query(p<<1|1,m+1,r,x,y);
124         if(x<=m) re=re*query(p<<1,l,m,x,y);
125         return re;
126     }
127 }
128 
129 
130 inline void update(int x,int y)
131 {
132    Mat nw,od;
133  int a,b;
134  while (x)
135  { if (y) a=0,b=y,y=0;
136   else a=max(nw.a[1][2],nw.a[1][1]) - max(od.a[1][2],od.a[1][1]),
137   b = nw.a[1][1] - od.a[1][1];
138 
139   od = query(1,1,n,dfn[top[x]],dfn[bot[top[x]]]);
140   change(1,1,n,dfn[x],a,b);
141   nw = query(1,1,n,dfn[top[x]],dfn[bot[top[x]]]);
142   x=fa[top[x]];
143   }
144 
145   printf("%d\n",max(nw.a[1][1],nw.a[1][2]));
146 }
147 
148 void build (int rt,int l,int r)
149 {
150   if (l==r)
151   {
152      int zhi = id[l];
153      int a = f[zhi][0] - max(f[wson[zhi]][0],f[wson[zhi]][1]);
154      int b = f[zhi][1] - f[wson[zhi]][0];
155      tr[rt] = Mat(2,2,a,b,a,-1e8);
156      return ;
157   }
158 
159   int mid = l+r>>1;
160   build(rt<<1,l,mid);
161   build(rt<<1|1,mid+1,r);
162   tr[rt]=tr[rt<<1|1]*tr[rt<<1];
163 }
164 
165 int main()
166 {
167   n=rd(); m = rd();
168   for ( int i=1;i<=n;i++) v[i] = rd();
169 
170   for ( int i =1;i<n;i++)
171   {
172      int a,b;a=rd(); b = rd();
173      adde(a,b);
174      adde(b,a);
175   }
176   dfs1(1,0,1);
177   dfs2(1,1);
178 
179   build(1,1,n);
180   //puts("$%^&*");
181 
182   for ( int i=1;i<=m;i++)
183 
184   {
185    //  puts("123f");
186      int a,b;a=rd();  b=rd();
187 
188      update(a,b-v[a]);
189    //  puts("213");
190      v[a] =b;
191   }
192   return 0;
193 }

 

转载于:https://www.cnblogs.com/zhangbuang/p/10282131.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

×××linux下vsftp服务器

一、编译安装vsftp [rootYYzs tmp]# tar -xvf vsftpd-2.2.0.tar.gz[rootYYzs tmp]# cd vsftpd-2.2.0[rootYYzs vsftpd-2.2.0]# make//vsftp默认配置中需要“nobody”用户&#xff0c;在系统中添加此用户[rootYYzs vsftpd-2.2.0]# useradd nobody//VSFTPD默认配置中需要“/usr/s…

WinCE程序的几种开发方法

文章允许转载,请注明出处和作者:luocq(akay_21cn_com)下面介绍的几种开发方法,还是倾向于Delphi的程序员,如果是熟练的VC程序员,当然VC是不二的选择.1、采用Delphi2007来进行WinCE .net程序开发http://spaces.msn.com/members/GordonLiWei/?partqsayear%3D2005%26amonth%3D12&…

几道Linux驱动相关面试题,你会几题?

1一、Linux基础1、任意3种网络操作的Linux命令,并说明他们的含义 1. ifconfig 命令ifconfig 用于查看和配置 Linux 系统的网络接口。 查看所有网络接口及其状态&#xff1a;ifconfig -a 。 使用 up 和 down 命令启动或停止某个接口&#xff1a;ifconfig eth0 up 和 ifconfig et…

解决Too many open files问题

转载&#xff1a;https://blog.csdn.net/zhuwinmin/article/details/72730288 当用linux做高并发服务器时&#xff0c;会遇到"Too many open files"的错误。 Linux是有文件句柄限制的&#xff08;open files&#xff09;&#xff0c;而且Linux默认不是很高&#xf…

RedHat Linux 5.5系统下配置yum包详细过程

1、挂载光盘 mount -t iso9660 /dev/dvd /mnt/cdrom2、建立文件夹 安装如下路径&#xff0c;建立对应的文件夹&#xff0c;其中pub文件夹需要创建4个。3、复制以下内容到指定文件夹 需要注意的是&#xff0c;如果按照第1步将光盘挂在到/mnt/cdrom 下面…

hadoop fs 基本命令

今天由于工作需要&#xff0c;需要使用到hadoop fs的一些命令&#xff0c;就简单的总结了下&#xff1a; 1&#xff0c;hadoop fs –fs [local | <file system URI>]&#xff1a;声明hadoop使用的文件系统&#xff0c;如果不声明的话&#xff0c;使用当前配置文件配置的…

树莓派的这十年

来源 | 新智元编辑 | 袁榭 好困刚刚过完10岁生日的树莓派&#xff0c;早已褪去了当年廉价电脑教具的外衣&#xff0c;一跃成为全球业界首屈一指的微型电脑品牌。为啥叫「Raspberry Pi」&#xff1f;从某种意义上讲&#xff0c;「树莓」这个命名方式其实很单纯&#xff0c;因为大…

存储过程入门与提高

什么是存储过程呢&#xff1f; 定义&#xff1a; 将常用的或很复杂的工作&#xff0c;预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。 讲到这里,可能有人要问&#xff1a;这…

C++ 11 nullptr关键字

C 11 nullptr关键字 转载&#xff1a;https://www.cnblogs.com/DswCnblog/p/5629073.html 熟悉C的童鞋都知道&#xff0c;为了避免“野指针”&#xff08;即指针在首次使用之前没有进行初始化&#xff09;的出现&#xff0c;我们声明一个指针后最好马上对其进行初始化操作。如…

Vue-watch选项

Vue ----watch 选项 用于 监听数据变化&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <meta name"viewport" content"widthdevice-width, initial-scale1.0"…

对SqlServer2008中的日志进行截断的方法

--第一步、执行以下语句&#xff1a; USE 数据库名 GO --第二步、备份数据库日志到c:\1.bak中 BACKUP LOG 数据库名 to diskc:\1.bak GO --第三步、查询此数据库的逻辑文件名 DECLARE Log_FileName VARCHAR(256) SELECT Log_FileNamename FROM sys.database_files WHERE FILE_I…

layui 在springboot2.x 时,页面展示不了layui的问题

[[]]是thymeleaf的内联表达式&#xff0c;在script上加 th:inline"none" 即可 报错信息 转载于:https://www.cnblogs.com/SeaWxx/p/10287505.html

ArcGIS Flex API 中的 Flex 技术(一)--事件

作者&#xff1a;Flyingis 本文严禁用于商业目的&#xff0c;如需转载请注明作者及原文链接&#xff0c;其他疑问请联系&#xff1a;dev.vip#gmail.com 在ArcGIS Flex API中探索Flex使用是一种不错的学习方法&#xff0c;可以相互辅助理解ArcGIS Flex API和Flex&#…

C++11 bind注意事项(传引用参数的时候)

默认情况下&#xff0c;bind的那些不是占位符的参数被拷贝到bind返回的可调用对象中。 当需要把对象传到bind中的参数中时&#xff0c;需要使用ref或者cref。 例如&#xff1a;

四元數與旋轉

为什么80%的码农都做不了架构师&#xff1f;>>> 在討論「四元數」之前&#xff0c;我們來想想對三維直角座標而言&#xff0c;在物體旋轉會有何影響&#xff0c;可以擴充三維直角座標系統的旋轉為三角度系統&#xff08;Three-angle system&#xff09;&#xff0c…

玩一下数组

来源&#xff1a;嵌入式大杂烩数组是最基本的数据结构&#xff0c;关于数组的面试题也屡见不鲜&#xff0c;本文罗列了一些常见的面试题&#xff0c;仅供参考。目前有以下18道题目。数组求和求数组的最大值和最小值求数组的最大值和次大值求数组中出现次数超过一半的元素求数组…

https部署

准备证书及秘钥 方式一、springboot项目可直接在yml中配置 1、需要将证书转换成jks或p12格式&#xff0c;如 多个crt证书转为pem: cat xxx.crt xxx2.crt xxx3.xrt xxx4.crt > server.pempem证书转为jks&#xff1a; //PEM--->PFXopenssl pkcs12 -export -out test.pfx -…

STP学习笔记本

生成树协议&#xff1a;&#xff08;1&#xff09;作用&#xff1a;防止环路、冗余备份&#xff08;2&#xff09;如果网络存在环路&#xff0c;会给网络带来什么影响&#xff1f;答&#xff1a;广播风暴重复帧现象MAC地址表震荡&#xff08;3&#xff09;STP解决方法&#xff…

每日集成Tip: CruiseControl.Net 提示DLL文见找不到的解决方法

项目中引用了第三方类库&#xff0c;当帮项目上传到服务器时&#xff0c;提示找不到路径&#xff0c;经过CruiseControl.Net发现&#xff0c;他找的是我我本地的目录 因此&#xff0c;当引入第三方类库时&#xff0c;按如下步骤 (1). 在源码的目录下见一个新的目录(ThirdParty)…

将GDB中的输出定向到文件

将所有栈信息保存到文件11中 在gdb中: set logging file 11 set logging on thread apply all bt set logging off 结束之后&#xff0c;在相关目录下查看11文件