【HAOI2016】地图

【省选题简易题解合集】 SDOI 2016探险路线题目所给的限制的路径实际上形状是固定的,根据形状分成三个子问题(在墙角迂回、跳跃、跨过全场洄游)进行DP,再将它们合并起来,就可以做这个题了。齿轮简单地用取模或者分解质因数来计算就可以知道是否合法了。平凡的骰子十分基础的立体几何转平面几何。转换一下坐标系随便算算投影就可以了。硬币游戏经典SG游戏,论文里面提到的经典做法,但是需要依靠一个结论就是这种硬币游戏基本都是全局的SG 阅读详情

时间限制 : 1000 MS 空间限制 : 265536 KB

问题描述

一天rin来到了一个遥远的都市。这个都市有n个建筑,编号从1到n,其中市中心编号为1,这个都市有m条双向通行的街道,每条街道连接着两个建筑,其中某些街道首尾相连连接成了一个环。rin通过长时间的走访,已经清楚了这个都市的两个特点:
1. 从市中心出发可以到达所有的建筑物。
2. 任意一条街道最多存在与一个简单环中。
令rin心花怒放的是,每个建筑物都会有拉面售卖。拉面有很多不同的种类,但对于rin而言只有油腻程度的不同,因此我们把油腻程度相同的拉面看做同一种拉面。由于不同建筑物的拉面的油腻程度可能不同,我们用一个正整数来表示拉面的油腻程度。要知道,拉面可是rin的最爱,但是现在到了下班高峰期,都市的交通变得非常的堵塞。
rin只能通过没有被堵死的街道通行,去品尝所在建筑物的拉面。
现在rin想知道,如果她正在编号为x的建筑物,那么在从市中心到x的所有简单路径经过的街道都被堵死的情况下,rin可以品尝到的拉面中(注意没有出现的拉面是不能算在里面的):
1. 油腻程度≤ y且品尝次数为奇数次的拉面有多少种?
2. 油腻程度≤ y且品尝次数为偶数次的拉面有多少种?

输入格式

第一行两个正整数n,m,含义如题所示第二行一共N个正整数,第i个数Ai表示第i个建筑物出售的拉面的油腻程度。
接下来M行,每行两个正整数x,y,表示在建筑物x,y之间有一条双向通行的街道。数据保证1<=x< y<=N
接下来一行一个正整数Q,表示询问个数。
接下来Q行每行三个非负整数ty,x,y,x表示询问的建筑物编号,y表示油腻程度的限制,ty=0时表示询问偶数,ty=1表示询问奇数。
N<=100000,M<=150000,Q<=100000,Ai<=10^6
提示:请注意数据范围中的<=,特殊条件中提到的y均为询问中的y,对于所有的数据,有y<=10^6

输出格式

一共Q行,对于每个询问输出一个答案。

样例输入

10 12
1 10 4 5 2 10 1 8 4 8
1 2
1 3
1 4
2 5
4 6
4 7
7 8
2 9
8 10
1 6
8 10
4 7
10
0 3 9
1 7 6
0 5 2
1 10 9
0 5 7
1 7 4
0 7 3
1 2 7
0 3 4
0 3 8

样例输出

0
1
0
1
0
1
0
2
0
0

题解

显然,原图是一棵以1号点为根的仙人掌(背后一凉,以为会出现可怕的操作),每次要查询的即为子仙人掌的各种数据(如果不熟悉仙人掌,可自行百度一下)。这样就很水了,我们只需要按照处理仙人掌的套路——建立圆方树,就可以把仙人掌上的问题转化到树上。因此查询子仙人掌就变为了查询圆方树的子树。对于处理子树信息,我们首选用DFS序解决,这样又把树上的问题转化到了序列之上。
经过一系列转化之后,原题变为求一段区间中出现奇数或偶数次且小于等于某数的数字的个数。求区间中数字出现次数的题目,优先考虑使用莫队算法解决。然而本题还有小于等于某数的约束条件,套个线段树或树状数组?肯定不行,莫队算法算法常常只能支持O(1)O(1)修改操作。我们发现,对序列的维护、修改是套在莫队算法中一起执行的,然而查询操作却是与莫队并行的(两操作的复杂度用加号连接),也就是说修改只能O(1)O(1),但查询暴力一点O(logn)O(logn)甚至O(n−−√)O(n)都可以。这样的数据结构很容易想到分块,因此我们可以对“油腻度”分块,再用莫队算法维护。
还有一个细节需要注意,虽然油腻度不超过一百万,但数据接近极限时分块还是会被卡,因此要对油腻度离散化……

代码

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
const int maxn=2e5+5;
int a,b,n,m,q,vt,scc,tot,maxx,f[maxn],dfn[maxn],low[maxn],val[maxn],Hash[maxn];
int id[maxn],out[maxn],pre[maxn];
int l=1,r,sz1,bl1[maxn],ans[maxn];
int sz2,odd[1005],even[1005],bl2[maxn*10],cnt[maxn*10];
bool vis[maxn];
vector<int> G[maxn],map[maxn];
struct node
{
    int tl,tr,tx,ty,id;
}qu[maxn];
char buf[1<<20],*head,*tail;
#define GC (head==tail&&(tail=(head=buf)+fread(buf,1,1000000,stdin),head==tail)?0:*head++)
inline int input()
{
    char t=GC;int x=0;
    while(t<48||t>57) t=GC;
    for(;t>=48&&t<=57;t=GC) x=x*10+t-48;
    return x;
}
bool cmp(node x,node y)
{
    return bl1[x.tl]==bl1[y.tl]?x.tr<y.tr:bl1[x.tl]<bl1[y.tl];
}
void get_scc(int x,int y)
{
    scc++;
    while(y!=x)
    {
        map[scc].push_back(y),map[y].push_back(scc);
        y=f[y];
    }
    map[scc].push_back(x),map[x].push_back(scc);
}
void Tarjan(int x)
{
    dfn[x]=low[x]=++vt;
    for(int i=0;i<G[x].size();i++)
    {
        int y=G[x][i];
        if(y==f[x]) continue;
        if(!dfn[y]) f[y]=x,Tarjan(y),low[x]=min(low[x],low[y]);
        else low[x]=min(low[x],dfn[y]);
        if(low[y]>dfn[x]) map[x].push_back(y),map[y].push_back(x);
    }
    for(int i=0;i<G[x].size();i++)
    {
        int y=G[x][i];
        if(x!=f[y]&&dfn[x]<dfn[y]) get_scc(x,y);
    }
}
void DFS(int x,int fa)
{
    id[x]=++tot,pre[tot]=x,vis[x]=true;
    for(int i=0;i<map[x].size();i++)
    {
        int y=map[x][i];
        if(y==fa||vis[y]) continue;
        DFS(y,x);
    }
    out[x]=tot;
}
void modify(int x,int y)
{
    x=pre[x];
    if(x>n) return;
    x=val[x];
    if(~y)
    {
        if(cnt[x]&1) odd[bl2[x]]--,even[bl2[x]]++;
        else
        {
            if(cnt[x]) even[bl2[x]]--;
            odd[bl2[x]]++;
        }
    }
    else
    {
        if(!(cnt[x]&1)) even[bl2[x]]--,odd[bl2[x]]++;
        else
        {
            if(cnt[x]>1) even[bl2[x]]++;
            odd[bl2[x]]--;
        }
    }
    cnt[x]+=y;
}
int get_ans(int x,int y)
{
    int sum=0;
    for(int i=1;i<bl2[x];i++) sum+=y?odd[i]:even[i];
    for(int i=(bl2[x]-1)*sz2+1;i<=x;i++)
        if(y==(cnt[i]&1)&&cnt[i]) sum++;
    return sum;
}
int main()
{
    n=input(),m=input();
    for(int i=1;i<=n;i++) Hash[i]=val[i]=input();
    sort(Hash+1,Hash+1+n),maxx=unique(Hash+1,Hash+1+n)-Hash-1;
    for(int i=1;i<=n;i++) val[i]=lower_bound(Hash+1,Hash+1+maxx,val[i])-Hash;
    for(int i=1;i<=m;i++)
    {
        a=input(),b=input();
        G[a].push_back(b),G[b].push_back(a);
    }
    scc=n,Tarjan(1),DFS(1,0);
    sz1=sqrt(scc),sz2=sqrt(maxx),q=input();
    for(int i=1;i<=scc;i++) bl1[i]=(i-1)/sz1+1;
    for(int i=1;i<=maxx;i++) bl2[i]=(i-1)/sz2+1;
    for(int i=1;i<=q;i++)
    {
        qu[i].ty=input(),a=input(),qu[i].tx=input();
        qu[i].tx=upper_bound(Hash+1,Hash+1+maxx,qu[i].tx)-Hash-1;
        qu[i].tl=id[a],qu[i].tr=out[a],qu[i].id=i;
    }
    sort(qu+1,qu+1+q,cmp);
    for(int i=1;i<=q;i++)
    {
        while(r<qu[i].tr) modify(r+1,1),r++;
        while(l>qu[i].tl) modify(l-1,1),l--;
        while(r>qu[i].tr) modify(r,-1),r--;
        while(l<qu[i].tl) modify(l,-1),l++;
        ans[qu[i].id]=get_ans(qu[i].tx,qu[i].ty);
    }
    for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
    return 0;
}
番茄(西红柿)叶片病害检测数据集:12k+图像,10类,yolo标注 本文介绍了包含12,250张图像的番茄叶片病害检测数据集,涵盖10种常见病害类型及健康叶片,采用YOLO格式标注。数据集具有三大核心价值:科研层面填补病害样本空白,推动算法创新;产业应用支持精准诊断、早期预警,降低损失20-40%;社会生态方面减少农药使用15-30%,助力绿色农业。该数据集作为AI与农业结合的数字基础设施,适用于计算机视觉项目、科研实验等场景。 阅读详情

相关推荐

Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务

因此,当使用外部容器时,如此处的 Tomcat 来部署项目,AbstractAutoServiceRegistration 就不能监听到容器启动事件了,也就不会尝试向服务注册中心注册当前这个微服务,那么注册就失败了,并且也就没有异常信息了。自定义获取获取外部容器端口的方法, 然后监听应用启动事件,当应用被启动时,获取外部容器启动的端口号,然后将这个 port 设置到 NacosAutoServiceReigistration 中。在启动类同级目录,复制下面代码即可(不需要修改,直接构建war即可)

ttyy1112的专栏 2519

BZOJ4629: [BeiJing2016]打字机

测试点 1 – 2 满足,n = 1 或 k = 0; 测试点 1 – 6 满足,n ≤ 100,m ≤ 500,∑|Si| ≤ 500,A i ≤1000; 测试点 7 – 8 满足,k = 0,∑|Si| ≤ 200; 测试点 9 – 10 满足,∑|Si| ≤ 50,A i ≤1。 对于 100%的数据,n ≤ 100,m ≤ 10 9 ,∑|Si| ≤ 500,A

commonc的博客 1251

FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译

FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译 什么是Firmament? Firmament (FMT) 是一款基于模型设计 (Model-Based-Design, MBD) 的开源自驾仪,可被用来快速构建无人机,无人车,无人船,机器人等平台的控制系统。 系统主要由两部分构成. FMT-Firmware: 一个基于C/C++开发的稳定、高性能的嵌入式系统. FMT-Model: 一个基于MATLAB/Simulink开发的仿真框架以及算法库. 昨天得知FMT开源飞控项目已经开

weixin_45786595的博客 2873

haoi部分水题题解

bzoj 2423: [HAOI2010]最长公共子序列 直接dp就好了,要滚动不然T code: #include&amp;lt;cstdio&amp;gt; #include&amp;lt;cstdlib&amp;gt; #include&amp;lt;cstring&amp;gt; #include&amp;lt;iostream&amp;gt; using namespace std; const int mod=1e8

fyc的博客 533

ROS2实战:手把手教你用CMake集成自定义DDS(以CycloneDDS为例)

本文详细介绍了如何在ROS2中通过CMake集成自定义DDS(以CycloneDDS为例),涵盖环境准备、源码编译、ROS2工作区集成、性能调优及常见问题排查。通过RMW中间件抽象层,开发者可以灵活切换DDS实现,提升系统实时性和可靠性。

weixin_29284201的博客 348

使用 git一个仓库管理多个项目

我们需要在 git 里面创建一个空分支,该分支不继承任何提交,没有父节点,完全是一个干净的分支,这时候就需要使用 orphan。该命令会创建一个新的分支,并且该分支有前一个分支下的所有文件,我们不想提交任何内容,所以我们需要把当前内容全部删除。此时 master 分支已经有一个项目了,下面我们创建新的分支管理另一个项目。此时可以在该分支目录上初始化你的项目,在执行 git 命令提交代码。此时我们就完成了在同一个仓库管理不同项目的需求了。下载仓库到本地之后,进入项目目录,查看分支信息。

xrs151的博客 2028

bjoi2016题解<不断更新<毕竟自己弱嘛TAT>>

先看D1T3,就是LJQ送给我们的回转寿司那道题。 首先是连续段,我们直接转前缀和。 即询问:R>=Sr−Sl>=LR>= S_r - S_l >= L的有几个。 我们可以枚举右端点,并询问有多少个。 现在我们询问已知SrS_r,求前面有多少个SlS_l使得R>=Sr−Sl>=LR>= S_r - S_l >= L成立。 显而易见的是,我们可以两端减去SrS_r,即R−Sr>=Sl>=L−

Lyra's DDF 1095

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据一,Xilinx BRAM介绍二,BRAM对应的IP核调用和使用1,BRAM对应的IP核介绍2,BMG例化IP核的调用 一,Xilinx BRAM介绍 BRAM 就是Block Memory,是Zynq的PL端的存储RAM单元。可以利用BRAM,在PS和PL之间进行数据的交换。Zynq中还有一类存储器,称为分布式随机访问存储器(D...

weixin_43941525的博客 3万+

FJWC2016 day1 t1

我写这种水题的解题报告估计要让神犇给D飞了....... 这题的题意大概是:给定一棵树,节点是10^5级别的,每个节点有权,2个操作,一个是修改某个节点的权值,另一个是询问X到Y路径上的点权中是否可以选出3个使之构成三角形的3边。权值在0——2^31-1. 这题首先想到树剖,但是发现无法维护。 我们先来看看这样一个问题:在1到N之间选3个数使之构成三角形的三边,问最少选多少个数可以保证?记三

lpf_as_a_oier的博客 616

从零做出可发布的2D冒险游戏!Unity全流程实战指南:从资源搭建到打包发布,新手也能跟着做

项目配置→资源导入→核心模块开发→关卡设计→调试→打包发布;玩家控制→敌人AI→道具系统→UI系统→游戏管理器→音效系统;新手开发重点:先实现核心玩法(移动、跳跃、攻击),再补充UI、音效、存档等辅助功能;调试是关键:每实现一个功能就测试,避免最后一堆bug难以定位。从零做一款完整的2D冒险游戏,能快速提升你的Unity综合能力——不仅能掌握C#编程、2D物理、UI系统,还能理解游戏开发的完整流程。先做出基础版,再慢慢迭代优化,你会发现游戏开发并没有想象中那么难。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1182

EtherCAT主站SOEM -- 29 -- STM32F767-SOEM通过 CSP模式(周期同步位置模式)控制一个电机转圈圈

以上就是EtherCAT主站SOEM – 29 – STM32F767-SOEM通过 CSP模式(周期同步位置模式)控制一个电机转圈圈的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 2242

[HAOI2016]地图

题意 题目 做法 看到还有莫队+分块的神仙,反正我是没有想到的,没想到子树信息还能化成莫队??? 首先,这道题目明摆着仙人掌,然后处理子树信息线段树合并即可。 这篇博客主要是记载我这另类的线段树合并的。 时间复杂度:O((n+q)logn)O((n+q)logn)O((n+q)logn) #include<cstdio> #include<cstring> #define N 110000 #define NN 210000 #define SN 6100000 #def

蒟蒻QMQ 214

【数据集】全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

WW、forever的博客 389

4564: [Haoi2016]地图

4564: [Haoi2016]地图 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 124  Solved: 44 [Submit][Status][Discuss] Description 一天rin来到了一个遥远的都市。这个都市有n个建筑,编号从1到n,其中市中心编号为1,这个都市有m条双向通 行的街道,每条街道连接着两个

CRZbulabula的博客 1340

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

bzoj4564: [Haoi2016]地图 仙人掌的圆方树 莫队 分块

bzoj4564: [Haoi2016]地图 Description 一天rin来到了一个遥远的都市。这个都市有n个建筑,编号从1到n,其中市中心编号为1,这个都市有m条双向通 行的街道,每条街道连接着两个建筑,其中某些街道首尾相连连接成了一个环。rin通过长时间的走访,已经清楚 了这个都市的两个特点:1. 从市中心出发可以到达所有的建筑物。2. 任意一条街道最多存在与一个简单环中。令 rin心花...

maxtir的博客 417

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

3180 [HAOI2016]地图(tarjan)(dfs序)(分块)(莫队)

题目 洛谷3180 HAOI2016地图 题解 tarjan+dfs序+分块+莫队 首先用tarjan求出所有的环根,做个dfs,就可以统计出每个节点在不挑剔的情况下的值了。其实我并不懂怎么是怎么实现的最后可以做到x~x+son[x]-1(dfs序)都是在封路后可以到达的节点。 接下来用dfs序,可以把树给展开,方便统计子树的情况。 再接着就用莫队来控制区间,用分块来求出小于一定值的点有多少...

A_Bright_CH的博客 541

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

HAOI 2016 地图 题解

题目传送门 题目大意: 给一张仙人掌图,多组询问,每次给出一个点,询问封掉点 111 到这个点的所有路径后,从这个点出发能吃到的拉面的油腻度中吃了奇数次或偶数次的油腻度有多少种。 题解 纪念一下看错题后乱JB敲出来的代码(放心,这东西和题解没有半毛钱关系)。 #include <cstdio> #include <map> #include <algorithm&gt...

a_forever_dream的博客 337

BZOJ4564 [Haoi2016]地图

仙人掌转成序列,然后莫队 仙人掌转成序列的方法是先tarjan找环,对于一个环上的点,如果是环根,那么这个环都属于其子仙人掌,如果不是环根,那么除了他自己这个环上都不是其子仙人掌,这样再dfs一次,对于一个点,优先走其出边里是其子仙人掌的部分,同时对于一个环,把不与环根相连的点的siz加到环根的siz里,这样仙人掌就转成了序列,一个子仙人掌对应的区间就是dfn[x]~dfn[x]+siz[x]-

neither_nor 1756

BZOJ 4564: [Haoi2016]地图

题目大意 原题链接 给一个仙人掌,每个结点有一个权值,查询每个仙人掌的子树(算本身)(子树结点满足:必须经过该点才能到达跟,即该点是子树的割点)有多少种小于y的权值个数为奇数(或偶数)。y是每次询问时候给。 可离线,1e5个点和询问 算法分析 如果在树上那就需要用DFS序,仙人掌也有DFS序,叫做仙人掌序列嘛。 实际上就是需要先预处理出一个结点在环上的相邻结点(有一个一定是DFS的...

少主大人殿下的博客 501

loj2062 [HAOI2016]地图

ref #include <algorithm> #include <iostream> #include <cstdio> #include <cmath> using namespace std; int n, m, q, a[100005], uu, vv, hea[100005], cnt, dfn[100005], loo[100...

dianjiaxian1205的博客 139

洛谷P3180 [HAOI2016]地图

仙人掌、圆方树、莫队、树状数组

ACoder 301

HAOI2016 简要题解

「HAOI2016」食物链 题意 现在给你 \(n\) 个物种和 \(m\) 条能量流动关系,求其中的食物链条数。 \(1 \leq n \leq 100000, 0 \leq m \leq 200000\) 题解 拓扑 \(dp\) 入门题,没什么好讲的。 但是注意要看清题,单个生物不算食物链。 代码 #include <bits/stdc++.h> #define For(i, ...

weixin_30908649的博客 300

P3180-[HAOI2016]地图【圆方树,莫队,分块】

正题 题目链接:https://www.luogu.com.cn/problem/P3180 题目大意 nnn个点mmm条边的一个仙人掌,有点权。 QQQ次询问给出op,x,yop,x,yop,x,y,封闭111到xxx号点的所有简单路径后xxx能到达的点的点权中,小于yyy且出现次数为奇数/偶数的权值数目。 1≤n,Q≤105,1≤m≤1.5×105,0≤y,wi≤1061\leq n,Q\leq 10^5,1\leq m\leq 1.5\times 10^5,0\leq y,w_i\leq 10^61

QuantAsk 332

【LOJ】#2062. 「HAOI2016」地图

题解 我对莫队真是一无所知 这个东西显然可以用圆方树转成一个dfs序列 然后呢,用莫队计算每个询问区间的每个数出现的次数,从而顺带计算每个数字的奇偶性 但是我们要查的数字也用一个范围,可以直接用分块维护,修改\(O(1)\)查询\(O(n)\) 代码 #include <bits/stdc++.h> #define enter putchar('\n') #define sp...

weixin_30409849的博客 140

2018.10.29 bzoj4564: [Haoi2016]地图(仙人掌+莫队)

传送门 根据原图建一棵新的树。 把原图每一个环上除了深度最浅的点以外的点全部向深度最浅的点连边。 然后可以搞出来一个dfsdfsdfs。 这个时候我们就成功把问题转换成了对子树的询问。 然后就可以对权值分块用莫队做了注意如果不用分块而是用树状数组维护是O(nlognsqrt(n))的 代码: #include&lt;bits/stdc++.h&gt; using namespace std; in...

苟为蒟蒻又何妨 384

题目填坑计划

一个蒟蒻的最后的挣扎 吉林 JLOI 2016 侦察守卫 树形DP 可怕的题目,照题解抄了一遍,和它相似的题目还有HDU5290BombingPlan 方 容斥+乱搞 可怕的题目,看题解懂的,但是完全写不来 成绩比较 组合DP 找题解理解了并且做完了,但是当场做肯定GG 字符串覆盖 KMP+贪心 贪心方式真是奇葩,要判的东西太多了,什么时候肝一下 圆的异或并 平衡树,扫描线 全场唯一...

weixin_30784141的博客 148
上一篇: 【Hnoi2016 day1】网络
下一篇: 【SDOI2011 第1轮 DAY1】染色
StrideTG
博客等级 码龄9年 4粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值