好像用到一些高中数学知识......

满分做法:

case 0:已知a数组求b数组

因为是树状结构,设当前节点x 儿子to

我们从任意一点出发可求出b[root]来,之后我们可以通过寻找两两相连节点的关系来O(n)推出全部的b

我们发现x与y之间只有一条边的贡献不同,就是他们相连的边

(边的贡献即该边节点所在子树通过该点的a权值和)

那么我们就轻松搞掉了......

case 1:已知b求a

设sum[i]为以i为根的子树的a值和,all为总值。

我们首先可以发现b[x]-b[to]的差值可以用sum[to]表示

两者之间的差值其实就是all-sum[to]与sum[to]的差值

那么我们用起高中数学的类似等差数列的东西????

从树上遍历一番将所有的边的x与to的上述式子加和

然后注意记录每个b数组的系数,显然如果是叶子节点为-1,其他也要记录

我们发现化简后

ss[1]*b[1]+........=2*(sum[2]+......sum[n])-all*(n-1)

(ss是系数,all是a的总值)

其中(sum[2]......)总值是2*b[1],之后DFS统计就行了

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<string>
  5 #include<algorithm>
  6 #include<cmath>
  7 #include<stack>
  8 #include<map>
  9 #include<queue>
 10 #define ps push_back
 11 #define MAXN 210001
 12 #define ll long long
 13 using namespace std;
 14 ll a[MAXN],b[MAXN];
 15 ll T,n;
 16 ll head[MAXN],tot;
 17 struct node{ll to,n;}e[2*MAXN];
 18 void add(ll u,ll v)
 19 {
 20     e[++tot].to=v;e[tot].n=head[u];head[u]=tot;
 21 }
 22 bool vis[MAXN];ll sum[MAXN];
 23 ll fa[MAXN];ll all;
 24 void DFS(ll x)
 25 {
 26     vis[x]=1;
 27     all+=a[x];
 28     sum[x]=a[x];
 29     for(ll i=head[x];i;i=e[i].n)
 30     {
 31         ll to=e[i].to;
 32         if(vis[to]==1)continue;
 33         fa[to]=x;
 34         DFS(to);
 35         sum[x]+=sum[to];
 36         b[1]+=sum[to];
 37     }
 38 }
 39 void DFS_findans(ll x)
 40 {
 41     vis[x]=1;
 42     for(ll i=head[x];i;i=e[i].n)
 43     {
 44         ll to=e[i].to;
 45         if(vis[to]==1)continue;
 46         b[to]=b[x]-2*sum[to]+all;
 47         DFS_findans(to);
 48     }
 49 }
 50 ll orz;
 51 void work_a()
 52 {
 53     memset(sum,0,sizeof(sum));
 54     all=0;
 55     memset(vis,0,sizeof(vis));
 56     DFS(1);
 57     memset(vis,0,sizeof(vis));
 58     DFS_findans(1);
 59     for(ll i=1;i<=n;++i)
 60     {
 61         printf("%lld ",b[i]);
 62     }
 63     cout<<endl;
 64 }
 65 ll chu[MAXN];
 66 ll ss[MAXN];
 67 void DFS_B(ll x)
 68 {
 69     vis[x]=1;
 70     //printf("x=%lld\n",x);
 71     for(ll i=head[x];i;i=e[i].n)
 72     {
 73         ll to=e[i].to;
 74         if(vis[to]==1)continue;
 75         fa[to]=x;
 76         ss[x]++;
 77         ss[to]--;
 78         DFS_B(to);
 79     }
 80 }
 81 void DFS_find(ll x)
 82 {
 83     vis[x]=1;a[x]=sum[x];
 84     for(ll i=head[x];i;i=e[i].n)
 85     {
 86         ll to=e[i].to;
 87         if(vis[to])continue;
 88         sum[to]=(b[x]-b[to]+all)/2;
 89         DFS_find(to);
 90         a[x]-=sum[to];
 91     }
 92 }
 93 void work_b()
 94 {
 95     memset(a,0,sizeof(a));
 96     memset(sum,0,sizeof(sum));
 97     memset(fa,0,sizeof(fa));
 98     all=0;
 99     memset(vis,0,sizeof(vis));
100     memset(ss,0,sizeof(ss));
101     DFS_B(1);
102
103     ll pss=0;
104     for(ll i=1;i<=n;++i)
105     {
106         //printf("ss%lld b%lld\n",ss[i],b[i]);
107         pss+=ss[i]*b[i];
108     }
109     all=(2*b[1]-pss)/(n-1);
110     sum[1]=all;
111     //printf("all=%lld\n",all);
112     memset(vis,0,sizeof(vis));
113
114     DFS_find(1);
115
116     for(ll i=1;i<=n;++i)
117     {
118         printf("%lld ",a[i]);
119     }
120     cout<<endl;
121 }
122 int main()
123 {
124     scanf("%lld",&T);
125     while(T--)
126     {
127          memset(a,0,sizeof(a));
128          memset(b,0,sizeof(b));
129          memset(head,0,sizeof(head));
130          memset(vis,0,sizeof(vis));
131          memset(chu,0,sizeof(chu));
132          tot=0;
133          scanf("%lld",&n);
134          for(ll i=1;i<=n-1;++i)
135          {
136              ll x,y;
137              scanf("%lld%lld",&x,&y);
138              add(x,y);add(y,x);
139              chu[x]++;chu[y]++;
140          }
141          scanf("%lld",&orz);
142          if(orz==0)
143          {
144               for(ll i=1;i<=n;++i)
145               {
146                   scanf("%lld",&a[i]);
147               }
148               work_a();
149          }
150          else
151          {
152              for(ll i=1;i<=n;++i)
153              {
154                  scanf("%lld",&b[i]);
155              }
156              work_b();
157          }
158     }
159 }

View Code

转载于:https://www.cnblogs.com/Wwb123/p/11256869.html

单(liu_runda学长的神题)相关推荐

  1. 博大考神 职称 计算机 看什么,word2003博大考神题库答案职称计算机2

    word2003博大考神题库答案职称计算机2 2008年07月11日 星期五 08:54 四.段落排版: 1.要求:利用"显示格式"任务窗格比较第一自然段和第三自然段中的" ...

  2. 洛谷 P2679 子串 【dp神题】【滚动数组】【2015 noip d2t2】

    偷个懒,题解看这里:https://www.luogu.org/problemnew/solution/P2679 看作者 GuessYCB  写的 ===2018.9.6=== 这一次算理解深一点了 ...

  3. 【CF913F】Strongly Connected Tournament 概率神题

    [CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...

  4. [Bzoj4817] [Sdoi2017]树点涂色 (LCT神题)

    4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 629  Solved: 371 [Submit][Stat ...

  5. Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 177  Solved: 128 [Submit][Stat ...

  6. 对口单招计算机电工试题答案,对口单招电工试题52题.doc

    对口单招电工试题52题.doc (31页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 一.计算解答题:1.图1所示电路中,Va= V. ...

  7. 2017.2.14-15自测(那些普及神题)

    时间太散了就硬生生拖了两天.. 这次挑战的题目全是普及组.. 1.车站分级            2.推销员 先插入一个TA对普及一题的评价. 第一题:想到了一个很神(弱)的建图方式,即不经过的向经过 ...

  8. BZOJ 4180: 字符串计数 后缀自动机 + 矩阵乘法 + 二分(神题)

    Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999. 他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C', ...

  9. 历年来计算机基础知识,计算机基础知识题单选题历年高考真题归纳.docx

    精品文档 计算机基础知识题(单选题) 2007-2018 年三校生历年真题归纳 1.Reset 按钮用于( ) A.复位启动 B.冷启动 C.中止某项操作或命令 D.检查部件是否正常 2.一个完整的计 ...

最新文章

  1. python之局部变量引用赋值前的结果
  2. JVM盘点家底查看初始默认值
  3. 8.3 TensorFlow BP神经网络构建与超参数的选取
  4. ibatis与spring的整合
  5. 485通信原理_上位机开发之单片机通信实践
  6. 开发里程碑计划_如何通过里程碑控制项目进度
  7. 在网页中嵌入Base64编码文件
  8. 专注于分享,米狗网!
  9. 《Java语言程序设计》(基础篇原书第10版)第十章复习题答案
  10. 机器人学导论—机器人相关术语
  11. 迪杰斯特拉(Dijkstra)算法
  12. 从冯诺伊曼结构看AI 1
  13. java-net-php-python-2020SSM面向大学生的课程演示录像计算机毕业设计程序
  14. 日有所思(4)——磁密,磁场强度,磁通量傻傻分不清
  15. multisim 14.2 添加模型
  16. 用了两年的电脑,它哭着对我说:“我不行了”QAQ
  17. 华为服务器如何安装win7系统教程,云服务器怎么装win7系统教程
  18. winfrom dev控件gridcontrol精确到时分秒的日期格式设置
  19. 使用站长运营工具|百度批量推送工具,助站长快速提升收录
  20. ORA-00600[6711]错误一例

热门文章

  1. Java基础(十一) Stream I/O and Files
  2. RGB格式等比例缩放
  3. ios手势识别-单击
  4. 栈和队列--算法设计题3.15
  5. ASP.NET学习笔记(9)--SqlDataReader和SqlDataSet的比较
  6. zset中的score_每天五分钟,成就redis大神之Zset数据类型
  7. 直线和圆交点 halcon_初中数学三角形、四边形、圆辅助线的添加方法
  8. js map遍历 修改对象里面的值_求职季之你必须要懂的原生JS(上)
  9. ckeditor缺少图像源文件地址_微软的模拟飞行带你开着飞机浏览世界附下载地址...
  10. python里什么叫子图_Python 如何构建多个子图表