记录编号 142288 评测结果 AAAAAAAAAA
题目名称 [HDOJ5140]Hun Gui Wei公司 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 1.988 s
提交时间 2014-12-07 10:47:56 内存使用 48.00 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<deque>
#include<set>
using namespace std;
typedef long long LL;
const int SIZEN=100010;
class NODE{//函数式线段树的节点
public:
    LL sum;
    int l,r;
    int lson,rson;
    void clear(int a,int b){
        l=a,r=b;
        sum=0;
        lson=rson=-1;
    }
};
NODE tree[SIZEN*20];
int tot=0;
int build(int l,int r){
    int x=tot++;
    tree[x].clear(l,r);
    if(l<r){
        int mid=(l+r)/2;
        tree[x].lson=build(l,mid);
        tree[x].rson=build(mid+1,r);
    }
    return x;
}
int change(int x,int a,LL t){
    if(x==-1) return -1;
    if(tree[x].l>a||tree[x].r<a) return x;
    int p=tot++;
    tree[p]=tree[x];
    NODE &now=tree[p];
    now.sum+=t;
    now.lson=change(now.lson,a,t);
    now.rson=change(now.rson,a,t);
    return p;
}
LL query(int x,int a,int b){
    if(x==-1) return 0;
    NODE &now=tree[x];
    if(now.l>b||now.r<a) return 0;
    if(now.l>=a&&now.r<=b) return now.sum;
    return query(now.lson,a,b)+query(now.rson,a,b);
}
class DSCT{
public:
    vector<int> s;
    vector<int> t;
    void clear(void){
        s.clear();t.clear();
    }
    void insert(int x){
        s.push_back(x);
    }
    void prepare(void){
        t.clear();
        sort(s.begin(),s.end());
        for(int i=0;i<s.size();i++){
            if(!i||s[i]!=s[i-1]) t.push_back(s[i]);
        }
    }
    int sgl_turn(int x){
        return lower_bound(t.begin(),t.end(),x)-t.begin()+1;
    }
    void turn(LL &a,LL &b){
        a=max(a,-1LL),b=min(b,1000000001LL);
        a=lower_bound(t.begin(),t.end(),(int)a)-t.begin()+1;
        b=upper_bound(t.begin(),t.end(),(int)b)-t.begin()-1+1;
    }
}DA;
class PERSON{
public:
    int S,L,A;
}P[SIZEN];
bool operator < (PERSON a,PERSON b){
    return a.L<b.L;
}
int N;
LL K;
int root[SIZEN]={0};
int Llis[SIZEN]={0};
void answer(void){
    LL L1,L2,A1,A2;
    //scanf("%I64d%I64d%I64d%I64d",&L1,&L2,&A1,&A2);
    scanf("%lld%lld%lld%lld",&L1,&L2,&A1,&A2);
    L1+=K;L2-=K;A1+=K;A2-=K;
    if(L1>L2) swap(L1,L2);
    if(A1>A2) swap(A1,A2);
    DA.turn(A1,A2);
    L1=lower_bound(Llis+1,Llis+1+N,L1)-Llis;
    L2=upper_bound(Llis+1,Llis+1+N,L2)-Llis-1;
    K=query(root[L2],A1,A2)-query(root[L1-1],A1,A2);
    if(L1>L2) K=0;
    //printf("%I64d\n",K);
    printf("%lld\n",K);
}
void prepare(void){
    K=0;
    DA.prepare();
    for(int i=1;i<=N;i++) P[i].A=DA.sgl_turn(P[i].A);
    sort(P+1,P+1+N);
    for(int i=1;i<=N;i++) Llis[i]=P[i].L;
    tot=0;
    root[0]=build(1,N);
    for(int i=1;i<=N;i++) root[i]=change(root[i-1],P[i].A,P[i].S);
}
bool read(void){
    if(scanf("%d",&N)==EOF) return false;
    DA.clear();
    for(int i=1;i<=N;i++){
        scanf("%d%d%d",&P[i].S,&P[i].L,&P[i].A);
        DA.insert(P[i].A);
    }
    return true;
}
int main(){
    freopen("hunguiwei.in","r",stdin);
    freopen("hunguiwei.out","w",stdout);
    while(read()){
        int M;
        prepare();
        scanf("%d",&M);
        while(M--) answer();
    }
    return 0;
}