Poj 1436 线段树模板

来源:互联网 发布:phpstorm git mac 编辑:程序博客网 时间:2024/05/04 19:38

没啥好说的,线段树维护区间,n^3暴力跑一遍就行了。
居然不会T,8000个点不就炸了么,汗。
然后就是自己写了(照别人抄)一份板子,感觉宏定义lson和rson还挺方便的。
空间要开8倍。
延迟标记以前太菜一直不懂,现在看也就那么回事。

代码:

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define lson u<<1#define rson u<<1|1const int MAXN=16100;bool vis[MAXN>>1][MAXN>>1];struct Dat{    int y1, y2, x;    //Dat(int y1, int y2, int x):y1(y1), y2(y2), x(x){}}seg[MAXN>>1];bool operator<(const Dat& a, const Dat& b){    return a.x<b.x;}struct node{    int left, right, color;}T[MAXN<<2];void Build(int u, int l, int r){    T[u].left=l;T[u].right=r;    T[u].color=0;    if(l==r)return;    int mid=(l+r)>>1;    Build(lson, l, mid);Build(rson, mid+1, r);}void Pushdown(int u){    if(T[u].color!=-1){        T[lson].color=T[rson].color=T[u].color;        T[u].color=-1;    }}void update(int u, int l, int r, int val){    if(l<=T[u].left&&T[u].right<=r){T[u].color=val;return;}    else {        Pushdown(u);        if(l<=T[lson].right)update(lson, l, r, val);        if(r>=T[rson].left)update(rson, l, r, val);    }}void Query(int u, int l, int r, int id){    if(T[u].color!=-1){        vis[T[u].color][id]=true;return;    }    if(T[u].left==T[u].right)return;    Pushdown(u);    if(l<=T[lson].right)Query(lson, l, r, id);    if(r>=T[rson].left)Query(rson, l, r, id);}int main(){    int t, n;    scanf("%d", &t);    while(t--)    {        scanf("%d", &n);        for(int i=1;i<=n;i++){            scanf("%d%d%d", &seg[i].y1, &seg[i].y2, &seg[i].x);            seg[i].y1<<=1;seg[i].y2<<=1;        }        sort(seg+1, seg+n+1);        memset(vis, false, sizeof(vis));        Build(1, 0, MAXN);        for(int i=1;i<=n;i++){            Query(1, seg[i].y1, seg[i].y2, i);            update(1, seg[i].y1, seg[i].y2, i);        }        int ans=0;        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                if(vis[i][j])for(int k=1;k<=n;k++){                    if(vis[i][k]&&vis[j][k])ans++;                }        printf("%d\n", ans);    }}
0 0