題目來源
洛谷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;
}