【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;
}
Python 爬虫实战:从零搭建第一个爬虫程序(附完整代码) 本文介绍了Python网络爬虫的入门实战,以豆瓣Top250电影榜单为例,详细讲解爬虫开发全流程。内容包括爬虫基础原理、环境搭建、请求发送与响应处理、数据解析与保存等核心环节,并提供了可直接运行的完整代码示例。文章还分析了常见问题解决方案,并强调了爬虫开发的合规注意事项。通过本教程,读者可快速掌握Python爬虫的基本思路和实操技巧,为后续深入学习BeautifulSoup、XPath等进阶技术打下基础。 阅读详情

相关推荐

WandB本地部署踩坑指南:从Docker启动到License更新的完整流程(附常见错误解决方案)

本文详细介绍了Weights & Biases(WandB)机器学习实验管理平台的本地化部署全流程,涵盖从Docker环境搭建、许可证管理到常见错误排查的实战经验。针对企业级应用场景,文章还提供了性能优化、高可用架构设计及开源替代方案Trackio的评估与迁移策略,为构建安全、可控的内部实验追踪平台提供完整解决方案。

potato的博客 568

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

实战指南:在UE5中高效集成Entt(ECS)框架

本文提供了一份在虚幻引擎5中高效集成Entt ECS框架的实战指南。针对UE5项目在处理大规模动态实体时的性能瓶颈,详细讲解了如何通过数据驱动的ECS架构进行优化。内容包括前期环境准备、核心构建步骤、创建首个ECS子系统以及与UE原生系统的数据同步技巧,旨在帮助开发者快速掌握集成方法,提升游戏逻辑的执行效率。

weixin_29002209的博客 158

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

SAP-ABAP:SAP客户端管理核心事务码SCC4深度解析

SAP客户端管理核心事务码SCC4深度解析

baidu_35680696的博客 1569

rk3568 rockit编译测试

编译rockit不能使用SDK默认编译kernel的交叉编译,需要采用编译buildroot的,而编译buildroot的编译器SDK并没有存放,需要编译过buildroot之后才可以用。命令参数相关解析可查阅代码,这里提醒一下-l参数,这是程序运行计数,默认是100,时间很短,基本上显示画面一闪而过,一度以为是程序哪里出问题了,改用-l 1000,画面显示时间加长。此处跳过系统,单领出来编译。rockit组件包在4.10版本需要手动编译,奈何我的版本怎么都编译不了,后来改用5.10版本才编译通过。

zfenggo的博客 4198

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

Skynet 框架面试题

本文整理了游戏服务端开发面试中 Skynet 框架的高频考点,涵盖底层架构、消息派发、协程调度、网络 I/O、harbor 跨机通信、内存管理、socket 处理、阻塞操作、错误处理等核心内容。全面覆盖 Skynet 框架的原理、使用和实战问题,追求深入准确,拒绝八股文。

小赖的博客 383

FJWC2016 day1 t1

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

lpf_as_a_oier的博客 616

交流电路计算方法:复阻抗和相量法

一,复阻抗 电容电路,电压与电流的大小比值是XC=1/WC,相位上电流比电压超前90度 这样描述很麻烦,在复平面里,相位超前90度,可以用什么数学表示呢? 也就是说,一个相量,乘以j之后,大小没变化,相位变得超前90度了 同样的,大小不变,相位落后90度应该除以j 原来我们说电容电路,给个电压,算电流又要算XC,又要另外说相位超前90度,现在可以简单点 在这个计算式里,1/wc还是原来的容抗大...

theory and practice的博客 3万+

Fast DDS源代码走读

DDS, PDP, EPD, DataWriter, DataReader

weixin_43082062的博客 713

[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

川崎机器人总线通信_三菱PLC和发那科机器人进行CCLINK总线通信

三菱CCLINK主站模块采用QJ61BT11N,该模块用在Q系列PLC上,如果是5U或3UPLC,可用FX5-CNV-BUS加FX3U-16CCL-M或FX5-CCL-M模块。本教程以Q系列为例CCLINK接线方法如下模块拨码含义如下接线和拨码设置好后,接着在编程软件上设置CCLINK通信参数打开编程软件,在工程导航栏打开参数——网络参数,选中CCLINK打开。打开如下画面起始IO为模块本体占用I...

weixin_42300398的博客 7554

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

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

maxtir的博客 417

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

A_Bright_CH的博客 541

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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、付费专栏及课程。

余额充值