bitset+暴力——校門外的樹(增強版)

Louise_Z發表於2017-10-12

題目來源

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


相關文章