这道题目要用二分+桶排的方式解决
函数:
l~r找v
c:靠左/右(‘l’/‘r’)
靠左和靠右用STL函数二分就行,这里讲一下思路,二分出最靠左/右的v值(but二维,在but[v][0~len]区间二分)再判断是否在区间内在区间内输出but[v][a](a为二分的答案)否则输出-1。
最后再考虑一下需要输出-1的特殊情况(区间内没有v、不合法..........)即可
主函数:
调用函数即可
例程:
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; vector<int > but[N]; int n,m; int e_f(int l,int r,int v,char c) { if(l>r||but[v].size()==0||l<=0||r>n) return -1; if(c=='l') { int a=lower_bound(but[v].begin(),but[v].end(),l)-but[v].begin(); if(but[v][a]>=l&&but[v][a]<=r) return but[v][a]; else return -1; } else if(c=='r') { int a=upper_bound(but[v].begin(),but[v].end(),r)-but[v].begin(); a-=1; if(but[v][a]>=l&&but[v][a]<=r) return but[v][a]; else return -1; } } int main() { #ifdef LOCAL freopen( "1.in", "r", stdin ); freopen( "1.out", "w", stdout ); #endif scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { int t; scanf("%d",&t); but[t].push_back(i); } while(m--) { int l,r,v; scanf("%d%d%d",&l,&r,&v); int a1=e_f(l,r,v,'l'); int a2=e_f(l,r,v,'r'); int a3=e_f(1,l-1,v,'r'); int a4=e_f(r+1,n,v,'l'); printf("%d %d %d %d\n",a1,a2,a3,a4); } return 0; }
标签:二分,邻近,靠左,数字,int,begin,but,查询,区间 From: https://www.cnblogs.com/wjk53233/p/16656123.html