- 火柴排队
- 2016-11-03 23:10:09 @
树状数组这题不会超时,那么线段树怎么就超了呢??
以下是蒟蒻的代码,请大神们看一看
#include<bits/stdc++.h>
#define add(x) tree[x].add
#define minn(x) tree[x].minn
#define ls(x) tree[x].l
#define rs(x) tree[x].r
#define sum(x) tree[x].sum
using namespace std;
struct node
{
int minn;
int add;
int l;
int r;
int sum;
}tree[1001000<<2];
int scan()
{
int x=0;
int f=1;
char ch=getchar();
while (ch<'0'||ch>'9')
{
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int num[1001000];
int c[100100];
void buildtree(int i,int l,int r)
{
ls(i)=l;
rs(i)=r;
sum(i)=r-l+1;
if (l==r)
{
minn(i)=c[l];
return;
}
int mid((l+r)>>1);
buildtree(i<<1,l,mid);
buildtree(i<<1|1,mid+1,r);
minn(i)=min(minn(i<<1),minn(i<<1|1));
}
int query(int i,int ql,int qr,int k)
{
if (ql<=ls(i)&&rs(i)<=qr&&minn(i)>k)
return sum(i);
if (ql>rs(i)||qr<ls(i))
return 0;
return query(i<<1,ql,qr,k)+query(i<<1|1,ql,qr,k);
}
struct shit
{
int num;
int order;
}myy[100100],lcy[100100];
bool cmp(shit a,shit b)
{
if (a.num<b.num) return true;
else
return false;
}
int main()
{
int n;
n=scan();
for (int i=1;i<=n;i++)
{
myy[i].num=scan();
myy[i].order=i;
}
for (int i=1;i<=n;i++)
{
lcy[i].num=scan();
lcy[i].order=i;
}
sort(myy+1,myy+n+1,cmp);
sort(lcy+1,lcy+n+1,cmp);
for (int i=1;i<=n;i++)
c[myy[i].order]=lcy[i].order;
buildtree(1,1,n);
int ans=0;
for (int i=2;i<=n;i++)
ans=(ans+query(1,1,i-1,c[i]));
printf("%d\n",ans);
}
1 条评论
-
Randle LV 9 @ 2017-07-27 09:49:18
线段树访问节点本来就比较慢。
不是你的问题吧。
- 1
信息
- ID
- 1842
- 难度
- 7
- 分类
- (无)
- 标签
- 递交数
- 5085
- 已通过
- 1102
- 通过率
- 22%
- 被复制
- 10
- 上传者