6389. 【NOIP2019模拟2019.10.26】小w学图论
题目描述



题解
之前做过一次
假设图建好了,设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学图论的更多相关文章
- 6392. 【NOIP2019模拟2019.10.26】僵尸
		题目描述 题解 吼题但题解怎么这么迷 考虑一种和题解不同的做法(理解) 先把僵尸离散化,h相同的钦(ying)点一个大小 (可以发现这样每种情况只会被算正好一次) 计算完全被占领的方案,然后1-方案/ ... 
- 【JZOJ6389】小w学图论
		description 小w这学期选了门图论课,他在学习点着色的知识.他现在得到了一张无向图,并希望在这张图上使用最多n种颜色给每个节点染色,使得任意一条边关联的两个节点颜色不同. 小w获得一张n个节 ... 
- 6380. 【NOIP2019模拟2019.10.06】小w与最长路(path)
		题目 题目大意 给你一棵树,对于每一条边,求删去这条边之后,再用一条边(自己定)连接两个连通块,形成的树的直径最小是多少. 正解 首先,将这棵树的直径给找出来.显然,如果删去的边不在直径上,那么答案就 ... 
- 【NOIP2019模拟2019.10.07】果实摘取 (约瑟夫环、Mobius反演、类欧、Stern-Brocot Tree)
		Description: 小 D 的家门口有一片果树林,果树上果实成熟了,小 D 想要摘下它们. 为了便于描述问题,我们假设小 D 的家在二维平面上的 (0, 0) 点,所有坐标范围的绝对值不超过 N ... 
- 6377. 【NOIP2019模拟2019.10.05】幽曲[埋骨于弘川]
		题目描述 题解 随便bb 详细题解见 https://www.cnblogs.com/coldchair/p/11624979.html https://blog.csdn.net/alan_cty/ ... 
- 6383. 【NOIP2019模拟2019.10.07】果实摘取
		题目 题目大意 给你一个由整点组成的矩形,坐标绝对值范围小于等于\(n\),你在\((0,0)\),一开始面向\((1,0)\),每次转到后面第\(k\)个你能看到的点,然后将这条线上的点全部标记删除 ... 
- 6374. 【NOIP2019模拟2019.10.04】结界[生与死的境界]
		题目 题目大意 给你一个数列,每次可以选择任意两个相邻的数\(x\)和\(y\),将其删去,并在原来位置插入\(x+2y\). 每次询问一个区间,对这个区间进行上述操作.求最后剩下的数最大是多少. 答 ... 
- 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 ... 
- 【NOIP2017模拟6.25】小W的动漫
		题目 小W最近迷上了日本动漫,每天都有无数部动漫的更新等着他去看,所以他必须将所有的动漫排个顺序,当然,虽然有无数部动漫,但除了1号动漫,每部动漫都有且仅有一部动漫是它的前传(父亲),也就是说,所有的 ... 
随机推荐
- linux系统中不小心执行了rm -rf ./* 怎么办?解决:文件系统的备份与恢复
			XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据.xfsdump 按inode顺序备份一个XFS文件系统.centos7选择xfs格式作为默认文件系统,而且不 ... 
- 多线程16-SpinWait
			); isCompleted = )); isCompleted = ); isCompleted = true; ... 
- CentOS7 安装dotnet sdk 2.1.401 的简单办法
			1. 下载 linux版本的tar包 路径为: https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.1.401-linux-x64 ... 
- 小解POJO、PO、BO、VO
			POJO :plain ordinary java object 无规则简单java对象 一个中间对象,可以转化为PO.DTO.VO. 一个简单的Java类,这个类没有实现/继承任何特殊的java接口 ... 
- 深入IO   想学必看!受益匪浅哦~
			一:IO流概述 IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数据传输,Java对于数据的操作都是通过流实现,而Java用于操作流的对象都在IO包中. 分类: 按操作数据 ... 
- arm初识
			一.CPU从指令集角度分类 1.1. CISC (X86) 1.1. 1. CISC CPU 指complex instruction set computer复杂指令集CPU 1.1.2. CIS ... 
- docker环境下分析zookeeper观察者角色
			问题引入 zookeeper新引入的角色observer是不参与投票的,通过增加observer节点,可以在提高zk系统读吞吐量时,不影响写吞吐量. 那么问题来了 Zookeeper系统节点如果超过半 ... 
- 01:django基础篇
			Django其他篇 目录: 1.1 django初探 1.2 第一个django项目 1.3 django render/redirect/HttpResponse 和 request.GET req ... 
- HNUSTOJ-1253 Babelfish(字典树)
			1253: Problem C: Babelfish 时间限制: 1 Sec 内存限制: 128 MB提交: 14 解决: 3[提交][状态][讨论版] 题目描述 Problem C: Babel ... 
- 关系型数据库为什么喜欢使用B+树作为索引结构? (转)
			问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到<架构师之路>,一本本查,要查到什么时候去? 于是,图书管理员设计了一套规则: (1)一楼放历史类,二楼放文学类, ... 
