题目

这么明显的限制条件显然是\(\text{2-sat}\)

考虑按照时间拆点,\((0/1,x,t)\)表示\(x\)个人在时间\(t\)是生/死

有一些显然的连边

\[(0,x,t+1)->(0,x,t)
\]

就是如果想在\(t+1\)时刻还是活着那必须在\(t\)时刻还活着

\[(1,x,t)->(1,x,t+1)
\]

就是如果\(t\)时刻死了,那么\(t+1\)时刻也得是死的

对于第一种限制,显然是连\((1,x,t)->(1,y,t+1)\),别忘了连对称边,就是\(y\)在\(t+1\)时刻活着,那么\(x\)在\(t\)时刻可不能死,于是\((0,y,t+1)->(0,x,t)\)

对于第二种限制,连\((0,x,t)->(1,y,t)\),对称边连\((0,y,t)->(1,x,t)\)

发现按照上面的方式建图我们仅是点数就是\(nT\)级别,不能接受

发现每个人的生/死都连成了一条链,我们把上面每一其他边相连的点缩掉,这样图的点数就达到了\(n+m\)级别

简单分析我们发现这是一个\(\rm DAG\)

要对每个人求出有多少个人能和他一起活到最后

首先如果第\(i\)个人,\((0,i,T+1)\)能走到\((1,i,T+1)\),即\(i\)活着能推出\(i\)死了,于是\(i\)显然不能活着,自然也就不可能有点能和\(i\)一起活到最后。对于这样的点直接输出\(0\)即可。

否则,我们就看看如果这个点活着,那么能推出多少个点死了,即\((0,i,T+1)\)能到达多少种不同的\((1,y,T+1)\),这是经典的有向图传递闭包问题,只能做到\(\rm bitset\)复杂度。

那\(\rm bitset\)复杂度就可以了,\(O(\frac{m(n+m)}{w})\)大概就能过了。

但是这样\((0,i,T+1)\)可能没有办法走到那些必死点,我们把必死点做一个\(\rm bitset\),和\(i\)点的\(\rm bitset\)取一个或就可了。

之后点数大概是\(4\times 10^5\)级别,显然开不下这么大的\(\rm bitset\)。考虑奇技淫巧,我们把\(\rm bitset\)分段,多做几遍就好了

代码

#include<bits/stdc++.h>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#pragma GCC optimize(3)
#pragma GCC optimize("-fcse-skip-blocks")
#define getchar() (S==TT&&(TT=(S=BB)+fread(BB,1,1<<15,stdin),S==TT)?EOF:*S++)
char BB[1<<18],*S=BB,*TT=BB;
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=4.6e5+1;
const int W=10000;
struct E{int v,nxt;}e[600005];
int head[maxn],vis[maxn];
std::bitset<10000> dp[maxn],g;
std::vector<int> id[2][50001],ti[50001];
int xx[100001],t[100001],yy[100001],op[100001];
int n,m,T,cnt,num,chk[50001],ans[50001];
inline void add(int x,int y) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;}
inline int find(int x,int c) {
int l=0,r=ti[x].size()-1;
while(l<=r) {
int mid=l+r>>1;
if(ti[x][mid]==c) return mid;
if(ti[x][mid]<c) l=mid+1;else r=mid-1;
}
return 0;
}
void dfs(int x) {
if(vis[x]) return;vis[x]=1;
for(re int i=head[x];i;i=e[i].nxt)
dfs(e[i].v),dp[x]|=dp[e[i].v];
}
void calc(int l,int r) {
if(l>n) return;r=min(n,r);g.reset();
for(re int i=1;i<=cnt;i++) vis[i]=0,dp[i].reset();
for(re int i=l;i<=r;i++)
for(re int j=0;j<ti[i].size();++j)
dp[id[1][i][j]][i-l]=1;
for(re int i=1;i<=n;i++) dfs(id[0][i][ti[i].size()-1]);
for(re int i=l;i<=r;i++) if(dp[id[0][i][ti[i].size()-1]][i-l]) g[i-l]=1,chk[i]=1;
for(re int i=1;i<=n;i++) {
if(chk[i]) continue;
int x=id[0][i][ti[i].size()-1];;
ans[i]+=(dp[x]|g).count();
}
}
int main() {
T=read(),n=read(),m=read();
for(re int i=1;i<=m;i++) {
op[i]=read(),t[i]=read(),xx[i]=read(),yy[i]=read();
ti[xx[i]].push_back(t[i]);
ti[yy[i]].push_back(t[i]+(op[i]==1?0:1));
}
for(re int i=1;i<=n;i++) ti[i].push_back(T+1);
for(re int i=1;i<=n;i++) {
std::sort(ti[i].begin(),ti[i].end());
ti[i].erase(std::unique(ti[i].begin(),ti[i].end()),ti[i].end());
for(re int j=0;j<ti[i].size();++j)
id[0][i].push_back(++cnt),id[1][i].push_back(++cnt);
for(re int j=0;j<ti[i].size()-1;++j)
add(id[1][i][j],id[1][i][j+1]);
for(re int j=ti[i].size()-1;j;--j)
add(id[0][i][j],id[0][i][j-1]);
}
for(re int i=1;i<=m;i++) {
int x=find(xx[i],t[i]),y;
if(op[i]) {
y=find(yy[i],t[i]);
add(id[0][xx[i]][x],id[1][yy[i]][y]);
add(id[0][yy[i]][y],id[1][xx[i]][x]);
}
else {
y=find(yy[i],t[i]+1);
add(id[1][xx[i]][x],id[1][yy[i]][y]);
add(id[0][yy[i]][y],id[0][xx[i]][x]);
}
}
calc(W+1,2*W);calc(4*W+1,5*W);calc(1,W);calc(3*W+1,4*W);calc(2*W+1,3*W);
for(re int i=1;i<=n;i++,putchar(' ')) if(chk[i]) putchar('0');else printf("%d",n-1-ans[i]);
return 0;
}

[JSOI2019]精准预测的更多相关文章

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

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

  2. [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

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

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

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

  4. 【JSOI2019】精准预测(2-SAT & bitset)

    Description 现有一台预测机,可以预测当前 \(n\) 个人在 \(T\) 个时刻内的生死关系.关系有两种: \(\texttt{0 t x y}\):如果 \(t\) 时刻 \(x\) 死 ...

  5. 【LOJ】#3101. 「JSOI2019」精准预测

    LOJ#3101. 「JSOI2019」精准预测 设0是生,1是死,按2-sat连边那么第一种情况是\((t,x,1) \rightarrow (t + 1,y,1)\),\((t + 1,y, 0) ...

  6. AI带你省钱旅游!精准预测民宿房源价格!

    作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 机器学习实战系列:https://www.showmeai.tech/t ...

  7. 【天池大数据赛题解析】资金流入流出预测(附Top4答辩ppt)

    http://mp.weixin.qq.com/s?__biz=MzA3MDg0MjgxNQ==&mid=208451006&idx=1&sn=532e41cf020a0673 ...

  8. KDDCUP CTR预测比赛总结

    赛题与数据介绍 给定查询和用户信息后预测广告点击率 搜索广告是近年来互联网的主流营收来源之一.在搜索广告背后,一个关键技术就是点击率预测-----pCTR(predict the click-thro ...

  9. JSOI2019 Round2

    JSOI的题质量很高-- 精准预测(2-SAT.拓扑排序.bitset) 不难发现两个条件都可以用经典的2-SAT连边方式连边,考虑如何加入时间的限制.对于第\(x\)个人在\(t\)时刻的状态是生/ ...

随机推荐

  1. Windows驱动_WFP之一WFP是什么

    现在的网络安全问题,越来越受到重视,微软在VISTA以后,使用了WFP平台来代替之前XP和03中的基于包过滤的技术,比如Transport Driver Interface(TDI)过滤,Networ ...

  2. 2019杭电多校第三场hdu6608 Fansblog(威尔逊定理)

    Fansblog 题目传送门 解题思路 Q! % P = (P-1)!/(P-1)...(Q-1) % P. 因为P是质数,根据威尔逊定理,(P-1)!%P=P-1.所以答案就是(P-1)((P-1) ...

  3. Git 学习第二天(三)

    删除文件: 先新建一个test文件到webgit版本库中,然后 git add            git commit 当然,我们可以在文件夹中删除文件,git 也提供了命令 rm file 此时 ...

  4. 用js onselectstart事件鼠标禁止选中文字

    禁止鼠标选中文本,针对不同浏览器有不同的写法.常见的是onselectstart表示禁止鼠标选中文本.其中用js可以在页面中写 onselectstart="return false&quo ...

  5. akka-stream之异常处理

    背景介绍 在项目中使用了akk-stream的source.queue功能,如下: Pair<SourceQueueWithComplete<Integer>, Source< ...

  6. 结对编程-Core 第12组 [pb15061359+pb15061351]

    一.项目要求 1.输入题目数量,生成操作数为3~5个的四则运算题目 2.输入上限值控制生成的操作数的最大值以及结果的最大值 3.输入支持的操作符类型:加.减.乘.除.乘方.括号 4.输入支持的操作数类 ...

  7. Zabbix-1.8.14 安装

    CentOS 6.9Apache 2.2PHP 5.3.3MySQL 5.1.73 1.下载安装zabbix软件源 在http://repo.zabbix.com/zabbix/1.8/rhel/6/ ...

  8. RabbitMQ学习第四记:路由模式(direct)

    1.什么是路由模式(direct) 路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据.与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机 ...

  9. boost 大小端转换

    boost 中有一个edmian 里面有转换函数模板 native_to_little<T> 本地转换为小端 native_to_bit<T> 本地转换为大端

  10. swiper-animate

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