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

本文介绍了使用bitset高效解决洛谷1276题——校门外的树(增强版)的方法。通过模拟挖树和种树操作,利用bitset的count()方法计算剩余树的数量,从而找出树苗的数量。代码实现采用C++,在处理过程中注意了去重操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源

洛谷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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值