【学习笔记】「JOISC 2017 Day 3」自然公园

这篇具有很好参考价值的文章主要介绍了【学习笔记】「JOISC 2017 Day 3」自然公园。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

考虑对于一个点 x x x,找到它与当前连通块相连的所有边。我们希望通过 log ⁡ n \log n logn次询问确定一条边。

一般的策略是将数划分成两个大小相同集合然后去找答案,这里考虑 二分前缀,因为将点按照 D F N DFN DFN序排序,可以保证这段前缀构成一个连通块。那么固定根节点 r r r,询问 x x x r r r是否可达,找到最小的前缀 y y y,就能确定 x x x y y y之间有一条边。将 y y y删掉后处理剩下的连通块即可,这部分有 m log ⁡ n m\log n mlogn次。

然后考虑怎么确定 x x x。发现可以通过类似的方法确定从 x x x到连通块的路径上的一个点 y y y,那么先递归处理 y y y,直到不存在这样的 y y y时再把 x x x加入连通块即可。注意到每个节点只会被找到一次,这部分复杂度 n log ⁡ n n\log n nlogn

总次数 ( n + m ) log ⁡ n (n+m)\log n (n+m)logn文章来源地址https://www.toymoban.com/news/detail-705795.html

#include<bits/stdc++.h>
#include "park.h"
#define fi first
#define se second
#define pb push_back
#define ll long long
using namespace std;
mt19937 gen(114514);
int vs[1405],vs2[1405],state[1405],n;
vector<int>nums;
vector<int>G[1405];
void dfs(int u,int topf){
    nums.pb(u);
    for(auto v:G[u]){
        if(v==topf||vs2[v])continue;
        dfs(v,u);
    }
}
int work(int p,int rt){
    nums.clear(),dfs(rt,-1);
    memset(vs,0,sizeof vs);
    for(auto e:nums)vs[e]=1;vs[p]=1;
    if(Ask(min(p,rt),max(p,rt),vs)==0)return -1;
    int l=1,r=nums.size(),res=0;
    while(l<=r){
        int mid=l+r>>1;
        memset(vs,0,sizeof vs);
        for(int i=0;i<mid;i++)vs[nums[i]]=1;vs[p]=1;
        if(Ask(min(p,rt),max(p,rt),vs))res=mid,r=mid-1;
        else l=mid+1;
    }
    int tmp=nums[res-1];vs2[tmp]=1;
    Answer(min(p,tmp),max(p,tmp));
    for(auto u:G[tmp]){
        if(vs2[u]==0)work(p,u);
    }return tmp;
}
int get(int x){
    int l=1,r=n,res=0;
    while(l<=r){
        int mid=l+r>>1;
        for(int i=0;i<mid;i++){
            vs[i]=(state[i]==1||state[i]==0);
        }
        for(int i=mid;i<n;i++){
            vs[i]=(state[i]==1);
        }
        vs[x]=1;
        if(Ask(0,x,vs)){
            res=mid,r=mid-1;
        }
        else{
            l=mid+1;
        }
    }return res-1;
}
void solve(int x){
    state[x]=2;int y;
    while(1){
        memset(vs2,0,sizeof vs2);
        y=work(x,0);
        if(~y){
            state[x]=1;
            G[x].pb(y),G[y].pb(x);
            return;
        }
        solve(get(x));
    }
}
void Detect(int T,int N){
    n=N;
    state[0]=1;
    for(int i=1;i<n;i++){
        if(state[i]==0)solve(i);
    }
}

到了这里,关于【学习笔记】「JOISC 2017 Day 3」自然公园的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自然语言处理学习笔记(六)————字典树

    目录 1.字典树 (1)为什么引入字典树 (2)字典树定义 (3)字典树的节点实现 (4)字典树的增删改查 DFA(确定有穷自动机) (5)优化 1.字典树 (1)为什么引入字典树         匹配算法的瓶颈之一在于 如何判断集合(词典)中是否含有字符串 。如果用有序集合TreeMap)的

    2024年02月13日
    浏览(49)
  • 自然语言处理学习笔记(四)————词典分词

    目录 1.中文分词 2.词典分词 (1)词的定义 (2)词典性质——齐夫定律  (3)词典 (4)加载词典  (5)hanlp词典路径 1.中文分词 中文分词 :指的是将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于原文本。 中文分词算法大致分为 基于词典规则 与 基于机器学

    2024年02月14日
    浏览(105)
  • 自然语言处理学习笔记(八)———— 准确率

    目录 1.准确率定义 2.混淆矩阵与TP/FN/FP/TN 3. 精确率 4.召回率 5.F1值 6.中文分词的P、R、F1计算 7.实现 1.准确率定义         准确率是用来衡量一个系统的准确程度的值,可以理解为一系列评测指标。当预测与答案的数量相等时,准确率指的是系统做出正确判断的次数除以总

    2024年02月09日
    浏览(44)
  • 自然语言处理学习笔记(十)———— 停用词过滤

    目录 1.停用词 2.实现思路 3.全部实现代码: 4.运行结果: 1.停用词         汉语中有一类没有多少意义的词语,比如助词“的”、连词“以及”、副词“甚至”、语气词“吧”,称为停用词。一个句子去掉了停用词并不影响理解。停用词视具体任务的不同而不同,比如在网

    2024年02月09日
    浏览(52)
  • 【算法每日一练]-图论(保姆级教程 篇4(最短路,分层图) #最短路计数 #社交网络 #公园 #飞行路线 # 第二短路

    目录 今天知识点   di和sp求到每个点的最短路数  floyd求到点的最短路数和经过点的最短路数 求三点最短距离 每个点有多个状态,建立分层图 求第二短路 题目:最短路计数 思路: 题目:社交网络 思路: 题目:公园 思路: 题目:飞行路线  思路: 题目:第二短路 思路:

    2024年02月04日
    浏览(42)
  • 自然语言处理学习笔记(七)————字典树效率改进

    目录 1. 首字散列其余二分的字典树 2.双数组字典树 3.AC自动机(多模式匹配) (1)goto表 (2)output表 (3)fail表 4.基于双数组字典树的AC自动机         字典树的数据结构在以上的切分算法中已经很快了,但还有一些基于字典树的算法改进,把分词速度推向了千万字每秒的

    2024年02月10日
    浏览(45)
  • 自然语言处理学习笔记(三)————HanLP安装与使用

    目录 1.HanLP安装 2.HanLP使用 (1)预下载  (2)测试 (3)命令行  (4)测试样例 3.pyhanlp可视化 4. HanLP词性表 1.HanLP安装  HanLP的 Python接口由 pyhanlp包提供,其安装只需一句命令: 安装完成 2.HanLP使用 (1)预下载 第一次使用pyhanlp时,会自动下载许多hanlp的jar包(包含许多算法

    2024年02月14日
    浏览(55)
  • 自然语言处理学习笔记(十一)————简繁转换与拼音转换

    目录 1.简繁转换 2.拼音转换 1.简繁转换 简繁转换指的是简体中文和繁体中文之间的相互转换。可能有的人觉得,这很简单, 按字转换 就好了。HanLP提供了这样的朴素实现 CharTable, 用来执行字符正规化(繁体-简体,全角-半角,大写-小写) 事实上,汉字历史悠久,地域复杂,

    2024年02月07日
    浏览(48)
  • [LOJ 6030]「雅礼集训 2017 Day1」矩阵 题解

    首先不难想到一个贪心,就是先填出一个全黑的行,然后再用其填黑列。 而且在其中“填出一个全黑的行步数”我们应该最小化。 这个贪心的正确性证明如下: 必要性 :填黑列的必要条件为有一个全黑的行。 充分性 :“填黑列的步数”就是“非全黑列的数量”。 显然,如

    2024年02月12日
    浏览(47)
  • [LOJ 6029]「雅礼集训 2017 Day1」市场 题解

    这道题恶心之处在于区间向下取整。 这里给出两种思路: 如果最大值和最小值向下取整后相等,则对此区间进行区间覆盖。 我考场写的是这个,但是码错了,加上习惯不好, 100 → 64 100to64 100 → 64 ,再加上烦了弱智错误, 64 → 9 64to9 64 → 9 ,不给出代码。 注意到相邻两数的

    2024年02月12日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包