hdu 3333 선분 트 리 오프라인 작업
우선 검색 구간 의 오른쪽 값 에 따라 정렬 합 니 다.그 다음 에 데 이 터 를 삽입 하여 모든 수 를 선분 트 리 에 넣 을 때 먼저 판단 한 다음 에 그 가 온라인 트 리 가 있 는 지 없 는 지 판단 하고 있 으 면 삭제 하고 그의 위 치 를 현재 점 으로 업데이트 합 니 다.
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
typedef __int64 ll;
#define N 300010
#define M 100010
struct
{
int l,r;
ll num;
}root[N*4];
struct Q
{
int s,t,ind;
}q[M];
bool cmp(Q i,Q j)
{
return i.t<j.t;
}
inline void build(int t,int x,int y)
{
root[t].l=x;
root[t].r=y;
root[t].num=0;
if(x==y) return;
int m=(x+y)>>1;
build(t*2,x,m);
build(t*2+1,m+1,y);
}
inline void Modefiy(int t,int x,ll val)
{
int l=root[t].l;
int r=root[t].r;
if(l==r)
{
root[t].num+=val;return;
}
int m=(l+r)>>1;
if(x<=m) Modefiy(t*2,x,val);
else Modefiy(t*2+1,x,val);
root[t].num=root[t*2].num+root[t*2+1].num;
}
inline ll query(int t,int x,int y)
{
int l=root[t].l;
int r=root[t].r;
if(l==x&&r==y)
{
return root[t].num;
}
int m=(l+r)>>1;
ll ans=0;
if(x<=m) ans+=query(t*2,x,min(m,y));
if(y>m) ans+=query(t*2+1,max(m+1,x),y);
return ans;
}
int t,n,qn;
ll a[N];
map<ll,int>m;
ll ans[M];
int main()
{
scanf("%d",&t);
while(t--)
{
m.clear();
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%I64d",&a[i]);
build(1,1,n);
scanf("%d",&qn);
for(int i=0;i<qn;i++)
{
scanf("%d%d",&q[i].s,&q[i].t);
q[i].ind=i;
}
sort(q,q+qn,cmp);
int k=1;
for(int i=0;i<qn;i++)
{
for(;k<=q[i].t;k++)
{
if(m[a[k]]!=0) Modefiy(1,m[a[k]],-a[k]);
m[a[k]]=k;
Modefiy(1,k,a[k]);
}
ans[q[i].ind]=query(1,q[i].s,q[i].t);
}
for(int i=0;i<qn;i++) printf("%I64d
",ans[i]);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.