LOJ#3036. 「JOISC 2019 Day3」指定城市

一个点的可以dp出来

两个点也可以dp出来

后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define space putchar(' ')
  8. #define enter putchar('\n')
  9. #define eps 1e-10
  10. #define MAXN 200005
  11. #define ba 47
  12. //#define ivorysi
  13. using namespace std;
  14. typedef long long int64;
  15. typedef unsigned int u32;
  16. typedef double db;
  17. template<class T>
  18. void read(T &res) {
  19. res = 0;T f = 1;char c = getchar();
  20. while(c < '0' || c > '9') {
  21. if(c == '-') f = -1;
  22. c = getchar();
  23. }
  24. while(c >= '0' && c <= '9') {
  25. res = res * 10 +c - '0';
  26. c = getchar();
  27. }
  28. res *= f;
  29. }
  30. template<class T>
  31. void out(T x) {
  32. if(x < 0) {x = -x;putchar('-');}
  33. if(x >= 10) {
  34. out(x / 10);
  35. }
  36. putchar('0' + x % 10);
  37. }
  38. struct node {
  39. int to,next;int64 val;
  40. }E[MAXN * 2];
  41. int head[MAXN],sumE,N;
  42. int64 ans[MAXN],all;
  43. void add(int u,int v,int c) {
  44. E[++sumE].to = v;
  45. E[sumE].next = head[u];
  46. E[sumE].val = c;
  47. head[u] = sumE;
  48. }
  49. namespace one {
  50. int64 dis[2][MAXN],fir;
  51. void dfs(int u,int fa) {
  52. for(int i = head[u] ; i ; i = E[i].next) {
  53. int v = E[i].to;
  54. if(v == fa) {dis[1][u] = dis[1][fa] + E[i].val;fir += E[i].val;}
  55. else dis[0][v] = dis[0][u] + E[i].val;
  56. }
  57. for(int i = head[u] ; i ; i = E[i].next) {
  58. int v = E[i].to;
  59. if(v != fa) dfs(v,u);
  60. }
  61. }
  62. void Main() {
  63. dfs(1,0);
  64. int64 res = fir;
  65. for(int i = 2 ; i <= N ; ++i) {
  66. res = max(res,fir + dis[0][i] - dis[1][i]);
  67. }
  68. ans[1] = all - res;
  69. }
  70. }
  71. namespace two {
  72. int64 dis[2][MAXN],fir,mval = 0;
  73. pair<int64,int> dp[MAXN];
  74. int siz[MAXN],dfn[MAXN],idx,line[MAXN],fa[MAXN],S = 1,T = 1;
  75. bool vis[MAXN];
  76. struct node {
  77. int l,r,pos;int64 mv,lz;
  78. }tr[MAXN * 4];
  79. void dfs(int u) {
  80. siz[u] = 1;dfn[u] = ++idx;line[idx] = u;
  81. for(int i = head[u] ; i ; i = E[i].next) {
  82. int v = E[i].to;
  83. if(v == fa[u]) {dis[1][u] = dis[1][fa[u]] + E[i].val;fir += E[i].val;}
  84. else dis[0][v] = dis[0][u] + E[i].val;
  85. }
  86. dp[u] = mp(0,u);
  87. for(int i = head[u] ; i ; i = E[i].next) {
  88. int v = E[i].to;
  89. if(v != fa[u]) {
  90. fa[v] = u;
  91. dfs(v);
  92. siz[u] += siz[v];
  93. if(E[i].val + dp[v].fi + dp[u].fi - dis[1][u] + dis[0][u] > mval) {
  94. mval = E[i].val + dp[v].fi + dp[u].fi - dis[1][u] + dis[0][u];
  95. S = dp[u].se;T = dp[v].se;
  96. }
  97. if(dp[v].fi + E[i].val > dp[u].fi) {
  98. dp[u].fi = dp[v].fi + E[i].val;dp[u].se = dp[v].se;
  99. }
  100. }
  101. }
  102. }
  103. void update(int u) {
  104. if(tr[u << 1].mv > tr[u << 1 | 1].mv) {
  105. tr[u].mv = tr[u << 1].mv;
  106. tr[u].pos = tr[u << 1].pos;
  107. }
  108. else {
  109. tr[u].mv = tr[u << 1 | 1].mv;
  110. tr[u].pos = tr[u << 1 | 1].pos;
  111. }
  112. }
  113. void addlz(int u,int64 v) {
  114. tr[u].mv += v;tr[u].lz += v;
  115. }
  116. void pushdown(int u) {
  117. if(tr[u].lz) {
  118. addlz(u << 1,tr[u].lz);
  119. addlz(u << 1 | 1,tr[u].lz);
  120. tr[u].lz = 0;
  121. }
  122. }
  123. void build(int u,int l,int r) {
  124. tr[u].l = l;tr[u].r = r;
  125. if(l == r) {
  126. tr[u].mv = dis[0][line[l]];tr[u].pos = line[l];
  127. return;
  128. }
  129. int mid = (l + r) >> 1;
  130. build(u << 1,l,mid);
  131. build(u << 1 | 1,mid + 1,r);
  132. update(u);
  133. }
  134. void Add(int u,int l,int r,int64 v) {
  135. if(tr[u].l == l && tr[u].r == r) {addlz(u,v);return;}
  136. pushdown(u);
  137. int mid = (tr[u].l + tr[u].r) >> 1;
  138. if(r <= mid) Add(u << 1,l,r,v);
  139. else if(l > mid) Add(u << 1 | 1,l,r,v);
  140. else {Add(u << 1,l,mid,v);Add(u << 1 | 1,mid + 1,r,v);}
  141. update(u);
  142. }
  143. int64 Query(int u,int pos) {
  144. if(tr[u].l == tr[u].r) return tr[u].mv;
  145. pushdown(u);
  146. int mid = (tr[u].l + tr[u].r) >> 1;
  147. if(pos <= mid) return Query(u << 1,pos);
  148. else return Query(u << 1 | 1,pos);
  149. }
  150. void Delete(int u) {
  151. int pre = 0;
  152. while(u && !vis[u]) {
  153. int64 t = Query(1,dfn[u]);
  154. if(!pre) Add(1,dfn[u],dfn[u] + siz[u] - 1,-t);
  155. else {
  156. Add(1,dfn[u],dfn[pre] - 1,-t);
  157. if(dfn[pre] + siz[pre] <= dfn[u] + siz[u] - 1)
  158. Add(1,dfn[pre] + siz[pre],dfn[u] + siz[u] - 1,-t);
  159. }
  160. vis[u] = 1;
  161. pre = u;u = fa[u];
  162. }
  163. }
  164. void More(int x) {
  165. ans[x] = ans[x - 1] - tr[1].mv;
  166. Delete(tr[1].pos);
  167. }
  168. void Main() {
  169. dfs(1);
  170. ans[2] = all - (fir + mval);
  171. memset(dis,0,sizeof(dis));
  172. fa[S] = 0;idx = 0;
  173. dfs(S);
  174. build(1,1,N);
  175. Delete(T);
  176. }
  177. }
  178. void Solve() {
  179. read(N);
  180. int a,b,c,d;
  181. for(int i = 1 ; i < N ; ++i) {
  182. read(a);read(b);read(c);read(d);
  183. add(a,b,c);
  184. add(b,a,d);
  185. all += c;all += d;
  186. }
  187. one::Main();
  188. if(N >= 2) two::Main();
  189. for(int i = 3 ; i <= N ; ++i) {
  190. two::More(i);
  191. }
  192. int Q;
  193. read(Q);
  194. for(int i = 1 ; i <= Q ; ++i) {
  195. read(a);
  196. out(ans[a]);enter;
  197. }
  198. }
  199. int main() {
  200. #ifdef ivorysi
  201. freopen("f1.in","r",stdin);
  202. #endif
  203. Solve();
  204. return 0;
  205. }

【LOJ】#3036. 「JOISC 2019 Day3」指定城市的更多相关文章

  1. 「JOISC 2019 Day3」穿越时空 Bitaro

    「JOISC 2019 Day3」穿越时空 Bitaro 题解: ​ 不会处理时间流逝,我去看了一眼题解的图,最重要的转换就是把(X,Y)改成(X,Y-X)这样就不会斜着走了. ​ 问题变成二维平面上 ...

  2. @loj - 3039@ 「JOISC 2019 Day4」蛋糕拼接 3

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 今天是 IOI 酱的生日,所以她的哥哥 JOI 君给她预定了一个 ...

  3. 【LOJ】#3034. 「JOISC 2019 Day2」两道料理

    LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...

  4. 【LOJ】#3032. 「JOISC 2019 Day1」馕

    LOJ#3032. 「JOISC 2019 Day1」馕 处理出每个人把馕切成N段,每一段快乐度相同,我们选择第一个排在最前的人分给他的第一段,然后再在未选取的的人中选一个第二个排在最前的切一下,并把 ...

  5. 【LOJ】#3033. 「JOISC 2019 Day2」两个天线

    LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...

  6. 【LOJ】#3031. 「JOISC 2019 Day1」聚会

    LOJ#3031. 「JOISC 2019 Day1」聚会 听说随机可过? 我想了很久想了一个不会被卡的做法,建出前\(u - 1\)个点的虚树,然后找第\(u\)个点的插入位置,就是每次找一条最长链 ...

  7. 【LOJ】#3030. 「JOISC 2019 Day1」考试

    LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...

  8. loj 3014「JOI 2019 Final」独特的城市

    loj 我本来是直接口胡了一个意思一样的做法的,但是因为觉得有点假+实现要用并查集(?)就卡了好一会儿... 对于一个点\(x\)来说,独特的点一定在它的最长链上,如果有独特的点不在最长链上,那么最长 ...

  9. 「JOISC 2019 Day4」蛋糕拼接 3

    loj 3039 NKOJ Description \(n\)个蛋糕,每个蛋糕有\(w_i,h_i\).选\(m\)个蛋糕满足\(\sum\limits_{j=1}^mw_{k_j}-\sum\lim ...

随机推荐

  1. pat 甲级 1045 ( Favorite Color Stripe ) (动态规划 )

    1045 Favorite Color Stripe (30 分) Eva is trying to make her own color stripe out of a given one. She ...

  2. python录音程序

    # -*- coding: utf-8 -*- # @Time : 18-10-16 下午12:20 # @Author : Felix Wang import pyaudio import nump ...

  3. python 生成螺旋矩阵

    对于任意 m*n 矩阵,将 1~m*n 的数字按照螺旋规则在矩阵中排列. 如 m=3,n=3,期望结果为: [ [ , , ], [ , , ], [ , , ] ] 以下代码支持方阵以及非方阵. c ...

  4. deep sort

    目录   1. 准备代码与数据 deep_sort开源代码 克隆到本地服务器 git clone https://github.com/nwojke/deep_sort.git 下载MOT16数据集( ...

  5. MySQL优化相关参数--先做个记录,以后可能用得到

    innodb_io_capacity:可设置的磁盘IO性能参数,越高代表当前mysql的IO性能更好,可用做决策刷脏页速度的参数: innodb_flush_neighbors:刷脏页是否开启连坐机制 ...

  6. Final阶段贡献分配规则

    此次作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/10063 贡献分分配规则: 组内一共五名同学,贡献分共计50分. 1.每 ...

  7. Centos镜像下载地址

    https://blog.csdn.net/weixin_42430824/article/details/81019039

  8. 从char到QChar

    char类型是c/c++中内置的类型,描述了1个字节的内存信息的解析.比如: char gemfield=’g’; 那么在由gemfield标记的这块内存的大小就是1个字节,信息就是01100111, ...

  9. [Java]简单计算下一段Java代码段运行了多少秒

    long startTime = System.currentTimeMillis(); ...... long endTime = System.currentTimeMillis(); logge ...

  10. VC++实现标准型计算器步骤及源码

    VC++实现标准型计算器步骤及源码 2013年06月19日 09:48:47 无敌的成长日记 阅读数:4686       最近一段时间一直在做这个东西,刚刚拿到题目的时候认为这是一个简单的程序,可是 ...