题目来源
洛谷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;
}