B(倍增)

题意:

 分析:

  先可以用two point预处理出以每个位置为起点的连续段<=k的下一个终点

  然后对于每个询问,倍增跳就行了

  时间复杂度O(nlogn)

C(扫描线处理区间询问)

题意:

分析:

  先容易考虑到莫队算法,合并用并查集就行,但删除就很不方便了,而且n高达1e6,所以就无法用莫队

  考虑将所有询问按照右端点r扫描线,每次维护每个位置i的答案,即区间[i,r]的答案

  我们来考虑加入了一个新的数字x,会对哪些地方的答案造成修改

  首先可能会有修改的地方一定是上一个x出现的位置(设为pre[x])之后

  然后我们发现有一些点是修改的关键点,那就是pre[x-10],pre[x-9],...pre[x-1],pre[x+1],pre[x+2],...pre[x+10]

  这些关键点中间的线段上的答案都是更改了相同的值,所以我们每次可以暴力的进行20次区间加值,询问是单点询问,这个用BIT可以轻松解决,下面我们来具体考虑一下如何修改

  我们按照关键点的位置从大到小进行段修改,假设我们现在站在一个关键点上,然后这个关键点后面正好有包含0的一段[-l,r],如-3,-2,-1,1,2,那么我们应该给[cur+1,last]上的bit[l+r+1]进行区间修改,当然也别忘了要把bit[l],bit[r]对应区间减去1

  时间复杂度O(nklogn+mlogn)

 #include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
int a[maxn+];
struct wjmzbmr
{
int l,r,id;
bool operator < (const wjmzbmr &x) const
{
return r<x.r;
}
}q[maxn+];
char ans[maxn+][];
int pre[maxn+];
int bit[][maxn+];
int n,m;
int lowbit(int x)
{
return x&(-x);
}
void add(int *c,int k,int x)
{
if(k==) return;
for(int i=k;i<=n;i+=lowbit(i)) c[i]+=x;
}
void add(int *c,int l,int r,int x)
{
//printf("%d %d %d\n",l,r,x);
add(c,l,x);
add(c,r+,-x);
}
int query(int *c,int k)
{
int ans=;
for(int i=k;i;i-=lowbit(i)) ans+=c[i];
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) scanf("%d",&a[i]);
for(int i=;i<=m;++i) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
int j=;
sort(q+,q+m+);
for(int i=;i<=n;++i)
{
int x=a[i];
int l=,r=,last=i,cur=;
while(last>pre[x])
{
cur=pre[x];
if(l<=&&x+l+<=maxn&&pre[x+l+]>cur) cur=pre[x+l+];
if(r<=&&x-r->=&&pre[x-r-]>cur) cur=pre[x-r-];
//printf("%d %d %d %d\n",cur,last,l,r);
if(l&&l<=) add(bit[l],cur+,last,-);
if(r&&r<=) add(bit[r],cur+,last,-);
if(l+r+<=) add(bit[l+r+],cur+,last,);
//printf("%d %d %d %d\n",pre[x],last,l,r);
while(l<=&&x+l+<=maxn&&pre[x+l+]>=cur) ++l;
while(r<=&&x-r->=&&pre[x-r-]>=cur) ++r;
last=cur;
if(l>&&r>) break;
//printf("%d %d %d %d\n",pre[x],last,l,r);
}
pre[a[i]]=i;
while(j<=m&&q[j].r==i)
{
for(int k=;k<=;++k)
ans[q[j].id][k]=''+query(bit[k],q[j].l)%;
++j;
}
}
for(int i=;i<=m;++i) puts(ans[i]+);
return ;
}

E(bitset)

 题意:

分析:

  考虑预处理出d[i][j]表示从i点开始,最短距离<=j的所有点(用bool数组表示),这是1000*1000*1000的,考虑用bitset把变成1000^3/64的

  然后对于每组询问只要把所有点的对应bitset或起来就行了

  至于如何求d[i][j]可以O(nm)求,也可以O(n^3/64)的压位BFS求

F(树链剖分+treap)

题意:

  

分析:

  对于一个询问,我们要考虑点u、点u的父亲、点u的重儿子、点u的轻儿子

  我们把每个点的轻儿子用平衡树存起来,或者用pbds的set

  然后对于每次修改,只需要改那些重链头的点的set,这总共有logn个,所以修改的复杂度是O(log^2n)的

  询问就是O(log)的了

  时间复杂度是O(nlog^2n+mlogn)

  我们考虑把修改操作给lazy掉,就是遇见修改先不要修改,留到询问的时候再修改,这样就把复杂度岔开了

  可以证明出这样的复杂度均摊是O(nlogn+mlogn)的

Wannafly练习赛14的更多相关文章

  1. 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)

    牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...

  2. wannafly挑战赛14

    第一次打wannafly..觉得自己好菜啊... 题目描述 在三维空间中,平面 x = 0, y = 0, z = 0,以及平面 x + y + z = K 围成了一个三棱锥. 整天与整数打交道的小明 ...

  3. 牛客练习赛14 D 比较月亮大小 【水】

    链接:https://www.nowcoder.com/acm/contest/82/D 来源:牛客网 比较月亮大小 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其 ...

  4. 牛客练习赛14 B 区间的连续段 (倍增)

    链接:https://ac.nowcoder.com/acm/contest/82/B来源:牛客网 区间的连续段 时间限制:C/C++ 7秒,其他语言14秒 空间限制:C/C++ 262144K,其他 ...

  5. 牛客练习赛14 D比较月亮大小 (实现)

    链接:https://ac.nowcoder.com/acm/contest/82/D来源:牛客网 题目描述 点点是一名出色的狼人.众所周知,狼人只有在满月之夜才会变成狼. 同时,月亮的大小随着时间变 ...

  6. hihocoder [Offer收割]编程练习赛14

    A.小Hi和小Ho的礼物 谜之第1题,明明是第1题AC率比C还要低.题目是求在n个不同重量袋子选4袋,2袋给A,2袋给B,使2人获得重量相同,求问方案数. 我也是一脸懵b...o(n2)暴力枚举发现把 ...

  7. Wannafly挑战赛14 C.可达性(tarjan缩点)

    题目描述 给出一个 0 ≤ N ≤ 105 点数.0 ≤ M ≤ 105 边数的有向图, 输出一个尽可能小的点集,使得从这些点出发能够到达任意一点,如果有多个这样的集合,输出这些集合升序排序后字典序最 ...

  8. hihocoder [Offer收割]编程练习赛14 剑刃风暴

    题目4 : 剑刃风暴 时间限制:20000ms 单点时限:2000ms 内存限制:256MB 描述 主宰尤涅若拥有一招非常厉害的招式——剑刃风暴,“无论是战士还是法师,都害怕尤涅若的武士刀剑技”. 现 ...

  9. hihocoder [Offer收割]编程练习赛14 可疑的记录

    题目3 : 可疑的记录 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一棵N个节点的树,编号1-N,其中1号节点是整棵树的根.他把这棵树的N-1条边记录成N-1 ...

随机推荐

  1. Bootstrap历练实例:链接样式按钮

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  2. webpack执行命令的不同方式

    如使用webpack3及之前的版本只需安装webpack3即可,因为之前的webpack里面集成了webpack-cli 1. 使用局部安装webpack和webpack-cli,使用package. ...

  3. mycat中间件安装与使用

    前提: 安装JDK版本在7.0及其以上 1.下载: 下载地址在:http://dl.mycat.io/ 选择1.6-release版本下载 2.安装: 直接解压即可: tar -zxf Mycat-s ...

  4. Linux-ngnix服务(二)

    Nginx介绍 特性: 模块化设计,较好的扩展性 高可靠性 支持热部署:不停机更新配置文件,升级版本,更换日志文件 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存 ...

  5. file结构体

    struct file结构体定义在include/linux/fs.h中定义.文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的 struct file.它由内核在打开文件时 ...

  6. Window Phone 8手电筒

    一直想开发一个Wp8的手电筒程序,看了好多别人开发的基本上有以下问题: 1.锁屏闪光灯关闭了 2.闪光灯不停的闪烁. 我就想开发一个锁屏也能用的手电筒,发现找资料那是相当的困难.找到的代码基本都不能令 ...

  7. mysql replication常见错误整理

    这篇文章旨在记录MySQL Replication的常见错误,包括自己工作中遇到的与网友在工作中遇到的,方面自己及别人以后进行查找.每个案例都是通过Last_IO_Errno/Last_IO_Erro ...

  8. 修复Centos7双系统引导

    1.进入CentOS系统 2.命令行输入 vi /boot/grub2/grub.cfg 3.在文件空白处添加下列代码 menuentry 'Windows 7'{ insmod part_msdos ...

  9. Leetcode 335.路径交叉

    路径交叉 给定一个含有 n 个正数的数组 x.从点 (0,0) 开始,先向北移动 x[0] 米,然后向西移动 x[1] 米,向南移动 x[2] 米,向东移动 x[3] 米,持续移动.也就是说,每次移动 ...

  10. Palindromic Paths(DP)

    描述 Given an N×N grid of fields (1≤N≤500), each labeled with a letter in the alphabet. For example: A ...