G题:URAL 1987
这题比赛的时候没看懂题目,现在又研究了好久,把题意理解错了,然后看队友交的代码都不懂,大帝一提醒才知道又把题意看错了^_^.因为把以前的线段树模板给放弃了,采取了更加飘逸的数组写法,所以还不是很熟悉……而且代码是看了别人的,代码与上次保存的代码都差不多,就是处理lazy标记的不一样而已,就是这个不一样,苦死我了,现在那个Pushup函数还没看懂怎么意思……唉……过段时间回来看看应该才懂吧……
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <list>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define PI acos(-1.0)
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define sc(a,b) scanf("%d%d",&a,&b)
#define pri(a) printf("%d\n",a)
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define MM 1000005
#define MN 200050
#define INF 1000000009
#define eps 1e-7
using namespace std;
typedef long long ll;
int lazy[MN*8],a[MN/2],b[MN/2],c[MN*8],q[MN/2];
void pushdown(int i) //处理lazy标记
{
if(lazy[i]!=-1)
{
lazy[i<<1]=lazy[i<<1|1]=lazy[i];
lazy[i]=-1; //去除标记
}
}
void pushup(int i)
{
if(lazy[i<<1]==lazy[i<<1|1]) lazy[i]=lazy[i<<1]; //不过这句话没看懂
else lazy[i]=-1;
}
void update(int i,int l,int r,int L,int R,int val)
{
if(L<=l&&r<=R) {lazy[i]=val;return ;}
pushdown(i); //处理lazy标记往下传
int mid=(l+r)>>1;
if(L<=mid) update(lson,L,R,val);
if(R>mid) update(rson,L,R,val);
pushup(i);
}
int query(int i,int l,int r,int w)
{
if(l==r) return lazy[i];
pushdown(i); //处理lazy标记往下传
int res,mid=(l+r)>>1;
if(w<=mid) res=query(lson,w);
else res=query(rson,w);
pushup(i);
return res;
}
int main()
{
int n,m,i,cnt=0;
mem(lazy,-1);
sca(n);
for(i=1;i<=n;i++)
{
sc(a[i],b[i]);
c[cnt++]=a[i];
c[cnt++]=b[i];
}
sca(m);
for(i=1;i<=m;i++)
sca(q[i]),c[cnt++]=q[i];
sort(c,c+cnt);
cnt=unique(c,c+cnt)-c; //去重离散化
for(i=1;i<=n;i++)
{
int L=lower_bound(c,c+cnt,a[i])-c+1;
int R=lower_bound(c,c+cnt,b[i])-c+1;
update(1,1,cnt,L,R,i);
}
for(i=1;i<=m;i++)
pri(query(1,1,cnt,lower_bound(c,c+cnt,q[i])-c+1));
return 0;
}
组队赛6:线段树离散化+树状数组并哈希,布布扣,bubuko.com
原文:http://blog.csdn.net/u011466175/article/details/23204603