https://codeforces.com/problemset/status

这题一开始想着dfs贪心贪了好久,后来发现如果出现贡献相等的情况,不知道取那边扩展。花了很多时间才想出来,打cf的时候基本没可能写完。

后来看见tag DP才突然想到。。。这题跟ccpc2019网络赛那个第K长的路径还挺像的。在图上(树上)的DP,有时候不好让坐标连续,就不好用数组连续下标表示转移(a(i-1,j),a(i,j-1)->a(i,j)这种),可以用priority_queue或者queue存起点或者是终点。

首先,如果一条路径上连0都没有,那么贡献就是0,这是没有意义的。

设以u为根节点,v子树的大小为son[u][v],u-v这条边设为0,做出的所有贡献,一共有son[u][v]*son[v][u]。

那么设为1的边也必须跟设为0的边连在一起,不然他就没有任何意义,因为经过他的所有路径mex结果还是0。

那么我们用dp[u][v]来表示从u到v的路径的连通块中的所有边安排0 - len(u->v)-1的最大贡献是多少。然后用queue来保证路径长度的更新是从短到长的,每次我们选择u或者v的一端进行一下扩展,然后看是否能更新dp[nu][v]和dp[u][nv],再判断一下是否能加入queue。这样我们保证每个(u,v)只访问一次。

#include<bits/stdc++.h>
using namespace std;
const int maxl=3e3+10;int n,cnt;
long long ans;
int ehead[maxl];
long long son[maxl][maxl],dp[maxl][maxl];
struct node
{int u,v,ru,lv;
};
queue <node> q;
struct ed
{int to,nxt;
}e[maxl<<1];
bool in[maxl][maxl];inline void add(int u,int v)
{e[++cnt].to=v;e[cnt].nxt=ehead[u];ehead[u]=cnt;
}inline void dfs(int u,int fa,int id)
{int v;son[id][u]=1;for(int i=ehead[u];i;i=e[i].nxt){v=e[i].to;if(v==fa) continue;dfs(v,u,id);son[id][u]+=son[id][v];}
}inline void prework()
{scanf("%d",&n);int u,v;for(int i=1;i<n;i++){scanf("%d%d",&u,&v);add(u,v);add(v,u);}for(int i=1;i<=n;i++)dfs(i,0,i);
}inline void mainwork()
{int u,v,nu,nv,ru,lv;for(u=1;u<=n;u++)for(int i=ehead[u];i;i=e[i].nxt){v=e[i].to;if(in[u][v]) continue;in[u][v]=in[v][u]=true;dp[u][v]=dp[v][u]=son[u][v]*son[v][u];q.push(node{u,v,v,u});ans=max(dp[u][v],ans);}node d;while(!q.empty()){d=q.front();q.pop();u=d.u;v=d.v;ru=d.ru;lv=d.lv;ans=max(ans,dp[u][v]);for(int i=ehead[u];i;i=e[i].nxt){nu=e[i].to;if(nu==ru) continue;dp[nu][v]=dp[v][nu]=max(dp[nu][v],dp[u][v]+son[nu][v]*son[v][nu]);if(!in[nu][v]){in[nu][v]=in[v][nu]=true;q.push(node{nu,v,u,lv});}}for(int i=ehead[v];i;i=e[i].nxt){nv=e[i].to;if(nv==lv) continue;dp[u][nv]=dp[nv][u]=max(dp[u][nv],dp[u][v]+son[u][nv]*son[nv][u]);if(!in[u][nv]){in[u][nv]=in[nv][u]=true;q.push(node{u,nv,ru,v});}}}
}inline void print()
{printf("%lld\n",ans);
}int main()
{prework();mainwork();print();return 0;
}

codeforces1292C Xenon‘s Attack on the Gangs相关推荐

  1. Codeforces 1292C Xenon's Attack on the Gangs

    题目链接 Codeforces 1292C Xenon's Attack on the Gangs 题目大意 给定一棵树,将 [ 0 , n − 2 ] [0,n-2] [0,n−2]内的每个整数都仅 ...

  2. Xenon's Attack on the Gangs Codeforces Round #614 (Div. 2)

    Xenon's Attack on the Gangs 题意: 给你一棵树,将0~n-2一一赋值给n-1条边,则S最大可能取值 S = ∑ 1 ≤ u < v ≤ n m e x ( u , v ...

  3. E. Xenon's Attack on the Gangs,Codeforces Round #614 (Div. 2),树形dp

    E. Xenon's Attack on the Gangs http://codeforces.com/contest/1293/problem/E On another floor of the ...

  4. Codeforces Round #614 (Div. 2) E. Xenon's Attack on the Gangs(DP记忆化搜索+思维)

    题目链接:https://codeforces.com/contest/1293/problem/E 题目大意:   给出一棵树,要求给树的每条边赋权值,使得树中所有点的 m e x ( x , y ...

  5. Codeforces 1293 E. Xenon‘s Attack on the Gangs —— 树上记忆化搜索,单点加改成区间加,有丶东西

    This way 题意: 现在有一棵大小为n的树,你要往边上放0~n-2这n-1个数,定义mex(u,v)表示u到v路径上的第一个未出现的自然数,定义S 问你S最大是多少. 题解: 我感觉这道题绝不止 ...

  6. CF1293E Xenon‘s Attack on the Gangs

    传送门 题目大意   给定一棵树, n − 1 n-1 n−1条边.问如何在边上填数(范围从0到n-1,且每个数仅出现一次)使得 S S S 最小 S = ∑ 1 ≤ u , v ≤ n m e x ...

  7. Xenon's Attack on the Gangs(树规)

    题干 Input Output Example Test 1: Test 2: 3 5 1 2 1 2 2 3 1 31 43 53 10 Tips 译成人话 给n个结点,n-1条无向边.即一棵树.我 ...

  8. cf1292 C. Xenon's Attack on the Gangs

    Link Link Solution 居然还有这样的 d p dp dp,感觉就像是区间 d p dp dp上树一样 首先考虑到一步转化: ∑ ( u , v ) m e x ( u , v ) = ...

  9. C. Xenon's Attack on the Gangs(树形dp)

    http://codeforces.com/problemset/problem/1292/C 题意: 给出一棵树,n个点,你将0至n-2这n-1个数填到每条边上.一条路径的权值为最小的没有出现过的自 ...

最新文章

  1. 【codeforces 508B】Anton and currency you all know
  2. Sizzle引擎--原理与实践(二)
  3. @classmethod和@staticmethod对初学者的意义? [重复]
  4. 【译】Withdrawal symptoms
  5. 《R语言实战》第3章
  6. N-甲基-N-亚硝基脲(MNU)与眼睛健康(思考中)
  7. 【Transformer】AdaViT: Adaptive Tokens for Efficient Vision Transformer
  8. 数字图像的大小、所需比特数(二维)
  9. leetcode951. Flip Equivalent Binary Trees
  10. 台湾瑞昱Realtek RTL8153-VC-CG USB3.0 to lan简介
  11. android app应用签名生成工具,Android APK生成证书并签名方法
  12. 史玉柱:打造爆款消费品7大人性洞察,8个操作方法
  13. DuKBitmapImages 图片压缩处理技术
  14. 邮箱如何撤回已发送的邮件?
  15. PROFINET转EtherNet/IP网关连接罗克韦尔(AB) PLC配置案例
  16. S5700交换机出现discarding丢弃错误处理办法
  17. 判断两个整数是否互质
  18. Linux下安装安装redis
  19. C++友元函数实现两个复数相加
  20. 冬季赚钱项目有哪些?怎么快速赚钱?

热门文章

  1. SSD固态硬盘优化设置图文教程
  2. 微信小程序如何获取地理位置、地图显示,逆地址解析。
  3. Jlink仿真sw调试方式的4线连接方式
  4. 最新瑞芯微四核芯片RK3288开源开发板
  5. 使用keil5中的RL_TCPNet中间件建立一个工程
  6. Java实践(五)仿照用户列表查询写查自己的库
  7. spring定时任务@schedule
  8. 人体骨骼关键点检测综述
  9. 4.5 小红书博主如何跟商家合作?【玩赚小红书】
  10. 2013 【第四届蓝桥杯省赛】 C/C++ B组