蒟蒻调了一上午!向大佬求助离散化

P3740 [HAOI2014] 贴海报

d3ac @ 2019-07-29 16:21:11

这个是离散化了的

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000000
using namespace std;
int n,m,k,N,ki=1,ans,flag;
bool book[maxn];
struct node
{
    int x,id,flag;//flag=1表示的是是u  等于2表示的v 
}edge[maxn];
struct NODE
{
    int u,v;
}line[maxn];
struct Node
{
    int flag;
}tree[maxn*4];
inline bool cmp(node a,node b) {return a.x<b.x;}
void lsh()
{
    edge[1].flag==1? line[edge[1].id].u=ki : line[edge[1].id].v=ki;
    for(int i=2;i<=k;i++)
    {
        if(edge[i].x!=edge[i-1].x) ki+=2;
        edge[i].flag==1? line[edge[i].id].u=ki : line[edge[i].id].v=ki;
    }
}
void update(int id,int l,int r,int left,int right)
{
    if(tree[id].flag) return ;
    if(l==left && r==right) 
    {
        tree[id].flag=1;
        flag=1; return ;
    }
    int mid=(l+r)/2;
    if(mid>=right) update(id*2,l,mid,left,right);
    else if(mid<left) update(id*2+1,mid+1,r,left,right);
    else update(id*2,l,mid,left,mid),update(id*2+1,mid+1,r,mid+1,right);
    tree[id].flag=(tree[id*2].flag && tree[id*2+1].flag);
}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1,u,v;i<=m;i++)
    {
        scanf("%d %d",&u,&v);
        edge[++k].id=i; edge[k].flag=1; edge[k].x=u;
        edge[++k].id=i; edge[k].flag=2; edge[k].x=v;
    } 
    sort(edge+1,edge+1+k,cmp);
    lsh();
    for(int i=m;i;i--)
    {
        flag=0;
        update(1,1,ki,line[i].u,line[i].v);
        if(flag) ans++;
    }
    printf("%d\n",ans);
    return 0;
} 

但是WA了5个点
下面的是不离散化的,只会RE,因为空间的问题

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000000
using namespace std;
int n,m,k,ki=1,ans,flag;
bool book[maxn];
struct node
{
    int x,id,flag;//flag=1表示的是是u  等于2表示的v 
}edge[maxn];
struct NODE
{
    int u,v,id;
}line[maxn];
struct Node
{
    int flag;
}tree[maxn*10];
inline bool cmp(node a,node b) {return a.x<b.x;}
void lsh()
{
    edge[1].flag==1?line[edge[1].id].u=ki:line[edge[1].id].v=ki;
    for(int i=2;i<=k;i++)
    {
        if(edge[i].x!=edge[i-1].x) ki+=2;//贴海报的lsh要使ki有间隔
        edge[i].flag==1?line[edge[i].id].u=ki:line[edge[i].id].v=ki; 
    }
}
void update(int id,int l,int r,int left,int right)
{
    if(tree[id].flag) return ;
    if(l==left && r==right) 
    {
        tree[id].flag=1;
        flag=1; return ;
    }
    int mid=(l+r)/2;
    if(mid>=right) update(id*2,l,mid,left,right);
    else if(mid<left) update(id*2+1,mid+1,r,left,right);
    else update(id*2,l,mid,left,mid),update(id*2+1,mid+1,r,mid+1,right);
    tree[id].flag=(tree[id*2].flag && tree[id*2+1].flag);
}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1,u,v;i<=m;i++)
    {
        scanf("%d %d",&line[i].u,&line[i].v);
    } 
    //sort(edge+1,edge+1+k,cmp);
    //lsh(); 
    for(int i=m;i;i--)
    {
        flag=0;
        update(1,1,n,line[i].u,line[i].v);
        if(flag) ans++;
    }
    printf("%d\n",ans);
    return 0;
} 

by d3ac @ 2019-07-29 16:21:46

有人吗,求求大佬帮帮我


by d3ac @ 2019-07-29 16:28:44

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000000
using namespace std;
int n,m,k,ki=1,ans,flag;
bool book[maxn];
struct node
{
    int x,id,flag;//flag=1表示的是是u  等于2表示的v 
}edge[maxn];
struct NODE
{
    int u,v;
}line[maxn];
struct Node
{
    bool flag;
}tree[maxn*25];
inline bool cmp(node a,node b) {return a.x<b.x;}
void lsh()
{
    edge[1].flag==1?line[edge[1].id].u=ki:line[edge[1].id].v=ki;
    for(int i=2;i<=k;i++)
    {
        if(edge[i].x!=edge[i-1].x) ki+=2;//贴海报的lsh要使ki有间隔
        edge[i].flag==1?line[edge[i].id].u=ki:line[edge[i].id].v=ki; 
    }
}
void update(int id,int l,int r,int left,int right)
{
    if(tree[id].flag) return ;
    if(l==left && r==right) 
    {
        tree[id].flag=1;
        flag=1; return ;
    }
    int mid=(l+r)/2;
    if(mid>=right) update(id*2,l,mid,left,right);
    else if(mid<left) update(id*2+1,mid+1,r,left,right);
    else update(id*2,l,mid,left,mid),update(id*2+1,mid+1,r,mid+1,right);
    tree[id].flag=(tree[id*2].flag && tree[id*2+1].flag);
}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1,u,v;i<=m;i++)
    {
        scanf("%d %d",&line[i].u,&line[i].v);
    } 
    //sort(edge+1,edge+1+k,cmp);
    //lsh(); 
    for(int i=m;i;i--)
    {
        flag=0;
        update(1,1,n,line[i].u,line[i].v);
        if(flag) ans++;
    }
    printf("%d\n",ans);
    return 0;
} 

改成bool 类型强行改过


by 垣根帝督 @ 2020-10-02 15:11:39

详见题解第一篇


|