考试的时候昏了头 没算空间 这道题我爆零了。值得注意的是 一般认为bitset的空间是 int 的1/w倍

对于那m条边 无论如何构造 这m条关系都是存在的 题目其实是想让我们用这m条关系来计算给出的 t条关系是否合法。

合法把这m条边输出即可。

这道题 虽然不是多组数据 但是评测时开了subtask. 果然 判定对错的题目 基本上不给水分的机会...

缩过点之后 剩下的是可达性问题 这是一个经典问题 如果点不是类似于区间性的问题 最快也只能使用bitset来解决 这个大概是常识吧.

发现 mn/w 勉强可以卡过 但是会爆空间。

这种问题 算是很常见的问题 如 求5,6维偏序的时候 bitset空间容易爆 一般采用根号分治法。

对n个点进行分块 每次统计一个 块内的点对应的询问即可。

设 块大小为 S 那么数量为 n/S 每次统计一下 n/SmS/w=nm/w.

空间复杂度 nS/w.

可以发现 时间不会变得更差 空间变小 取S等于sqrt(n)即可。

const int MAXN=100005;
int n,m,Q,len,top,id,cnt;
int s[MAXN],c[MAXN],low[MAXN],dfn[MAXN];
int lin[MAXN],ver[MAXN],nex[MAXN],ru[MAXN];
int lin1[MAXN],ver1[MAXN],nex1[MAXN];
bitset<430>b[MAXN];
int q[MAXN],w[MAXN];
struct wy{int x,y;}t[MAXN],g[MAXN];
inline void add(int x,int y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
}
inline void add1(int x,int y)
{
ver1[++len]=y;
nex1[len]=lin1[x];
lin1[x]=len;
++w[y];
}
inline void dfs(int x)
{
s[++top]=x;low[x]=dfn[x]=++cnt;
go(x)
{
if(!dfn[tn])
{
dfs(tn);
low[x]=min(low[x],low[tn]);
}
else if(!c[tn])low[x]=min(low[x],dfn[tn]);
}
if(dfn[x]==low[x])
{
int y=0;
++id;
while(y!=x)
{
y=s[top--];
c[y]=id;
}
}
}
inline void topsort()
{
int l=0,r=0;
rep(1,id,i){if(!ru[i])q[++r]=i;}
while(++l<=r)
{
int x=q[l];
for(int i=lin1[x];i;i=nex1[i])
{
int tn=ver1[i];
b[tn]=b[tn]|b[x];
--ru[tn];
if(!ru[tn])q[++r]=tn;
}
}
}
inline int cmp(wy a,wy b){return a.y<b.y;}
int main()
{
freopen("gplt.in","r",stdin);
freopen("gplt.out","w",stdout);
get(n);get(m);
rep(1,m,i)
{
int x,y;
get(x);get(y);
t[i]=(wy){x,y};
add(x,y);
}
rep(1,n,i)if(!dfn[i])dfs(i);
len=0;
rep(1,n,j)
{
go(j)
{
if(c[tn]==c[j])continue;
add1(c[tn],c[j]);
}
}
int B=(int)sqrt(1.0*id)+1;
int ww=(id-1)/B+1;
get(Q);
rep(1,Q,i)
{
int get(x);int get(y);
x=c[x];y=c[y];
g[i]=(wy){x,y};
}
sort(g+1,g+1+Q,cmp);
int flag=1;
rep(1,ww,i)
{
int L=(i-1)*B+1;
int R=min(id,i*B);
rep(L,R,j)b[j][j-L]=1;
topsort();
while(g[flag].y<=R&&flag<=Q)
{
if(b[g[flag].x][g[flag].y-L]==1)
{
puts("NO");
return 0;
}
++flag;
}
if(flag==Q+1)break;
rep(1,id,j)b[j].reset(),ru[j]=w[j];
}
puts("YES");
put(m);
rep(1,m,i)printf("%d %d\n",t[i].x,t[i].y);
return 0;
}

没脑子选手丢人了。

4.13 省选模拟赛 传销组织 bitset 强连通分量 分块的更多相关文章

  1. 5.13 省选模拟赛 优雅的绽放吧,墨染樱花 多项式 prufer序列 计数 dp

    LINK:优雅的绽放吧,墨染樱花 当时考完只会50分的做法 最近做了某道题受到启发 故会做这道题目了.(末尾附30分 50分 100分code 看到度数容易想到prufer序列 考虑dp统计方案数. ...

  2. 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.

    考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...

  3. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  4. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  5. 3.28 省选模拟赛 染色 LCT+线段树

    发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...

  6. 【FJOI 20170305】省选模拟赛

    题面被改成了个猪... T1猪猪划船(boat) [题目描述] 6只可爱的猪猪们一起旅游,其中有3只大猪A,B,C,他们的孩子为3只小猪a,b,c.由于猪猪们十分凶残,如果小猪在没有父母监护的情况下, ...

  7. 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)

    一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...

  8. NOI2019省选模拟赛 第五场

    爆炸了QAQ 传送门 \(A\) \(Mas\)的童年 这题我怎么感觉好像做过--我记得那个时候还因为没有取\(min\)结果\(100\to 0\)-- 因为是个异或我们肯定得按位考虑贡献了 把\( ...

  9. NOI2019省选模拟赛 第六场

    传送门 又炸了-- \(A\) 唐时月夜 不知道改了什么东西之后就\(A\)掉了\(.jpg\) 首先,题目保证"如果一片子水域曾经被操作过,那么在之后的施法中,这片子水域也一定会被操作&q ...

随机推荐

  1. H5和原生的职责划分

    前言 在JSBridge实现后,前端网页与原生的交互已经通了,接下来就要开始规划API,明确需要提供哪一些功能来供前端调用. 但是在这之前,还有一点重要工作需要做: 明确H5与Native的职责划分, ...

  2. Tensorflow教程(3)什么是张量?什么是数据流图?

    Tensorflow = Tensor(张量) + flow(数据流图) 1.张量 张量可不是“麻辣烫”!张量是一个很抽象的概念,直观的来说,张量在tensorflow中就像一个杯子,起到保存数据的作 ...

  3. Mysql 查找表中的多组前n大元素

    博客已搬家,更多内容查看https://liangyongrui.github.io/ Mysql 查找表中的多组前n大元素 如果时单组很简单,只需要排序后去前n个就行了,但是多组排序似乎就不是那么好 ...

  4. 2.Unity3d常用按键

    Unity3d常用按键和组合键: 1.鼠标左键:选中物体 2.鼠标中键:平移视角,和手型功能一样 3.鼠标右键:旋转观察角度 4.Alt+鼠标左键:旋转观察角度 5.Alt+鼠标右键:拉远拉近

  5. python 检索文件内容工具

    公司内部需求一个工具检索目录下的文件在另外的目录中使用次数, 用来优化包体的大小. 此代码效率并不高效, 另添加对应的 后缀检索. 用python 实现比较快速, 另还有缺点是只支持 utf-8 格式 ...

  6. day14总结

    装饰器 """1.什么是装饰器 器指的是工具/功能 装饰指的是为被装饰对象添加额外的功能 大白话:定义装饰器就是定义了一个函数,该函数就是用来为其他函数添加额外的功能的 ...

  7. day04 python入门(变量,基本数据类型)

    python入门学习 来自egon的学习套路 在每次遇到一个新事物的时候,要学三步: xxx是什么? 为什么要有xxx? ​ 大前提:python中所有出现的语法都是为了让计算机能够具有人的某一个功能 ...

  8. 循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

    在前面随笔介绍了ABP+Vue前后端的整合处理,包括介绍了ABP的后端设计,以及前端对ABP接口API的ES6的封装,通过JS的继承类处理,极大减少了重复臃肿的代码,可以简化对后端API接口的封装,而 ...

  9. 使用 JS 开发 Github Actions 实现自动部署前后台项目到自己服务器

    不想看前面这么多废话的可以直接跳到具体实现 Github Actions 是什么? 说到 Github Actions 不得不提一下. 持续集成(continuous integration):高质量 ...

  10. 谈谈IT圈的门槛与学历的关系以及如何避免青春饭?

    一.关于我自己 我是一名80后的IT老兵,从今年出现疫情后,就感觉多少有些力不从心了,因为公司的业务做的不好,公司是做普惠金融的,疫情出现后,催收逾期就非常厉害,导致公司不敢大量放贷,从而就出现了公司 ...