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
详见题解第一篇