码迷,mamicode.com
首页 > 其他好文 > 详细

poj 2528 Mayor's posters

时间:2016-05-07 10:08:11      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:

这道题,很自然的想到了用离散化和成段更新。。
离散化有2中方式写。。详见代码。。
然后成段更新虽然没有lazy因为写的途中发现并不需要。。
然后,我实在不知道discuss里面大家说的关于数据的问题,可能自己的这个程序也会有错误的吧。。

然后尝试着用树的节点保存颜色数目,,, 但是没实现。。

然后是乱七八糟的代码。。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<vector>
using namespace std;
//int dian[200010];
vector<int>dian;
int flag[200010];
struct nodes
{
    int x;
    int y;
}nod[10010];
struct mytree
{
    //int lazy;
    int me;
}tree[20010<<2];
void myson(int node)
{
    //tree[(node<<1)].me=tree[node].lazy;
    //tree[(node<<1)+1].me=tree[node].lazy;
    //tree[(node<<1)].lazy=tree[node].lazy;
    //tree[(node<<1)+1].lazy=tree[node].lazy;
    //tree[node].lazy=0;
    tree[(node<<1)+1].me=tree[node].me;
    tree[(node<<1)].me=tree[node].me;
    tree[node].me=0;
}
void change(int node,int left,int right,int x,int y,int color)
{
    if(x<=left&&right<=y)
    {
        tree[node].me=color;
        //tree[node].lazy=color;
        return ;
    }
    //if(tree[node].lazy)
    //{
    //    myson(node);
    //}
    if(tree[node].me)
    {
        myson(node);
    }
    int mid=(left+right)/2;
    if(y<=mid)
    {
        change((node<<1),left,mid,x,y,color);
        //tree[node].me=tree[(node<<1)+1].me+tree[(node<<1)].me;
    }
    else if(mid<x)
    {
        change((node<<1)+1,mid+1,right,x,y,color);
        //tree[node].me=tree[(node<<1)+1].me+tree[(node<<1)].me;
    }
    else
    {
        change((node<<1),left,mid,x,y,color);
        change((node<<1)+1,mid+1,right,x,y,color);
        //tree[node].me=tree[(node<<1)+1].me+tree[(node<<1)+1].me-1;
    }
}
int find(int node,int left,int right)
{
    if(tree[node].me)
    {
        if(!flag[tree[node].me])
        {
            flag[tree[node].me]++;
            return 1;
        }
        else
        {
            return 0;
        }
    }
    else
    {
        int mid=(left+right)/2;
        return find((node<<1),left,mid)+find((node<<1)+1,mid+1,right);
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        int x;
        int y;
        //int cnt=0;
        dian.clear();
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&y);
            if(x>y)
                swap(x,y);
            nod[i].x=x;
            nod[i].y=y;
            //cnt++;
            dian.push_back(x);
            //dian[cnt]=x;
            //cnt++;
            dian.push_back(y);
            //dian[cnt]=y;
        }
        sort(dian.begin(),dian.end());
        //sort(dian+1,dian+cnt+1);
        vector<int>::iterator it=unique(dian.begin(),dian.end());
        dian.erase(it,dian.end());//这样就可以了。。
        //dian[0]=0;
        //int all=0;
        //for(int i=1;i<=cnt;i++)//去重。。但是可以用vector,一开始并不知道有unique的存在。。
        //{
        //    if(dian[i]!=dian[i-1])
        //    {
        //        all++;
        //        dian[all]=dian[i];
        //    }
        //}
        int all=dian.size();
        memset(tree,0,sizeof(tree));
        for(int i=1;i<=n;i++)
        {
            //nod[i].x=lower_bound(dian+1,dian+all,nod[i].x)-dian;
            //nod[i].y=lower_bound(dian+1,dian+all,nod[i].y)-dian;
            nod[i].x=lower_bound(dian.begin(),dian.end(),nod[i].x)-dian.begin()+1;
            nod[i].y=lower_bound(dian.begin(),dian.end(),nod[i].y)-dian.begin()+1;
            change(1,1,all,nod[i].x,nod[i].y,i);
        }
        memset(flag,0,sizeof(flag));
        printf("%d\n",find(1,1,all));
    }
    return 0;
}

poj 2528 Mayor's posters

标签:

原文地址:http://blog.csdn.net/qq_32995183/article/details/51334901

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!