LOJ bitset+分块 大内存毒瘤题

题面

ndS8Z8.png

ndStiQ.png



$ solution: $

真的没有想到可以用分块。

但是可以发现一个性质,每个询问只关心这个点最后一次赋值操作,和这个赋值操作后的所有取 $ min $ 操作。这个感觉很有用,但是真的很难让人想到低于 $ n\times m $ 的做法。基于 $ DAG $ 的数据结构是目前很少需要掌握的(好吧我都不知道有什么数据结构可以维护 $ DAG $ )所以肯定得骚操作。

我们可以发现一个 $ DAG $ 的性质,如果有一连串赋值操作我们可以根据拓扑序 $ O(n) $ 将所有操作完成,直接按顺序从后往前赋值,这样每个点赋值之后就不会再被访问。同理的, 如果有一连串取 $ min $ 操作我们也可以根据拓扑序 $ O(n) $ 将所有操作完成,直接 $ min $ 值从小到大取 $ min $, 这样每个点在取 $ min $ 之后就不会再被访问。但是当我们将这两种操作合到一起时就不行了。

但是联想一下上面说的性质:每个询问只关心这个点最后一次赋值操作,和这个赋值操作后的所有取 $ min $ 操作。我们可以搞出一个分块来,先预处理2操作,将2操作序列分块,并将每一块用上面的方法统计出每个结点在每个块内的取 $ min $ 后的值(初值inf)。然后我们就可以 $ \sqrt{n} $ 的求出任意一个区间里某个节点取 $ min $ 的最小值(其实还需要一个操作)。然后我们只需要快速找到每个询问的节点的最后一次赋值操作的编号,即赋值的大小,就可以得到答案。找到这个编号,我们可以对1操作分块来完成。

但是上述操作我们还需要知道一个东西,因为分块两边的小区间是要暴力遍历的,这个我们需要知道每个操作能否对某个点产生影响,这个等同于我们要知道 $ DAG $ 中一个点能否到另一个点。这个很奇妙的我们可以用 $ bitset $ 暴力完成。因为这个是无法用低于 $ n\times m $ 的复杂度完成,但是只涉及能否我们可以用二进制

  1. 仔细分析求得答案需要什么关键信息
  2. 对于一连串操作可以一次完成,就考虑分治或分块
  3. 对于两种操作会互相影响,考虑先预处理一种操作在进行第二种操作
  4. 二进制和是与否,这个对于复杂度优化很好用。
  5. $ DAG $ 中的一些问题是难以用低于 $ n\times m $ 的做法完成的!

ndSURs.png



$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<bitset>#define ll long long
#define db double
#define rg register intusing namespace std;int tt,t=1;
int n,m,q,ff;
int a[100005];
int idx[100005];
int fq[100005];
int fm[100005][404];
int vis[100005];
bitset<100005> f[100005];struct su{int to,next;
}b[200005];
int tou[100005];struct pi{int id,x,v,op;inline bool operator <(const pi &i)const{return v<i.v;}
}s[100005],k[100005];inline int qr(){register char ch; register bool sign=0; rg res=0;while(!isdigit(ch=getchar()))if(ch=='-')sign=1;while(isdigit(ch))res=res*10+(ch^48),ch=getchar();if(sign)return -res; else return res;
}inline void yu(int i){ //预处理dag中两点是否可达vis[i]=1; f[i][i]=1;for(rg j=tou[i];j;j=b[j].next){if(!vis[b[j].to]) yu(b[j].to);f[i]|=f[b[j].to];}
}inline void dfs(int i,int v,int time,bool op){ //修改操作if(vis[i]==t)return ; else vis[i]=t; //根据op判断是1操作还是2操作if(op) a[i]=v,idx[i]=time; else fm[i][time]=v;for(rg j=tou[i];j;j=b[j].next){if(vis[b[j].to]==t)continue;dfs(b[j].to,v,time,op);}
}int main(){//freopen("dag.in","r",stdin);//freopen("dag.out","w",stdout);n=qr(); m=qr(); q=qr(); ff=sqrt(q-1)+1;for(rg i=1;i<=q;++i) fq[i]=(i-1)/ff+1; //分块for(rg i=1;i<=m;++i){rg x=qr(),y=qr();b[i]=su{y,tou[x]}; tou[x]=i;}for(rg i=1;i<=n;++i) if(!vis[i])yu(i);for(rg i=1;i<=q;++i){ //先预处理每个块内的2操作rg op=qr(); s[i]=pi{i,qr(),0,op};if(op<=2) s[i].v=qr();if(op==2) k[++tt]=s[i];if(fq[i]!=fq[i+1]){sort(k+1,k+tt+1); ++t; //从小到大,保证每个点只修改一次for(rg j=1;j<=n;++j) fm[j][fq[i]]=1e9; //赋初值for(rg j=1;j<=tt;++j)dfs(k[j].x,k[j].v,fq[i],0);tt=0;}}for(rg i=1;i<=q;++i){if(s[i].op==3){rg x=s[i].x,y=idx[x],v=a[x],sf=0;for(rg j=i;fq[j]==fq[i];--j){ //在同一个块内,暴力处理if(s[j].op==1&&f[s[j].x][x]){ sf=1; y=j; v=s[j].v;for(rg o=y;o<=i;++o)if(s[o].op==2&&f[s[o].x][x]) v=min(v,s[o].v);break;}}if(!sf){ //这个if调了半个上午for(rg j=y+1;fq[j]==fq[y];++j) //前小块if(s[j].op==2&&f[s[j].x][x]) v=min(v,s[j].v);for(rg j=fq[y]+1;j<=fq[i]-1;++j) v=min(v,fm[x][j]); //中间的大块for(rg j=i;fq[j]==fq[i];--j) //后小块if(s[j].op==2&&f[s[j].x][x]) v=min(v,s[j].v);}printf("%d\n",v);}if(fq[i]!=fq[i+1]){ ++t; //将这个块内的1操作一遍做完for(rg j=i;fq[j]==fq[i];--j)if(s[j].op==1)dfs(s[j].x,s[j].v,j,1);}}return 0;
}

转载于:https://www.cnblogs.com/812-xiao-wen/p/11505436.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web开发编程实用手册

不要被这个名字吓到。这本手册&#xff0c;真的很实用。你能猜猜它有多少页么&#xff1f;只有62页&#xff0c;比起那些砖头书来&#xff0c;这本可以说是苗条得不能再苗条了。现在卓越搞活动&#xff0c;购买电子工业出版社图书&#xff0c;凡购买专题内图书满69元&#xff0…

C# 配置文件 自定義結點

1. 對於配置自定義結點&#xff0c;需要繼承ConfigurationSection類。 UrlsSection : ConfigurationSection 2. 配置文件中&#xff0c;需要如下引用&#xff1a; View Code <configSections><section name"orders" type"WebApplication4.UrlsS…

Stream流思想和常用方法

一、IO流用于读写&#xff1b;Stream流用于处理数组和集合数据&#xff1b; 1、传统集合遍历&#xff1a; 2、使用Stream流的方式过滤&#xff1a; 其中&#xff0c;链式编程&#xff08;返回值就是对象自己&#xff09;中&#xff0c;filter使用的是Predicate函数式接口&#…

Stream流方法引用

一、对象存在&#xff0c;方法也存在&#xff0c;双冒号引用 1、方法引用的概念&#xff1a; 使用实例&#xff1a; 1.1先定义i一个函数式接口&#xff1a; 1.2定义一个入参参数列表有函数式接口的方法&#xff1a; 1.3调用这个入参有函数式接口的方法&#xff1a; lambda表达式…

为什么要在定义抽象类时使用abstract关键字

本文为原创&#xff0c;如需转载&#xff0c;请注明作者和出处&#xff0c;谢谢&#xff01;众所周之&#xff0c;在任何面向对象的语言中&#xff08;包括Java、C#&#xff09;&#xff0c;在定义抽象类时必须使用abstract关键字。虽然这已经习已为常了&#xff0c;但实际上ab…

pku 3252 Round Numbers 组合数学 找规律+排列组合

http://poj.org/problem?id3252 看了discuss里面的解题报告才明白的&#xff0c;这个解题报告太强大了&#xff1a;http://poj.org/showmessage?message_id158333不多讲已经很详细了&#xff0c;不明白多看几遍肯定会明白的。 注意这里的公式c(i,j) c(i - 1,j -1) c(i - 1…

《The Coaching Booster》问与答

由Shirly Ronen-Harel和Jens R. Woinowski 编写的《The Coaching Booster》 一书探讨了不同的教练方法和实践&#xff0c;并介绍了一种教练框架&#xff0c;支持教练帮助人们达到他们的目标。\InfoQ 采访了Shirly Ronen-Harel 和 Jens R. Woinowski&#xff0c;谈论了他们的书为…

反射应用和获取Class对象的三种方式

一、写一个“框架”&#xff0c;可以创建任何对象运行任何方法 1、配置文件 2、使用类加载器ClassLoader&#xff0c;Properties集合是可以和IO流结合使用完成读取和写入数据的集合&#xff0c;方法参数列表是IO流&#xff1b; Class类的静态方法forName()创建Class对象&#x…

8 种有趣的用于 Web 品牌的动物

当 Mozilla 推出最新移动浏览器 Fennec 时&#xff0c;很多人需要借助 Wikipedia 才知道 Fennec 是什么意思&#xff0c;Web 2.0 产品以各种古怪的命名著称&#xff0c;要么非常拗口&#xff0c;象 Flickr&#xff0c;要么很 cute&#xff0c;象 Google&#xff0c;或者干脆不知…

注解使用案例

一、一个简易测试框架&#xff1a; 1、定义Check注解&#xff0c;无需添加属性 2、需要测试的类&#xff0c;添加Check注解 3、测试框架代码&#xff1a; for循环上创建一个文件输出流对象&#xff0c;记录方法测试记录&#xff1a; 捕捉异常&#xff1a; 其中&#xff0c;get…

Java Date Time 教程-时间测量

为什么80%的码农都做不了架构师&#xff1f;>>> 在Java中&#xff0c;用System.currentTimeMillis()来测量时间最方便。你要做的是在某些操作之前获取到时间&#xff0c;然后在这些操作之后你想要测量时间&#xff0c;算出时间差。下面是一个例子&#xff1a; 1lon…

企业使用RTX腾讯通2013

2019独角兽企业重金招聘Python工程师标准>>> 腾讯通基本上成为了公司的默认配置&#xff0c;确实缺不了&#xff0c;这里记录一篇配置RTX&#xff0c;包括服务端和客户端。 1.客户端的使用 1.1 一般使用人员不需要关心任何事&#xff0c;只需要登录管理员分配给你的…

Android中弹出对话框,AlertDialog关键代码

写在这里便于以后查看。 Android中弹出对话框的关键代码&#xff1a; 1 btn01.setOnClickListener(new OnClickListener() {2 3 Override4 public void onClick(View v) {5 Toast.makeText(musicActivity.this, "tanchu", 1…

poj 2226 Muddy Fields 最小顶点覆盖

题目链接&#xff1a;http://poj.org/problem?id2226 这道题跟上一道很相似不同之处在于这里不是整行或者整列的删&#xff0c;而是连续的几个可以一起删&#xff0c;不连的不能删&#xff0c;这就要对原图进行处理&#xff0c;对原有的图行由上到下&#xff0c;列由左到右进行…

python抓取网站URL小工具

1、安装Python requests模块&#xff08;通过pip&#xff09;&#xff1a; 环境搭建好了&#xff01; 2、测试一下抓取URL的过程&#xff1a; 抓取出来的URL有JavaScript代码&#xff0c;正则上还有待更加完善&#xff0c;有兴趣的可以研究下~&#xff01; 工具源代码: #coding…

二叉树特性及详细例子

二叉树的性质 一般二叉树性质&#xff1a; 在非空二叉树的k层上&#xff0c;至多有2k个节点(k>0)高度为k的二叉树中,最多有2k1-1个节点(k>0)对于任何一棵非空的二叉树,如果叶节点个数为n0&#xff0c;度数为2的节点个数为n2&#xff0c;则有: n0 n2 1完全二叉树性质:只…

创建 Spring容器的三种方式

一、src路径下打包完在war包的classes层级下 1、Spring容器创建的三种方式 创建Bean容器之后创建对象&#xff1a; 其中第三种使用的是BeanFactory对象 2、spring通过配置文件用容器创建对象的原理 转载于:https://www.cnblogs.com/wmqiang/p/11537638.html

yii使用寻呼功能

CDbCriteria这是类包使用&#xff0c;包是yii自带专门用来处理类似分类这种功能的。而我们使用yii框架然后调用这种方法会起到事半功倍的效果&#xff0c;会发现使用这个可以节省非常多的时间。让你高速的使用PHP中分页的功能。 还要使用的一个类包就是CPagination&#xff0c;…

VTK:一个面向对象的可视化类库(zz)

VTK&#xff1a;一个面向对象的可视化类库(zz) &#xff08;高隽 黄伟 合肥工业大学计算机与信息学院 合肥 230009&#xff09; 摘要 Visualization Toolkit 是一个面向对象的可视化类库&#xff0c;它为从事可视化应用程序开发的广大科研工作者提供直接的技术支持。VTK…

装配Bean的三种方式

一、装配Bean就是在xml写一个Bean标签&#xff1b;装配完Bean,还需要读取xml配置文件创建Spring容器来创建对象&#xff1b; 1、new 实现类方式 正常的三种创建Bean容器的方法都可以根据装配的Bean创建的Bean对象&#xff1b; 2、静态工厂模式方式 其中&#xff0c;静态工厂方式…