bitset+暴力——校门外的树(增强版)

来源:互联网 发布:python 周期性任务 编辑:程序博客网 时间:2024/05/21 22:29

题目来源

洛谷1276校门外的树(增强版)

https://www.luogu.org/problem/show?pid=1276


思路

bitset大法好!

洛谷的数据水我会说吗?!

纯模拟就好了:)

g[i]记录经过包括挖和种的操作后i位置的状态(是否有树)

k[i]记录经过挖操作后i位置的状态

g.count()为剩下的包括树苗和原树的树的个数

k.count()为剩下的原树的个数

g.count()-k.count()即为剩下的树苗的个数

如果i位置没有树且正要种树苗 标记i点k[i]为1

砍树时 如果当前点i的g[i]为1(有树)且k[i]为1(为树苗)

则该点为种上又被砍掉的树苗 记录该点(num[++top]=i)

由于num数组中可能有相同位置的树苗被砍多次 而我们只求位置数

所以我们要去重!unique大法好!


代码(C++)

#include <cstdio>#include <bitset>#include <algorithm>using namespace std;int l,m,x,y,w,cnt=0,num[1000010];bitset<10010> g,k,c;int main(){    scanf("%d%d",&l,&m);    for(int i=0;i<=l;++i)    g[i]=1,k[i]=1;    for(int i=1;i<=m;++i)    {    scanf("%d%d%d",&w,&x,&y);    if(w==1)    {    for(int j=x;j<=y;++j)    {    if(g[j]==0)    c[j]=1;    g[j]=1;    }    }    else    {for(int j=x;j<=y;++j)    {    if(g[j]==1&&c[j]==1)    num[++cnt]=j;    g[j]=0;k[j]=0;    }    }    }    printf("%d\n",g.count()-k.count());    printf("%d",unique(num+1,num+cnt)-&num[0]);    return 0;}


原创粉丝点击