设第i个人在t时刻生/死为(x,0/1,t),然后显然能够连上(x,0,t)->(x,0,t-1),(x,1,t)->(x,1,t+1),然后对于每个限制,用朴素的2-SAT连边即可。

但这样的点数达到了O(nT),其实有一种方法可以只把限制的边连接建图,点数为4m,这样可能会被卡常。

有没有更优秀的做法?当然还是有的。对于2-SAT中的边(x,y),若y在2-SAT中无出边,则x->y与x->y的后继等价,于是点数可以控制在2n+2m。然后很容易发现,生、死状态的图均为拓扑图,而只有生->死的边没有死->生的边,所以原图是拓扑图所以我们的问题变成了对于每一个(x,0,T+1)求出它能够到达的所有(y,1,T+1)的状态数。于是可以topsort+bitset优化,为了能不爆内存,可以分批topsort,每次104个点左右是最好的。

#include<bits/stdc++.h>
using namespace std;
const int N=5e4+,M=3e5+;
struct node{int tp,t,x,y;};
int T,n,m,sum[N],ans[N],in[M],q[M],vis[N];
bitset<>tmp,b[M];
vector<int>G[M],vec[N];
vector<node>now;
void topsort(int L,int R)
{
int qs=,qe=;
for(int i=;i<=*sum[n];i++)for(int j=;j<G[i].size();j++)in[G[i][j]]++;
for(int i=;i<=*sum[n];i++)if(!in[i])q[qe++]=i;
while(qs<qe)
{
int u=q[qs++];
for(int i=;i<G[u].size();i++)
{
b[G[u][i]]|=b[u];
if(!--in[G[u][i]])q[qe++]=G[u][i];
}
}
tmp.reset();
for(int i=L;i<=R;i++)if(b[sum[i]][i-L])vis[i]=,tmp.set(i-L);
for(int i=;i<=n;i++)if(!vis[i])ans[i]+=(b[sum[i]]|tmp).count();
}
int main()
{
scanf("%d%d%d",&T,&n,&m);
for(int i=;i<=m;i++)
{
node u;scanf("%d%d%d%d",&u.tp,&u.t,&u.x,&u.y),u.tp^=;
now.push_back(u),vec[u.x].push_back(u.t);
}
for(int i=;i<=n;i++)
{
sort(vec[i].begin(),vec[i].end());
vec[i].push_back(T+);
int t=unique(vec[i].begin(),vec[i].end())-vec[i].begin();
sum[i]=sum[i-]+t,vec[i].resize(t);
}
for(int i=;i<now.size();i++)
{
int x=now[i].x,y=now[i].y,t=now[i].t;
int p=lower_bound(vec[x].begin(),vec[x].end(),t)-vec[x].begin()+sum[x-]+;
int q=lower_bound(vec[y].begin(),vec[y].end(),now[i].tp+t)-vec[y].begin()+sum[y-]+;
if(now[i].tp)G[q+sum[n]].push_back(p+sum[n]),G[p].push_back(q);
else G[q+sum[n]].push_back(p),G[p+sum[n]].push_back(q);
}
for(int u=;u<=n;u++)
for(int i=sum[u-]+;i<sum[u];i++)
G[i].push_back(i+),G[i++sum[n]].push_back(i+sum[n]);
for(int i=;i<=n;i+=)
{
for(int j=;j<=*sum[n];j++)b[j].reset();
for(int j=;i+j<=n&&j<;j++)b[sum[i+j]+sum[n]].set(j);
topsort(i,min(n,i+));
}
for(int i=;i<=n;i++)printf("%d ",vis[i]?:n-ans[i]-);
}

[JSOI2019]精准预测(2-SAT+拓扑排序+bitset)的更多相关文章

  1. [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

    [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...

  2. NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset

    描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...

  3. [BZOJ4484][JSOI2015]最小表示[拓扑排序+bitset]

    题意 给你一个 \(n\) 个点 \(m\) 条边的 \(\rm DAG\) ,询问最多能够删除多少条边,使得图的连通性不变 \(n\leq 3\times 10^4\ ,m\leq 10^5\) . ...

  4. BZOJ4484 JSOI2015最小表示(拓扑排序+bitset)

    考虑在每个点的出边中删除哪些.如果其出边所指向的点中存在某点能到达另一点,那么显然指向被到达点的边是没有用的.于是拓扑排序逆序处理,按拓扑序枚举出边,bitset维护可达点集合即可. #include ...

  5. 洛谷 P5332 - [JSOI2019]精准预测(2-SAT+bitset+分块处理)

    洛谷题面传送门 七月份(7.31)做的题了,题解到现在才补,不愧是 tzc 首先不难发现题目中涉及的变量都是布尔型变量,因此可以考虑 2-SAT,具体来说,我们将每个人在每个时刻的可能的状态表示出来. ...

  6. BZOJ 4484: [Jsoi2015]最小表示(拓扑排序+bitset)

    传送门 解题思路 \(bitset\)维护连通性,给每个点开个\(bitset\),第\(i\)位为\(1\)则表示与第\(i\)位联通.算答案时显然要枚举每条边,而枚举边的顺序需要贪心,一个点先到达 ...

  7. CH 2101 - 可达性统计 - [BFS拓扑排序+bitset状压]

    题目链接:传送门 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条 ...

  8. BZOJ5109 CodePlus 2017大吉大利,晚上吃鸡!(最短路+拓扑排序+bitset)

    首先跑正反两遍dij求由起点/终点到某点的最短路条数,这样条件一就转化为f(S,A)*f(T,A)+f(S,B)*f(T,B)=f(S,T).同时建出最短路DAG,这样图中任何一条S到T的路径都是最短 ...

  9. [JSOI2019]精准预测

    题目 这么明显的限制条件显然是\(\text{2-sat}\) 考虑按照时间拆点,\((0/1,x,t)\)表示\(x\)个人在时间\(t\)是生/死 有一些显然的连边 \[(0,x,t+1)-> ...

随机推荐

  1. MVC三层架构在各框架中的特征

    转一篇写得很棒的文章:https://my.oschina.net/win199176/blog/208171?p=7&temp=1495894148424 1.基于web开发中最原始的jsp ...

  2. 吴裕雄--天生自然TensorFlow2教程:张量限幅

    import tensorflow as tf a = tf.range(10) a # a中小于2的元素值为2 tf.maximum(a, 2) # a中大于8的元素值为8 tf.minimum(a ...

  3. MySQL的异常问题

    异常问题

  4. Nginx系列p4:进程结构

    Nginx 有两种进程结构:单进程结构,多进程结构.本篇文章我们主要说多进程结构. 问:那为什么 Nginx 采用多进程结构,而不是多线程结构呢? 答:这是因为 Nginx 最核心的目的就是要保证高可 ...

  5. POJ 3970:Party

    Party Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status ...

  6. C++ 操作数据库类

    #pragma once #include <string> #include <windows.h> #include <algorithm> #include ...

  7. Ubuntu Kylin 14.04LTS 开机后卡在登陆界面,可以进入字符界面,或者登陆后鼠标不显示但是管用

    2014年4月27日,距离中期检查还有七天,基本上什么也没做,特别着急,雨已经下了快一天了,中午用美团外卖定的黄焖排骨,MD,什么玩意,那么一点点就18块钱,一看就不值五块钱,发誓再也不吃,最重要的是 ...

  8. Java8集合框架——基本知识点

    前言 Java的基础集合框架的内容并不复杂,List.Map.Set 中大概10个常见的集合类,建议多看几遍源码(Java8),然后回过头再来看看这些各路博客总结的知识点,会有一种豁然开朗的感觉. 本 ...

  9. Q4:Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays 官方的链接:4. Median of Two Sorted Arrays Description : There are two sort ...

  10. (day 1)创建项目--1

    1.利用cmd(命令行)创建项目myblog 确定好项目要放在哪个directory. dir一下创建好的项目看下有什么 django自带有一个小型的服务器可通过  runserver 启动它 可取浏 ...