解析

很妙的一道题
看这两个南辕北辙的标签就知道这题不简单
看见dp思路还是得打开
一开始其实想到按边权排序了
但卡在了重构树上
遇到dp一定要敢想
勇于和图论等结合

考虑正解
按照边权升序排序
依次加边到图中
并查集维护连通性和集合内的边数
发现,一个联通块合法当且仅当它在某个时刻是当前图的一个
(这个概念还是现查的…)

考虑建一个重构树
显然所以合法的区间在树上对应的叶子的dfs序是连续的
可以通过dfs求出合法的区间,并记录哪些区间可以进行转移
最后进行一遍朴素dp即可
由于合法的区间只会有On个,所以均摊复杂度是n2n^2n2

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1550;
const int mod=998244353;
#define ll long long
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();};return x*f;
}int n,m;
struct node{int to,nxt;
}p[N<<1];
int fi[N<<1],cnt;
inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return;
}struct edge{int x,y,w;
}e[N*N];
bool cmp(edge a,edge b){return a.w<b.w;
}
int fa[N<<1],siz[N<<1],num[N<<1],tot,id,ls[N<<1],rs[N<<1],tim;
bool jd[N][N];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void dfs(int x){if(fi[x]==-1){siz[x]=1;ls[x]=rs[x]=++tim;jd[tim][tim]=1;return;}for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;dfs(to);siz[x]+=siz[to];if(!ls[x]) ls[x]=ls[to];else rs[x]=rs[to];}int o=rs[x]-ls[x]+1;jd[ls[x]][rs[x]]=num[x]==o*(o-1)/2;//printf("x=%d ls=%d rs=%d num=%d\n",x,ls[x],rs[x],num[x]);return;
}
ll dp[N][N];
int main(){#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);#endifmemset(fi,-1,sizeof(fi));cnt=-1;n=read();id=n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){int x=read();if(i<j) e[++tot]=(edge){i,j,x};}}for(int i=1;i<=n*2;i++) fa[i]=i;sort(e+1,e+1+tot,cmp);for(int i=1;i<=tot;i++){int x=e[i].x,y=e[i].y;x=find(x),y=find(y);if(x==y){num[x]++;continue;}++id;fa[x]=fa[y]=id;num[id]=num[x]+num[y]+1;addline(id,x);addline(id,y);}dfs(id);dp[0][0]=1;for(int i=1;i<=n;i++){for(int k=1;k<=i;k++){if(!jd[k][i]) continue;for(int j=1;j<=n;j++){(dp[i][j]+=dp[k-1][j-1])%=mod;}}}for(int i=1;i<=n;i++) printf("%lld ",dp[n][i]);return 0;
}
/**/

CF1408G:Clusterization Counting(区间dp、克鲁斯卡尔重构树)相关推荐

  1. 牛客 - 红蓝图(克鲁斯卡尔重构树的dfs序上建主席树)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,每条边都有边权和颜色,颜色分为红色和蓝色,现在有 q 次相互独立的操作,每次操作会询问 ( x , t ) ,问删除掉所有权值 ...

  2. CodeForces - 1417F Graph and Queries(克鲁斯卡尔重构树的dfs序上建线段树)

    题目链接:点击查看 题目大意:给出一个 n 个点 m 条边组成的无向图,每个点初始时都有一个权值 val,满足: 每个点的 val[ i ] 各不相同 val[ i ] ∈ [ 1 , n ] 现在有 ...

  3. Gym - 101173H Hangar Hurdles(bfs+克鲁斯卡尔重构树)

    题目链接:点击查看 题目大意:给出一个 n∗nn*nn∗n 的矩阵,有些位置存在障碍物,现在有 qqq 次询问,每次询问给出两个点 st=(x1,y1),ed=(x2,y2)st=(x1,y1),ed ...

  4. 牛客 - 牛半仙的妹子图(并查集+bitset/克鲁斯卡尔重构树+主席树)

    题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的连通图,每个点都有一种颜色,每条边都有一个权值,现在规定一个起点 st,再给出 q 次询问,每次询问给出区间 [ l , r ] , ...

  5. 2016-2017 Central Europe Regional Contest Hangar Hurdles 克鲁斯卡尔重构树 + 建图

    传送门 文章目录 题意: 思路: 题意: 有一个n∗nn*nn∗n的网格图,有若干位置有障碍,有qqq个询问,每次询问给出两个点坐标x1,y1,x2,y2x1,y1,x2,y2x1,y1,x2,y2, ...

  6. 克鲁斯卡尔重构树及简单应用

    克鲁斯卡尔重构树 概念 克鲁斯卡尔重构树,顾名思义,算是克鲁斯卡尔算法的衍生算法.下面给出如何构建克鲁斯卡尔重构树. 1.我们先将边排序,不同的排序规则会使最终的树有不同的性质. 2.排序后遍历每条边 ...

  7. 【BZOJ4242】水壶(克鲁斯卡尔重构树,BFS)

    [BZOJ4242]水壶(克鲁斯卡尔重构树,BFS) 题面 BZOJ然而是权限题. Description JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长 ...

  8. 克鲁斯卡尔重构树小结

    https://zybuluo.com/ysner/note/1239639 定义 克鲁斯卡尔重构树可以维护诸如"查询从某个点出发经过边权不超过\(w\)的边最远所能到达的节点"或 ...

  9. P4197 【Peaks】克鲁斯卡尔重构树详解

    \(\texttt{Kruskal}\) 重构树 -- 需要一定基础的简单算法 题目大意: 给你一个无向图,可能有很多个连通块 给定一些询问 \(v,x,k\),代表在 \(v\{\}\) 这个连通块 ...

最新文章

  1. 使用Spring实现邮件发送
  2. 深圳有哪些牛批的互联网公司?
  3. php设置背景为透明,css如何设置背景颜色透明?css设置背景颜色透明度的两种方法介绍...
  4. python宝石与石头_771. 宝石与石头
  5. Windows10搭建ftp服务
  6. [转]矩阵分解在推荐系统中的应用
  7. python爬虫第二课:url解析
  8. NGINX---一次阿里云宝塔开发flask经历
  9. java工程师成神之路 整理自网络
  10. vue 微信公众号 前端开发
  11. 仿迅雷播放器教程 -- 提取exe资源(12)
  12. pdf 修改title
  13. 586A 586B线序
  14. 达梦数据库基础优化分享
  15. 最优投资组合的确定matlab,最优投资组合问题的数学模型
  16. 蓝牙耳机无法与计算机连接,蓝牙耳机与电脑无法配对、或者连接不上
  17. 做第三方软件测评的意义
  18. C++面试题整理(二)
  19. 基于matlab/simulink同步发电机电路模型仿真,基于MATLAB/SIMULINK同步发电机电路模型仿真...
  20. WEB HTML 二级菜单 折叠展开菜单

热门文章

  1. mac apache2 php,Mac OSX 之 PHP开发环境Apache2配置
  2. 电脑睡眠快捷键_电脑快速进入睡眠的快捷键是什么?
  3. java web请求字符串处理_java web工作常用技能篇(三)-封装复杂请求对象2
  4. java thread join()_Java Thread join() 的用法
  5. 在python中strip_python中strip()函数怎么用?
  6. mac下nvm_Mac OS 使用 nvm 管理 node 与 npm 版本
  7. 序列每天从0开始_序列比对(十一)——计算符号序列的全概率
  8. github设置中文_【Github】100+ Chinese Word Vectors 上百种预训练中文词向量
  9. linux find查找文件然后删除,linu查找find命令及删除7天前的文件
  10. Java IDEA断点调试