设第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. 使用软件模拟spi 时序时注意点

    软件模拟 spi 时序有以下几个点需要注意: cs 使能后到第一个 sck 边沿需要延时. 最后一个sck 边沿到下一个 cs 需要延时. sck 的高电平和低电平本身需要维持时间. mosi 需要先 ...

  2. 实验吧-密码学-js(Chrome用console.log调试js)

    题目就是js,可能就是一个js的代码,查看源码并复制,在Chrome中打开网页,审查元素. 将复制的代码输入,将eval改成console.log,再回车执行,就得到一段js代码. 代码中有Unico ...

  3. MySQL笔记 01

    STRUCTURE QUERY LANGUAGE 数据库CRUD操作 DDL: 数据库定义语言,定义数据库数据表结构 CREATE(创建): 创建数据库 CREATE DATABASE 数据库名字; ...

  4. LCA--P3379 【模板】最近公共祖先(LCA)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入格式 第一行包含三个正整数 N,M,S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来 N−1 行每行包含两个 ...

  5. webapi 传入参数校验

    /// <summary> /// 传入参数校验过滤器 /// </summary> public class ValidateReqModelFilter : ActionF ...

  6. 吴裕雄--天生自然 JAVASCRIPT开发学习:计时事件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Thread--synchronized&volatile

  8. Ubuntu的软件安装管理---dpkg与apt-*详解

    摘要:软件厂商先在他们的系统上面编译好了我们用户所需要的软件,然后将这个编译好并可执行的软件直接发布给用户安装.不同的 Linux 发行版使用不同的打包系统,一般而言,大多数发行版分别属于两大包管理技 ...

  9. EOF是什么?(笔记)

    一.参考文章 1.EOF是什么?(阮一峰网络日志) 2.Linux 中的 EOF 到底是什么 二.知识点 1.EOF 定义在 /usr/include/stdio.h 文件中: 从上面 EOF 的定义 ...

  10. python+Sqlite+Dataframe打造金融股票数据结构

    5. 本地数据库 很简单的用本地Sqlite查找股票数据. DataSource类,返回的是Dataframe物件.这个Dataframe物件,在之后的业务,如计算股票指标,还需要特别处理. impo ...