19徐州网络赛E 线段树加离散化

题目链接:https://www.jisuanke.com/contest/3005/267806

按wi的值建立权值线段树维护值为wi出现的最后位置,对于第i个人的答案,查询线段树[wi+m,max]区间的最大位置pos,令如果pos-i-1小于等于-1则是在i之后不存在大于等于wi+m的人,否则第i个人的答案即为pos-i-1。由于wi范围过大所以需对wi离散化

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
#define maxn 1000010
int n,m,mx[maxn<<2];
ll w[maxn],x[maxn],li[maxn],ans[maxn];
void pushup(int rt)
{
    mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
}
void update(int L,int c,int l,int r,int rt)
{
    if(l==r)
    {
        mx[rt]=c;
        return ;
    }
    int mid=l+r>>1;
    if(L<=mid)update(L,c,ls);
    else update(L,c,rs);
    pushup(rt);
}
int query(int L,int R,int c,int l,int r,int rt)
{
    if(L<=l&&R>=r)
    {
        return mx[rt];
    }
    int mid=l+r>>1,ret=0;
    if(L<=mid)ret=max(ret,query(L,R,c,ls));
    if(R>mid)ret=max(ret,query(L,R,c,rs));
    return ret;
}
int main()
{
    scanf("%d%d",&n,&m);
    int tot=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&w[i]);
        x[++tot]=w[i];
        x[++tot]=w[i]+m;
    }
    sort(x+1,x+1+tot);
    int nx=unique(x+1,x+1+tot)-x-1;
    int L;
    for(int i=1;i<=n;i++)
    {
        L=lower_bound(x+1,x+1+nx,w[i])-x;
        update(L,i,1,nx,1);
    }
    for(int i=1;i<=n;i++)
    {
        L=lower_bound(x+1,x+1+nx,w[i]+m)-x;
        L=query(L,nx,i,1,nx,1);
        if(L==-1)ans[i]=-1;
        else ans[i]=L-i-1;
        if(ans[i]<-1)ans[i]=-1;
    }
    for(int i=1;i<n;i++)
    printf("%lld ",ans[i]);
    printf("%lld\n",ans[n]);
    return 0;
}

原文地址:https://www.cnblogs.com/chen99/p/11483249.html

时间: 2024-10-07 18:55:09

19徐州网络赛E 线段树加离散化的相关文章

2017 ACM-ICPC 北京网络赛 Minimum 线段树

描述 You are given a list of integers a0, a1, -, a2^k-1. You need to support two types of queries: 1. Output Minx,y∈[l,r] {ax?ay}. 2. Let ax=y. 输入 The first line is an integer T, indicating the number of test cases. (1≤T≤10). For each test case: The fi

HDU 5875 Function (2016年大连网络赛 H 线段树+gcd)

很简单的一个题的,结果后台数据有误,自己又太傻卡了3个小时... 题意:给你一串数a再给你一些区间(lef,rig),求出a[lef]%a[lef+1]...%a[rig] 题解:我们可以发现数字a对数字b取模时:如果a<b,则等于原数,否则a会变小至少一半.就是说a最多成功取模(log2 a)次,所以我们只需要每次在区间内找到最前面一个小于等于a的值,接着更新a与区间左端点,直到没有值比a小或者区间取模完成. 我们可以使用线段树求出区间内小于某个值的最前一个位置,具体方法就是:父节点记录区间最

hdu5023 ( 广州网络赛 ) 线段树

题意是给你n个连续的点(1-n) m次操作  开始每个点都为2 两种操作 1:把一段区间的点变为c 2:询问区间有多少种点 很明显的线段树      对每个节点 flash表示该节点是否全为一样的数  若是  则flash=这个数否则  flash=-1: 数组color记录该节点输得状态    1表示有0表示没有(我开成字符型  之前为int超类存了   真是无语) 然后  有更新和查询操作 #include<stdio.h> #include<string.h> #includ

hdu 4046 2011北京赛区网络赛G 线段树 ***

还带这么做的,卧槽,15分钟就被A了的题,居然没搞出来 若某位是1,则前两个为wb,这位就是w 1 #include<cstdio> 2 #include<cstring> 3 #define lson l,m,rt<<1 4 #define rson m+1,r,rt<<1|1 5 using namespace std; 6 const int maxn=50010; 7 int n,m,sum[maxn<<2]; 8 char str[ma

2019徐州网络赛 XKC&#39;s basketball team 线段树

网址:https://nanti.jisuanke.com/t/41387 题意: 大家好,我是训练时长两年半的个人练习生蔡徐坤,我的爱好是唱,跳,rap,篮球. 给出一段长度为$n,(n \leq 1e5)$的序列,对每一个数,求出它和它后面比它大$m$的数中间夹着的数的数量,没有输出$-1$. 题解: 直接建线段树,维护最大值,然后查询时对第$i$个数,搜索区间$[i,n]$之中大于$num[i]+m$的值的位置的最大值,具体操作是先限定区间,然后求出所有合法位置,取最大值,如果搜索不到则返

20180909徐州网络赛题解

目录 20180909徐州网络赛题解 A. Hard to prepare MEANING SOLUTION CODE B. BE, GE or NE MEANING SOLUTION CODE F. Features Track CODE G. Trace MENING SOLUTION CODE H. Ryuji doesn't want to study MEANING CODE I. Characters with Hash CODE J. Maze Designer MEANING S

2018 ICPC 徐州网络赛

2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution 将环变成链,设\(f[i][0\)~\(2]\),分别表示与第一个数相同,与第一个数不同,与第一个数相同,与第一个数的反相同.然后\(dp\)即可. 时间复杂度:\(O(n)\) B. BE, GE or NE solution 根据题目描述\(dp\)即可. 时间复杂度:\(O(nm)\) C.

2018徐州网络赛H. Ryuji doesn&#39;t want to study

题目链接: https://nanti.jisuanke.com/t/31458 题解: 建立两个树状数组,第一个是,a[1]*n+a[2]*(n-1)....+a[n]*1;第二个是正常的a[1],a[2],a[3]...a[n] #include "bits/stdc++.h" using namespace std; #define ll long long const int MAXN=1e5+10; ll sum[MAXN],ans[MAXN]; ll num[MAXN];

ACM-ICPC 2018徐州网络赛-H题 Ryuji doesn&#39;t want to study

C*M....死于update的一个long long写成int了 心累 不想写过程了 ******** 树状数组,一个平的一个斜着的,怎么斜都行 题库链接:https://nanti.jisuanke.com/t/31460 #include <iostream> #include <cstring> #define ll long long #define lowbit(x) (x & -x) using namespace std; const int maxn =