AtCoder Regular Contest 176 C. Max Permutation(计数 分类讨论)

2024-04-28 07:52

本文主要是介绍AtCoder Regular Contest 176 C. Max Permutation(计数 分类讨论),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

思路来源

乱搞ac

题解

1. 如果有边的权值是1,意味着有两个点的权值都是1,无解

2. 如果一个点i被多个max条件控制,它的值不能超过这些max里最小的那个,记做up[i]

3. 如果同一个权值w对应的边不少于2条,这些边应该有一个公共点i,否则无解,如果up[i]<w也无解,否则给这个点i赋初值w

4. 从大到小考虑权值w,类似拓扑排序,把度为0的点加到队列里,初始没有被边覆盖的点是度为0的点,后续删掉max边之后且没有填值的点是度为0的点,当前度为0的点是自由点

检查所有权值w的边,对于当前边两个端点u,v

(1)如果w这个值已经被点i用了,u、v两个点中得有一个是i,否则无解

(2)如果没有用,考虑up[u]和up[v],如果都小于w,说明无解;如果正好有一个等于w,说明就该是那个点填w;否则有两个点等于w,说明都可以,把其中一个填w,剩下一个当自由点

从大到小考虑权值w的过程中,对于没有限制的,乘上当前自由点的个数,并令当前自由点数减1

其实就是在一个不断删除边的过程中统计数量

代码

//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
const int N=2e5+10,mod=998244353;
int n,m,a[N],b[N],c[N],up[N],res[N],to[N],deg[N];
vector<P>col[N];
map<int,int>mp;
bool used[N];
int main(){sci(n),sci(m);rep(i,1,n)up[i]=n+1;rep(i,1,m){sci(a[i]),sci(b[i]),sci(c[i]);deg[a[i]]++;deg[b[i]]++;up[a[i]]=min(up[a[i]],c[i]);up[b[i]]=min(up[b[i]],c[i]);col[c[i]].pb(P(a[i],b[i]));}if(!col[1].empty()){puts("0");return 0;}rep(i,2,n){if(!SZ(col[i]))continue;mp.clear();int mx=0;for(auto &x:col[i]){mp[x.fi]++;mp[x.se]++;mx=max(mx,mp[x.fi]);mx=max(mx,mp[x.se]);}int sz=SZ(col[i]);if(sz>=2){for(auto &x:mp){int pos=x.fi,cnt=x.se;if(cnt!=mx)continue;if(cnt!=sz){puts("0");return 0;}else{if(up[pos]<i){puts("0");return 0;}res[pos]=i;used[i]=1;to[i]=pos;}}}}ll ans=1,cnt=0;rep(i,1,n){if(!deg[i])cnt++;}per(i,n,1){if(!SZ(col[i])){ans=1ll*ans*cnt%mod;cnt--;continue;}for(auto &x:col[i]){int u=x.fi,v=x.se;if(up[u]<i && up[v]<i){puts("0");return 0;}if(used[i]){if(res[u]!=i && res[v]!=i){puts("0");return 0;}deg[u]--;deg[v]--;if(!deg[u] && res[u]!=i)cnt++;if(!deg[v] && res[v]!=i)cnt++;continue;}if(up[u]==i && up[v]<i){res[u]=i;used[i]=1;deg[v]--;if(!deg[v])cnt++;continue;}if(up[v]==i && up[u]<i){res[v]=i;used[i]=1;deg[u]--;if(!deg[u])cnt++;continue;}ans=2ll*ans%mod;cnt++;}}printf("%lld\n",ans);return 0;
}

这篇关于AtCoder Regular Contest 176 C. Max Permutation(计数 分类讨论)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/942693

相关文章

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

用Pytho解决分类问题_DBSCAN聚类算法模板

一:DBSCAN聚类算法的介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。 DBSCAN算法的主要特点包括: 1. 基于密度的聚类:DBSCAN算法通过识别被低密

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板(类似卡片)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用以下哪种方法? 易错14.敏捷--精益、敏捷、看板(类似卡片)--敏捷、精益和看板方法共同的重点在于交付价值、尊重人、减少浪费、透明化、适应变更以及持续改善等方面。

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户