Wannafly练习赛14
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的更多相关文章
- 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)
牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...
- wannafly挑战赛14
第一次打wannafly..觉得自己好菜啊... 题目描述 在三维空间中,平面 x = 0, y = 0, z = 0,以及平面 x + y + z = K 围成了一个三棱锥. 整天与整数打交道的小明 ...
- 牛客练习赛14 D 比较月亮大小 【水】
链接:https://www.nowcoder.com/acm/contest/82/D 来源:牛客网 比较月亮大小 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其 ...
- 牛客练习赛14 B 区间的连续段 (倍增)
链接:https://ac.nowcoder.com/acm/contest/82/B来源:牛客网 区间的连续段 时间限制:C/C++ 7秒,其他语言14秒 空间限制:C/C++ 262144K,其他 ...
- 牛客练习赛14 D比较月亮大小 (实现)
链接:https://ac.nowcoder.com/acm/contest/82/D来源:牛客网 题目描述 点点是一名出色的狼人.众所周知,狼人只有在满月之夜才会变成狼. 同时,月亮的大小随着时间变 ...
- hihocoder [Offer收割]编程练习赛14
A.小Hi和小Ho的礼物 谜之第1题,明明是第1题AC率比C还要低.题目是求在n个不同重量袋子选4袋,2袋给A,2袋给B,使2人获得重量相同,求问方案数. 我也是一脸懵b...o(n2)暴力枚举发现把 ...
- Wannafly挑战赛14 C.可达性(tarjan缩点)
题目描述 给出一个 0 ≤ N ≤ 105 点数.0 ≤ M ≤ 105 边数的有向图, 输出一个尽可能小的点集,使得从这些点出发能够到达任意一点,如果有多个这样的集合,输出这些集合升序排序后字典序最 ...
- hihocoder [Offer收割]编程练习赛14 剑刃风暴
题目4 : 剑刃风暴 时间限制:20000ms 单点时限:2000ms 内存限制:256MB 描述 主宰尤涅若拥有一招非常厉害的招式——剑刃风暴,“无论是战士还是法师,都害怕尤涅若的武士刀剑技”. 现 ...
- hihocoder [Offer收割]编程练习赛14 可疑的记录
题目3 : 可疑的记录 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一棵N个节点的树,编号1-N,其中1号节点是整棵树的根.他把这棵树的N-1条边记录成N-1 ...
随机推荐
- Luogu P3938 斐波那契
Luogu P3938 斐波那契 第一眼看到这题,想到的是LCA,于是开始想怎么建树,倒是想出了\(n^{2}\)算法,看了下数据范围,果断放弃 想了想这数据范围,大的有点不正常,这让我想起了当年被小 ...
- Bootstrap图片支持响应式
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 获取 request 中 json 数据
import java.io.IOException; import javax.servlet.http.HttpServletRequest; /** * request 对象的相关操作 * @a ...
- 文件操作-mkdir
Linux mkdir命令 主要用来创建目录,也可以直接创建多层目录,本文就为大家介绍下 Linux mkdir命令 . 转载自https://www.linuxdaxue.com/linux-com ...
- dom4j 常用操作
package com.wanbang.wbyyb.common.util; import com.alibaba.fastjson.JSONObject; import com.wanbang.wb ...
- '>>' should be '> >' within a nested template argument list
在编译关于opencv相机标定的工程的时候出现了这个问题 vector<vector<Point3f>> objectPoints; error: 'objectPoint ...
- Python3中super()的参数传递
1. super([type[, object-or-type]]) super() 在使用时至少传递一个参数,且这个参数必须是一个类. 通过super()获取到的是一个代理对象,通过这个对象去查找父 ...
- Linux下Tomcat的安装和部署
一.安装tomcat 1.下载tomcat安装包apache-tomcat-7.0.62.tar.gz和jdk1.7 2.安装tomcat,将apache-tomcat-7.0.62.tar.gz复制 ...
- git2--常用命令
Git 命令详解及常用命令 Git作为常用的版本控制工具,多了解一些命令,将能省去很多时间,下面这张图是比较好的一张,贴出了看一下: 关于git,首先需要了解几个名词,如下: ? 1 2 3 4 Wo ...
- 牛腩新闻发布系统(三):CSS盒子模型及其基本内容
导读: 这些天一直在做牛腩的网页,比如什么首页.出错页.新闻内容页等.在学习的不断推进中,一些刚开始理解的不是很好的东西,也逐渐的深刻了起来.下面,就对这一段时间的学习,做一个总结.主要总结内容有:盒 ...