首页 > 其他分享 >[POI2015] WYC 题解

[POI2015] WYC 题解

时间:2024-07-06 16:09:53浏览次数:9  
标签:int 题解 long POI2015 rd WYC define

[POI2015] WYC

显然矩阵乘法
发现点数和边权非常小,所以可以考虑拆点

把每个点拆为 \(u_1\),\(u_2\),\(u_3\), 初始:\(u_1\to u_2\),\(u_2\to u_3\),每一条加边:\(u+(w-1)\times n\to v\)

因为 \(k\) 非常大,所以考虑倍增优化

注意:答案会爆 long long,需要使用 unsigned long long

// Problem: P3597 [POI2015] WYC
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3597
// Memory Limit: 128 MB
// Time Limit: 1000 ms
// https://codeforces.com/problemset/customtest

# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
# define int long long
# define int ull // 会爆 long long 
# define rd(t) read <t> ()
# define mem(a, b) memset (a, b, sizeof (a))
# define fi first
# define se second
# define lc u << 1
# define rc u << 1 | 1
# define debug printf ("debug\n")
const int N = 125; 
template <typename T> inline T read ()
{
    T s = 0; int w = 1; char c = getchar (); 
    for (; !isdigit (c); c = getchar ()) { if (c == '-') w = -1; }
    for (; isdigit (c); c = getchar ()) s = (s << 1) + (s << 3) + c - '0';
    return s * w;
}

int n, m, k; 
struct matrix
{
	int a[N][N]; 
	matrix () { mem (a, 0); } 
	matrix operator * (const matrix &b) const
	{
		matrix ans; 
		for (int i = 0; i < N; i ++ )
		{
			for (int k = 0; k < N; k ++ )
			{
				for (int j = 0; j < N; j ++ )
					ans.a[i][j] += a[i][k] * b.a[k][j]; 
            }
        }
        return ans; 
    }
} a, f[N]; 
bool check (matrix a)
{
    int sum = 0;
    for (int i = 1; i <= n; i ++ )
    {
    	sum += a.a[i][0] - 1; // 每次会多加一个贡献(画图模拟)
    	if (sum >= k) return 1; 
    }
    return 0; 
}
signed main ()
{
	n = rd (int), m = rd (int), k = rd (int); 
    f[0].a[0][0] = 1;
    for(int i = 1; i <= n; i ++ )
    	a.a[i][i] = 
    	f[0].a[i][0] = f[0].a[i][i + n] = f[0].a[i + n][i + 2 * n] = 1;
    for (int i = 1; i <= m; i ++ )
    {
    	int u = rd (int), v = rd (int), w = rd (int); 
        f[0].a[u + (w - 1) * n][v] ++ ; 
    }
    int i; 
    for (i = 1; ; i ++ )
    {
        if (i > 65) { printf ("-1\n"); return 0; } 
        f[i] = f[i - 1] * f[i - 1]; 
        if (check (f[i])) break; 
    }
    i -- ; 
    int ans = 0; 
    for (; i >= 1; i -- )
    {
    	matrix tmp = a * f[i]; 
        if (!check (tmp)) a = tmp, ans += (1llu << i);
    }
    matrix tmp = a * f[0]; 
    if (!check (tmp)) a = tmp, ans += (1llu << 0);
    printf ("%lld\n", (ll)ans); 
    return 0; 
}

标签:int,题解,long,POI2015,rd,WYC,define
From: https://www.cnblogs.com/legendcn/p/18287357

相关文章

  • python-docx库 写入docx时中文不适配问题,中文异常问题解决办法。
    python-docx库写入docx时中文不适配问题,中文异常问题解决办法。通过以下方法可以成功将正文修改为宋体字体。这个是全文设置。fromdocx.oxml.nsimportqndoc=Document()doc.styles['Normal'].font.name=u'宋体'doc.styles['Normal']._element.rPr.rFonts.set(qn('w:......
  • ZeroMQ最全面试题解读(3万字长文)
    目录解释ZeroMQ是什么,它的主要用途是什么?ZeroMQ支持哪些通信模式?描述一下ZeroMQ中的“消息”和“消息帧”如何在C++中初始化一个ZeroMQ上下文?在ZeroMQ中,如何创建一个套接字并将其绑定到特定端口?解释什么是“管道模式”(PipePattern)说明如何使用ZeroMQ进行点对点通信Zer......
  • 题解:CF1256D Binary String Minimizing
    贪心。数据范围\(n\le10^{6}\),因此我们要用时间复杂度为\(\mathcal{O}\left(n\right)\)的算法来解决这个问题。思路从左至右扫一遍序列,如果遇到\(10\),则要将这个\(0\)交换到前面的位置。由于是字典序最小,\(0\)应该尽量在最高位。现在需要知道这个\(0\)被交换到哪......
  • 2016 CSP-J/NOIP万字长文复赛真题题解——秒杀T1 买铅笔,T2 回文日期,T3 海港,T4 魔法
    [NOIP2016普及组]买铅笔题干[NOIP2016普及组]买铅笔题目背景NOIP2016普及组T1题目描述P老师需要去商店买nnn支铅笔作为小朋友们参加NOIP的礼物。她发现......
  • 端口占用问题解决方案(Windows)
    端口占用问题解决方案(Windows)在开发和运维过程中,我们经常会遇到端口被占用的情况。这可能导致服务器启动失败或者其他服务无法正常运行。本文将介绍如何使用命令行工具来查询和解决端口占用问题。一、查询当前所有端口使用情况可以使用netstat-ano命令来查看当前所有......
  • StarRocks数据导入慢问题解决
    一、问题描述依据StarRocks官网快速开始安装教程,用dockercompose安装了starrocks,log模块从rabbitMq的队列批量获取log消息,发现队列消息有堆积,一晚上下来大概能对接4000条消息。经单元测试发现insertinto到starrocks中时间竟然相差几百倍。mysql每条insertsql执行3.5mss......
  • 题解 - 定价
    题目题目描述你如此计算一个价格\(p\)(为正整数)的荒谬程度:首先将\(p\)看做一个由数字组成的字符串(不带前导\(0\));然后,如果\(p\)的最后一个字符是\(0\),就去掉它。重复这一过程,直到\(p\)的最后一个字符不是\(0\);记\(p\)的长度为\(a\),如果此时\(p\)的最后一位是......
  • 洛谷P5517题解
    题目解释现有一数列:\(a_{0}=-3,a_{1}=-6,a_{2}=-12,a_{n}=3a_{n-1}+a_{n-2}-3a_{n-3}+3^n,求T组a_{n}\)modp的异或和题目思路分析抛开复杂度不谈,这道题可以用矩阵加速(矩阵的快速幂)和通项公式两种方法来做,这两种方法求一个\(a_{n}\)的时间复杂度都是\(log_2(n)\),但矩阵乘法需......
  • Kali网卡失效IP不显示问题解决
    因为我的个人习惯,通常为虚拟机配置两个网卡,一个Host-only网卡用于与主机进行通信、一个网络地址转换网卡用于访问网络。然而,在配置Kali主机时,常常遇到网络地址转换网卡断联的现象,导致虚拟机无法正常访问网络。根据先前的经验,问题出在网络配置上。查看/etc/network/interfaces文......
  • [题解]逃离地球
    题意简述有一个星系,共有\(n*m\)个星球,排成\(n\)行\(m\)列。初始星球之间没有道路。接下来给定\(P\)种魔法\(1\),\(Q\)种魔法\(2\):魔法\(1\):第\(i\)种魔法用\(a_i,b_i,c_i\)描述。表示你可以任选星系的一行,在第\(a_i\)和第\(b_i\)个星球之间建立一条航道,消耗\(c_i\)的能量。魔......