题目描述





题解

之前做过一次

假设图建好了,设g[i]表示i->j(i<j)的个数

那么ans=∏(n-g[i]),因为连出去的必定会构成一个完全图,颜色互不相同

从n~1染色,点i的方案数是(n-g[i])

用线段树合并维护集合即可

code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define min(a,b) (a<b?a:b)
#define mod 998244353
using namespace std; int tr[4000001][4];
int n,m,i,j,k,l,x,y,len;
long long ans,sum; void swap(int &x,int &y)
{
int z=x;
x=y;
y=z;
} void New(int t,int x)
{
if (!tr[t][x])
{
tr[t][x]=++len;
tr[len][3]=n+1;
}
} void change(int t,int l,int r,int x)
{
int mid=(l+r)/2; ++tr[t][2];
tr[t][3]=min(tr[t][3],x); if (l==r)
return; if (x<=mid)
{
New(t,0);
change(tr[t][0],l,mid,x);
}
else
{
New(t,1);
change(tr[t][1],mid+1,r,x);
}
} int find(int t,int l,int r,int x,int y)
{
int sum=0,mid=(l+r)/2; if (x<=l && r<=y)
return tr[t][2]; if (x<=mid)
{
if (tr[t][0])
sum+=find(tr[t][0],l,mid,x,y);
}
if (mid<y)
{
if (tr[t][1])
sum+=find(tr[t][1],mid+1,r,x,y);
} return sum;
} int Find(int t,int l,int r,int x)
{
int mid=(l+r)/2,ans=n+1,s; if (x<=l) return tr[t][3]; if (tr[t][0] && x<=mid)
s=Find(tr[t][0],l,mid,x),ans=min(ans,s);
if (tr[t][1])
s=Find(tr[t][1],mid+1,r,x),ans=min(ans,s); return ans;
} void merge(int t1,int t2,int l,int r)
{
int mid=(l+r)/2; if (l==r) return; if (tr[t1][0] && tr[t2][0])
merge(tr[t1][0],tr[t2][0],l,mid);
else
if (tr[t2][0])
tr[t1][0]=tr[t2][0]; if (tr[t1][1] && tr[t2][1])
merge(tr[t1][1],tr[t2][1],mid+1,r);
else
if (tr[t2][1])
tr[t1][1]=tr[t2][1]; tr[t1][2]=tr[tr[t1][0]][2]+tr[tr[t1][1]][2];
tr[t1][3]=min(tr[tr[t1][0]][3],tr[tr[t1][1]][3]);
} int main()
{
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout); scanf("%d%d",&n,&m);
len=n;
fo(i,1,n)
tr[i][3]=n+1; fo(i,1,m)
{
scanf("%d%d",&x,&y);
if (x>y) swap(x,y); change(x,1,n,y);
} tr[0][3]=n+1;
ans=n;
fo(i,1,n-1)
{
ans=(ans*(n-find(i,1,n,i+1,n)))%mod; j=Find(i,1,n,i+1);
if (j<=n)
merge(j,i,1,n);
} printf("%lld\n",ans); fclose(stdin);
fclose(stdout); return 0;
}

6389. 【NOIP2019模拟2019.10.26】小w学图论的更多相关文章

  1. 6392. 【NOIP2019模拟2019.10.26】僵尸

    题目描述 题解 吼题但题解怎么这么迷 考虑一种和题解不同的做法(理解) 先把僵尸离散化,h相同的钦(ying)点一个大小 (可以发现这样每种情况只会被算正好一次) 计算完全被占领的方案,然后1-方案/ ...

  2. 【JZOJ6389】小w学图论

    description 小w这学期选了门图论课,他在学习点着色的知识.他现在得到了一张无向图,并希望在这张图上使用最多n种颜色给每个节点染色,使得任意一条边关联的两个节点颜色不同. 小w获得一张n个节 ...

  3. 6380. 【NOIP2019模拟2019.10.06】小w与最长路(path)

    题目 题目大意 给你一棵树,对于每一条边,求删去这条边之后,再用一条边(自己定)连接两个连通块,形成的树的直径最小是多少. 正解 首先,将这棵树的直径给找出来.显然,如果删去的边不在直径上,那么答案就 ...

  4. 【NOIP2019模拟2019.10.07】果实摘取 (约瑟夫环、Mobius反演、类欧、Stern-Brocot Tree)

    Description: 小 D 的家门口有一片果树林,果树上果实成熟了,小 D 想要摘下它们. 为了便于描述问题,我们假设小 D 的家在二维平面上的 (0, 0) 点,所有坐标范围的绝对值不超过 N ...

  5. 6377. 【NOIP2019模拟2019.10.05】幽曲[埋骨于弘川]

    题目描述 题解 随便bb 详细题解见 https://www.cnblogs.com/coldchair/p/11624979.html https://blog.csdn.net/alan_cty/ ...

  6. 6383. 【NOIP2019模拟2019.10.07】果实摘取

    题目 题目大意 给你一个由整点组成的矩形,坐标绝对值范围小于等于\(n\),你在\((0,0)\),一开始面向\((1,0)\),每次转到后面第\(k\)个你能看到的点,然后将这条线上的点全部标记删除 ...

  7. 6374. 【NOIP2019模拟2019.10.04】结界[生与死的境界]

    题目 题目大意 给你一个数列,每次可以选择任意两个相邻的数\(x\)和\(y\),将其删去,并在原来位置插入\(x+2y\). 每次询问一个区间,对这个区间进行上述操作.求最后剩下的数最大是多少. 答 ...

  8. UESTC_小panpan学图论 2015 UESTC Training for Graph Theory<Problem J>

    J - 小panpan学图论 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) S ...

  9. 【NOIP2017模拟6.25】小W的动漫

    题目 小W最近迷上了日本动漫,每天都有无数部动漫的更新等着他去看,所以他必须将所有的动漫排个顺序,当然,虽然有无数部动漫,但除了1号动漫,每部动漫都有且仅有一部动漫是它的前传(父亲),也就是说,所有的 ...

随机推荐

  1. linux系统中不小心执行了rm -rf ./* 怎么办?解决:文件系统的备份与恢复

    XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据.xfsdump 按inode顺序备份一个XFS文件系统.centos7选择xfs格式作为默认文件系统,而且不 ...

  2. 多线程16-SpinWait

        );             isCompleted = ));             isCompleted = );             isCompleted = true;    ...

  3. CentOS7 安装dotnet sdk 2.1.401 的简单办法

    1. 下载 linux版本的tar包 路径为: https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.1.401-linux-x64 ...

  4. 小解POJO、PO、BO、VO

    POJO :plain ordinary java object 无规则简单java对象 一个中间对象,可以转化为PO.DTO.VO. 一个简单的Java类,这个类没有实现/继承任何特殊的java接口 ...

  5. 深入IO 想学必看!受益匪浅哦~

    一:IO流概述 IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数据传输,Java对于数据的操作都是通过流实现,而Java用于操作流的对象都在IO包中. 分类: 按操作数据 ...

  6. arm初识

    一.CPU从指令集角度分类 1.1. CISC  (X86) 1.1. 1. CISC CPU 指complex instruction set computer复杂指令集CPU 1.1.2. CIS ...

  7. docker环境下分析zookeeper观察者角色

    问题引入 zookeeper新引入的角色observer是不参与投票的,通过增加observer节点,可以在提高zk系统读吞吐量时,不影响写吞吐量. 那么问题来了 Zookeeper系统节点如果超过半 ...

  8. 01:django基础篇

    Django其他篇 目录: 1.1 django初探 1.2 第一个django项目 1.3 django render/redirect/HttpResponse 和 request.GET req ...

  9. HNUSTOJ-1253 Babelfish(字典树)

    1253: Problem C: Babelfish 时间限制: 1 Sec  内存限制: 128 MB提交: 14  解决: 3[提交][状态][讨论版] 题目描述 Problem C: Babel ...

  10. 关系型数据库为什么喜欢使用B+树作为索引结构? (转)

    问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到<架构师之路>,一本本查,要查到什么时候去? 于是,图书管理员设计了一套规则: (1)一楼放历史类,二楼放文学类, ...