BZOJ 3495 [2-SAT]

【前后缀优化建图+2-SAT】BZOJ3495(PA2010)[Riddle]题解 题目概述有 nn 个点, mm 条边和 KK 个国家(国家里的点已知)。每个国家只能选一个点作为首都,并且要保证最后所有边的两端至少有一个点是首都,问是否存在方案。解题报告每个点是首都或不是首都,只有两个状态,所以是2-SAT问题。mm 条边的限制很容易转化,就是每个国家只能选一个点为首都比较奇怪。 其实这是典型的前后缀优化建图,这里以前缀优化建图为例: 首先我们先增加 nn 个点,令 ii 的 阅读详情

Description

k个国家,n个城市,m条边。要求每个国家有且仅有一个首都,每条边两端的城市至少要有一个首都。判断是否有解, 有解输出“TAK”,无解输出”NIE”。1≤k,n,m≤1000000。

Solution

经典二元关系 2-SAT 的模型,但是关系数是 O(n 2 ) 的,不
能承受。
对于一个有 y 个城市的国家,新建 2y 个变量,分别表示前
i 个城市和后 i 个城市中是否有首都。
如此一来关系数降至 O(n + m)。
时间复杂度 O(n + m)。
by Claris

#include <cstdio>
#include <iostream>
using namespace std;

const int N = 6010101;

inline char get(void) {
    static char buf[100000], *S = buf, *T = buf;
    if (S == T) {
        T = (S = buf) + fread(buf, 1, 100000, stdin);
        if (S == T) return EOF;
    }
    return *S++;
}
inline void read(int &x) {
    static char c; x = 0; int sgn = 0;
    for (c = get(); c < '0' || c > '9'; c = get()) if (c == '-') sgn = 1;
    for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0';
    if (sgn) x = -x;
}


int k, n, m, Gcnt, x, y, p, Scnt, cnt, dlc, top;
int c[N];
int S[N];
struct edge {
    int to, next;
    edge(int t = 0, int n = 0):to(t), next(n) {}
};
edge G[N * 2];
int head[N], pre[N], low[N], scc[N];

inline void AddEdge(int from, int to) {
    G[++Gcnt] = edge(to, head[from]); head[from] = Gcnt;
}
inline int Min(int a, int b) {
    return a < b ? a : b;
}
void dfs(int u) {
    pre[u] = low[u] = ++dlc;
    int to; S[++top] = u;
    for (int i = head[u]; i; i = G[i].next) {
        to = G[i].to;
        if (!pre[to]) {
            dfs(to); low[u] = Min(low[u], low[to]);
        } else if (!scc[to]) {
            low[u] = Min(low[u], pre[to]);
        }
    }
    if (low[u] == pre[u]) {
        Scnt++; int x;
        while (true) {
            x = S[top]; top--;
            scc[x] = Scnt;
            if (x == u) break;
        }
    }
}
bool Check(void) {
    int lim = cnt << 1 | 1;
    for (int i = 1; i <= lim; i++)
        if (!pre[i]) dfs(i);
    for (int i = 1; i <= cnt; i++)
        if (scc[i << 1] == scc[i << 1 | 1]) return false;
    return true;
}

int main(void) {
    read(n); read(m); read(k);
    for (int i = 0; i < m; i++) {
        read(x); read(y);
        AddEdge(x << 1, y << 1 | 1);
        AddEdge(y << 1, x << 1 | 1);
    }
    cnt = n;
    while (k--) {
        read(p); 
        for (int i = 1; i <= p; i++) {
            read(x); y = cnt + i;
            if (i != 1) {
                AddEdge((y - 1) << 1 | 1, y << 1 | 1);
                AddEdge(y << 1, (y - 1) << 1);
                AddEdge(x << 1 | 1, (y - 1) << 1);
            } else {
                AddEdge(x << 1, y << 1);
            }
            AddEdge(y << 1, x << 1);
            AddEdge(x << 1 | 1, y << 1 | 1);
            y = cnt + i + p;
            if (i != p) {
                AddEdge((y + 1) << 1 | 1, y << 1 | 1);
                AddEdge(y << 1, (y + 1) << 1);
                AddEdge(x << 1 | 1, (y + 1) << 1);
            } else {
                AddEdge(x << 1, y << 1);
            }
            AddEdge(y << 1, x << 1);
            AddEdge(x << 1 | 1, y << 1 | 1);
        }
        cnt += p * 2;
    }
    if (Check()) printf("TAK\n");
    else printf("NIE\n");
    return 0;
}
大数据合规工程师必备的7项核心技能 当我们谈论“大数据”时,往往先想到它的价值——驱动业务增长、优化用户体验、赋能智能决策。大数据的价值越大,其合规风险的“重量”就越重。2023年,全球有超过120个国家出台了数据保护法规,中国《个人信息保护法》《数据安全法》的实施进入深水区,欧盟GDPR的罚款金额屡创新高(最高达全球营收的4%)。企业面临的合规压力,早已从“被动应对监管”升级为“主动构建合规能力”。在这样的背景下,大数据合规工程师。 阅读详情

相关推荐

MinIO vs 华为云OBS:成本、性能与兼容性深度对比(含实测数据)

本文深度对比了开源对象存储MinIO与华为云OBS在成本、性能、兼容性及运维方面的核心差异。通过实测数据与全生命周期成本分析,为技术决策者提供选型依据。文章指出,MinIO在长期成本控制、性能深度优化及S3 API兼容性方面优势显著,而华为云OBS则提供开箱即用的便利性。

kmeans3miner的博客 593

【BZOJ3495】Riddle(PA2010)-2-SAT+优化建图

测试地址:Riddle 题目大意:n(≤106)n(≤106)n(\le 10^6)个城市被划分成k(≤n)k(≤n)k(\le n)个郡,有m(≤106)m(≤106)m(\le 10^6)条边,要求从每个郡中选取一个城市作为首都,并满足每条边至少有一个端点为首都,判断有没有解。 做法:本题需要用到2-SAT+优化建图。 看到这题第一个想到的是网络流,然而看到这个夸张的数据范围就知道不可能...

Maxwei_wzj的OI世界 517

Starlink卫星动力学系统仿真建模前传1-时空系统介绍

对于在轨道上运动的航天器由于速度接近第一宇宙速度,为了获取准确的位置信息对时间的精度要求极高,为了准确描述航天器的运动规律,本节对卫星仿真建模中用到的各种时间系统进行介绍。卫星轨道平面为坐标平面,坐标原点位于卫星系统质心,轴由卫星系统质心指向地心(当地垂线),轴在轨道面内垂直于轴并指向卫星的前进方向,轴同、轴构成右手系,指向轨道面负法线方向。不同坐标系下的建立的运动形式与复杂程度不同,会直接影响运动方程的求解繁简程度,因此,选取适当的坐标系具有重要的意义。定义星体坐标系,该坐标系简记为系,与卫星本体固连。

xspace的博客 1433

bzoj3495 PA2010 Riddle(2-sat+建图优化)

我们把每个点当不当首部作为两种选择,得到了一个很显然的2-sat。但是对于m个点中有且仅有一个点当首都这个条件我们的建边是O(n^2)的,gg我们考虑如何优化这个建图,如果我们选择第i个点作为首都,则1~i-1都不能当首都,i+1~m也都不能。于是我们想到前缀和后缀和优化,新建2m个点,分别表示1~i有没有首都,i~n有没有首都。然后我们把这些点之间的限制关系建出来,边数就是O(n)的。

Icefox的博客 304

倍福TC3 PLC高速采集实战:如何用PLC-Recorder实现0.24ms级时间戳同步

本文详细介绍了倍福TC3 PLC与PLC-Recorder实现0.24ms级时间戳同步的工程实践方案。通过硬件拓扑设计、时间源选择优化、报文结构封装及同步验证方法,为工业自动化领域的高精度数据采集提供了可靠解决方案,特别适用于精密装配、激光切割等微秒级同步要求的场景。

weixin_29193359的博客 372

Dify+工作流,通过多模态实现发票自动识别

上个章节我们用Dify实现了基于本地知识库的聊天助手,本节我们通过工作流 ,可视化界面快速构建复杂的工作流和自动化流程。结合 OCR(光学字符识别)技术和工作流引擎,可以实现发票的自动识别、数据提取以及后续的审批流程。本文将详细介绍如何使用 Dify 和工作流来实现发票的自动识别与审批。

odin2005的博客 7425

[BZOJ]3495 Riddle 2-Sat 前缀和优化

3495: PA2010 Riddle Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 279  Solved: 97 [Submit][Status][Discuss] Description k个国家,几个城市,m条边。 要求每个国家有且仅有一个首都,每条边两端的城市至少要有一个首都。 判断是否有解, 有解输出“TAK”,无解

Le Petit Prince 525

我是如何让爬虫在小红书风控下“偷数据”的?xhs爬虫这些骚操作你可能想不到

最绝的是,他们连评论区都做了动态加载,第一页显示20条评论,再往下滑就变成“加载失败”,实际上得模拟真人反复上滑下滑才能触发完整加载。上个月我们团队帮一家美妆品牌抓竞品爆款笔记,刚开了10个爬虫账号,结果5分钟不到,系统直接弹窗警告“检测到非正常操作”——后来发现,问题出在Wi-Fi上。小红书的风控每周都在升级,上周还能用的方案,这周可能就得重写。但要是想大规模采集,比如监控竞品爆文、分析用户画像,劝你先算笔账:光是一个能抗封的账号矩阵,每月成本就得烧掉几万块,更别说还得养团队随时应对系统升级。

klj3388的博客 1万+

【BZOJ】2199奶牛议会-2-SAT

传送门:bzoj2199 权限题? 没关系,你洛上也有:洛谷- [USACO11JAN]大陆议会The Continental Cowngress 题解 一道2-SAT简单题。 只需要用到2-SAT连有向边的操作,拓扑排序和缩点都不需要,直接暴力找(非常之暴力)。 代码 #include&amp;lt;bits/stdc++.h&amp;gt; using namespace std;...

远行客 426

在 Mac OS 上编译 WebRTC 教程

在 Mac OS 上编译 WebRTC 教程

iShare_Carlos的博客 1248

用Python和NumPy搞定复合材料层合板ABD矩阵计算(附完整代码与避坑指南)

本文详细介绍了如何使用Python和NumPy高效计算复合材料层合板的ABD刚度矩阵,包括单层板刚度计算、偏轴转换和层合板刚度集成。通过完整的代码示例和工程实践技巧,帮助工程师快速构建定制化分析工具,解决航空航天、汽车制造等领域的复合材料力学性能分析问题。特别提供了避坑指南和性能优化策略,确保计算结果的准确性和效率。

weixin_30752699的博客 277

【2-SAT+前缀优化建图】BZOJ3495 PA2010 Riddle

题面在这里很典型的2-SAT问题…… 可以对每个点是否为首都建图 考虑一条边(u,v),如果u不是首都,则v必须是。反之亦然。 u′→v,v′→uu'\rightarrow v,v'\rightarrow u 然后对于一个国家里的点,有一个是首都则其他都不是首都但是这样边数是N2N^2级别的可以用前缀优化建图。 对于一个点u,建2个变量 分别表示 u是否为首都(u与u’) 和 u所在的国

linkfqy 1328

ABAP 7.40 新语法介绍系列之二 - ABAP 类型转换操作符 CONV

这个lv_input_s变量的唯一使命,就是接收来自 char10 类型的 lv_input_c 变量的值,然后传递到 print 方法里去。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1417

BZOJ 3495: PA2010 Riddle 2-SAT:前缀优化建图

title BZOJ 3495 Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边。 要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都。 Input 第一行有三个整数,城镇数n(\(1\le n\le10^6\)),边数m(\(0\le m\le10^6\)),郡数k(1<=k<=n)。 接下来m行,每行有两个整数ai和bi(ai≠...

dilu0653的博客 277

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

BZOJ3495 PA2010 Riddle 【2-sat】

题目链接 BZOJ3495 题解 每个城市都有选和不选两种情况,很容易考虑到2-sat 边的限制就很好设置了,主要是每个郡只有一个首都的限制 我们不可能两两之间连边,这样复杂度就爆炸了 于是乎就有了一个非常厉害的方法: 前缀后缀和 我们令\(1\)表示选,\(0\)表示不选,维护一个郡的前缀和、后缀和 一个点如果作为首都,那么它和它对应前缀后缀和的位置一定为\(1\),且之前的位置一定为\(0\)...

weixin_30685047的博客 125

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

bzoj3495 PA2010 Riddle(2-SAT 前缀优化建边)

bzoj3495 PA2010 Riddle原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3495题意: k个国家,几个城市,m条边。 要求每个国家有且仅有一个首都,每条边两端的城市至少要有一个首都。 判断是否有解, 有解输出“TAK”,无解输出”NIE”。数据范围 1 < = k, N ,M , < =1000000题解:

Bfk的博客 599

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[BZOJ3495][PA2010][2-SAT]Riddle

明显的2-SAT模型,但是对于国家的限制,边数是O(n2)O(n^2)的。 可以考虑对有x个城市的国家新建x个结点,第i个结点表示1~i的结点中是否存在首都。那么边数就可以优化到O(n)O(n)了#include <cstdio> #include <iostream> #include <algorithm> #define N 1000010 #define M 5000100using na

CE玩家 927

【BZOJ】3495: PA2010 Riddle 2-SAT算法

【题意】有n个城镇被分成了k个郡,有m条连接城镇的无向边。要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都。n,m,k<=10^6。 【算法】2-SAT,前后缀优化建图 【题解】每个城镇只有作为首都和不是首都两种选项,即2-sat问题。 2-sat问题中所有边必须加反向边,下面过程忽略反向边。 对于一条边(x,y),如果x是0,那么y必须是1,即x-y'。(y-x'是...

weixin_34377065的博客 139

BZOJ3495 [PA2010]Riddle

Address BZOJ3495 Solution 很容易想到是 2−SAT2−SAT2-SAT 判断是否有解。 满足每条边至少有一个端点是首都很好处理,对于每一条边 (x,y)(x,y)(x, y): 不选 xxx 就一定要选 yyy。 不选 yyy 就一定要选 xxx。 对于每个郡 {a1,a2,...,aw}{a1,a2,...,aw}\{a_1, a_2, ... ,...

Log_x's Blog 475

bzoj 3495: PA2010 Riddle(2-SAT)

3495: PA2010 Riddle Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 327  Solved: 115 [Submit][Status][Discuss] Description k个国家,几个城市,m条边。 要求每个国家有且仅有一个首都,每条边两端的城市至少要有一个首都。 判断是否有解, 有解输出“TAK”,无

加载中... 435

[BZOJ3495]PA2010 Riddle[2-SAT]

对于一个国家内部,每个点都要向剩下的所有点连边,会有\(O(n^2)\)条边 学习了前缀和优化建图的新姿势 在每个点拆成两个的基础上,再开两个点 \(i_3\),\(i_4\)表示前缀\([1,i]\)中有/没有首都 这个blog讲得比较详细 struct Edge { int v, next; } G[MAXN << 3]; int head[MAXN << 2], ...

weixin_34411563的博客 158

bzoj 3495: PA2010 Riddle 2-sat

bzoj 3495: PA2010 Riddle

Rising_shit的博客 919

[BZOJ]3495: PA2010 Riddle 2-SAT

Description k个国家,几个城市,m条边。 要求每个国家有且仅有一个首都,每条边两端的城市至少要有一个首都。 判断是否有解, 有解输出“TAK”,无解输出”NIE” 1 &lt; = k, N ,M , &lt; =1000000。 题解: 直接建边的话边数太大,所以建多2n2n2n个点分别表示这个国家前nnn个城市中有没有首都,后nnn个城市中有没有首都。然后就比较...

TYB的博客 373

3495: PA2010 Riddle 2-sat 前缀优化

3495: PA2010 Riddle 2-sat 前缀优化 链接 bzoj 思路 不想说啥了,看hwim的吧,我去睡觉了zZ。 代码 /************************************************************** Problem: 3495 User: gryz2016 Language: C++ Resu...

weixin_30258027的博客 135
上一篇: BZOJ 4259 [FFT]
下一篇: BZOJ 4831 [DP]
Vectorxj
博客等级 码龄11年 35粉丝 231原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值