【LOJ】#3101. 「JSOI2019」精准预测
LOJ#3101. 「JSOI2019」精准预测
设0是生,1是死,按2-sat连边那么第一种情况是\((t,x,1) \rightarrow (t + 1,y,1)\),\((t + 1,y, 0) \rightarrow (t,x,0)\)
第二种情况是\((t,x,0) \rightarrow (t,y,1)\),\((t,y,0) \rightarrow(t,x,1)\)
然后\((t,x,0)\)往\((t - 1,x,0)\)连边,\((t,x,1)\)往\((t + 1,x,1)\)连边
发现我们显然可以忽略出度只有一个的点,最后只剩下\(2m + 2n\)个点
然后这是一张DAG,因为生的图是一张DAG,死的图是一张DAG,剩下的只有从生连到死的边
于是我们要求从\((T + 1,x,0)\)走到的\((T + 1,y,1)\)的个数,然后减去
同时我们还要给每个点减去一定会死的人
用bitset优化一下即可。。。
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define ba 47
#define MAXN 50005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
struct node {
int to,next;
}E[2000005];
struct predict {
int ty,t,x,y;
}pre[100005];
int T,N,M,Ncnt;
vector<int> tim[2][MAXN],pos[2][MAXN];
bitset<50005> reach[100005],all,res[50005];
int head[300005],sumE,deg[300005],rec[300005],dead[300005],live[300005];
vector<int> que,used;
int pu[300005],ans[50005];
void add(int u,int v) {
if(!v || !u) return;
E[++sumE].to = v;
E[sumE].next = head[u];
++deg[v];++rec[v];
head[u] = sumE;
}
int getid(int k,int x,int t) {
if(k == 0) {
int tar = upper_bound(tim[k][x].begin(),tim[k][x].end(),t) - tim[k][x].begin() - 1;
if(tar < 0) return 0;
return pos[k][x][tar];
}
else {
int tar = lower_bound(tim[k][x].begin(),tim[k][x].end(),t) - tim[k][x].begin();
return pos[k][x][tar];
}
}
void Init() {
read(T);read(N);read(M);
Ncnt = 0;
for(int i = 1 ; i <= N ; ++i) {tim[1][i].pb(T + 1);tim[0][i].pb(T + 1);}
for(int i = 1 ; i <= M ; ++i) {
read(pre[i].ty);read(pre[i].t);read(pre[i].x);read(pre[i].y);
if(pre[i].ty == 0) {
tim[1][pre[i].x].pb(pre[i].t);
tim[0][pre[i].y].pb(pre[i].t + 1);
}
else {
tim[0][pre[i].x].pb(pre[i].t);
tim[0][pre[i].y].pb(pre[i].t);
}
}
for(int i = 1 ; i <= N ; ++i) {
for(int k = 0 ; k < 2 ; ++k) {
sort(tim[k][i].begin(),tim[k][i].end());
tim[k][i].erase(unique(tim[k][i].begin(),tim[k][i].end()),tim[k][i].end());
for(int j = 0 ; j < tim[k][i].size() ; ++j) {
pos[k][i].pb(++Ncnt);
if(k == 1) dead[Ncnt] = i;
if(k == 0 && j != 0) add(pos[k][i][j],pos[k][i][j - 1]);
if(k == 1 && j != 0) add(pos[k][i][j - 1],pos[k][i][j]);
}
}
live[pos[0][i].back()] = i;
}
for(int i = 1 ; i <= M ; ++i) {
if(pre[i].ty == 0) {
add(getid(1,pre[i].x,pre[i].t),getid(1,pre[i].y,pre[i].t + 1));
add(getid(0,pre[i].y,pre[i].t + 1),getid(0,pre[i].x,pre[i].t));
}
else {
add(getid(0,pre[i].x,pre[i].t),getid(1,pre[i].y,pre[i].t));
add(getid(0,pre[i].y,pre[i].t),getid(1,pre[i].x,pre[i].t));
}
}
}
void Solve() {
queue<int> Q;
for(int i = 1 ; i <= Ncnt ; ++i) {
if(!deg[i]) Q.push(i);
}
while(!Q.empty()) {
int u = Q.front();Q.pop();que.pb(u);
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(!--deg[v]) Q.push(v);
}
}
for(int i = 0 ; i <= 100000 ; ++i) used.pb(i);
all.reset();
for(int j = que.size() - 1 ; j >= 0 ; --j) {
int u = que[j];pu[u] = used.back();used.pop_back();
reach[pu[u]].reset();
if(dead[u]) reach[pu[u]][dead[u]] = 1;
//cerr << "???" << endl;
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
reach[pu[u]] |= reach[pu[v]];
if(!--rec[v]) {
used.pb(pu[v]);
}
}
//cerr << "????" << endl;
if(live[u]) {
if(!reach[pu[u]][live[u]]) res[live[u]] = reach[pu[u]];
else all[live[u]] = 1;
}
if(!rec[u]) used.pb(pu[u]);
//cerr << "?????" << endl;
}
for(int i = 1 ; i <= N ; ++i) {
if(!all[i]) {
ans[i] = N - 1 - (res[i] | all).count();
}
out(ans[i]);space;
}
enter;
}
int main(){
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}
【LOJ】#3101. 「JSOI2019」精准预测的更多相关文章
- Loj #3102. 「JSOI2019」神经网络
Loj #3102. 「JSOI2019」神经网络 题目背景 火星探险队发现,火星人的思维方式与人类非常不同,是因为他们拥有与人类很不一样的神经网络结构.为了更好地理解火星人的行为模式,JYY 对小镇 ...
- LOJ #3103. 「JSOI2019」节日庆典
题意 给定字符串 \(S\) ,对于 \(S\) 的每个前缀 \(T\) 求 \(T\) 所有循环同构串的字典序最小的串,输出其起始下标.(如有多个输出最靠前的) \(|S| \le 3 \times ...
- 【LOJ】#3103. 「JSOI2019」节日庆典
LOJ#3103. 「JSOI2019」节日庆典 能当最小位置的值一定是一个最小后缀,而有用的最小后缀不超过\(\log n\)个 为什么不超过\(\log n\)个,看了一下zsy的博客.. 假如\ ...
- 【LOJ】#3102. 「JSOI2019」神经网络
LOJ#3102. 「JSOI2019」神经网络 首先我们容易发现就是把树拆成若干条链,然后要求这些链排在一个环上,同一棵树的链不相邻 把树拆成链可以用一个简单(但是需要复杂的分类讨论)的树背包实现 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
随机推荐
- 【概率论】3-6:条件分布(Conditional Distributions Part I)
title: [概率论]3-6:条件分布(Conditional Distributions Part I) categories: Mathematic Probability keywords: ...
- 进入docker 容器命令行
#!/bin/bash CNAME=$1 CPID=$(docker inspect --format "{{.State.Pid}}" $CNAME) nsenter --tar ...
- Python学习日记(四)——Python基本数据类型梳理(int、str、list、tuple、dict)
数字(int) 1.创建方式 n1 = 123 n2 = int(123) 2.内存分配 #共同用一个内存地址的情况 n1 = 123 n2 = n1 #用两个内存地址的情况 n1 = 123 n2 ...
- 【Robot Framework 项目实战 03】使用脚本自动生成统一格式的RF自动化用例
背景 虽然大家都已经使用了统一的关键字,但是在检查了一些测试用例之后,还是发现因为大家对RF的熟悉程度不一导致的测试用例颗粒度差异很大的情况:而且在手动方式转化测试用例过程中,有不少工作是完全重复的且 ...
- 有效管理进程的几个linux命令
一般来说,应用程序进程的生命周期有三种主要状态:启动.运行和停止.如果我们想成为称职的管理员,每个状态都可以而且应该得到认真的管理.这八个命令可用于管理进程的整个生命周期. 启动进程 启动进程的最简单 ...
- PHP中部分宏应用
1.字符串复制 ZVAL_STRINGL(pzv, str, len, dup):str 和 len 分别为内存中保存的字符串地址和他的长度,dup之名该字符串是否需要被复制,值为1则将先申请一块新内 ...
- 组件 computed 与 vuex 中 getters 的使用,及 mapGetters 的使用,对象上追加属性,合并对象
vue 是响应式的数据,这一点相当的方便我们的操作,但有些错误的操作方法会 vue 的响应无效 除此之外我们还要了解 vue.set() 和 Object.assgin() 的使用 vue.set() ...
- LINUX 上 实现SNTP (时间同步)
Network Time Protocol (NTP) 也是RHCE新增的考试要求. 学习的时候也顺便复习了一下如何设置Linux的时间,现在拿出来和大家分享 设置NTP服务器不难但是NTP本身是一个 ...
- git如何压栈某一个文件?
答: 使用git stash -p进行交互式操作,y表示压栈,n表示不压栈
- 安装完 MySQL 后必须调整的 10 项配置(转)
当我们被人雇来监测MySQL性能时,人们希望我们能够检视一下MySQL配置然后给出一些提高建议.许多人在事后都非常惊讶,因为我们建议他们仅仅改动几个设置,即使是这里有好几百个配置项.这篇文章的目的在于 ...