【洛谷1267】校门外的树

cdcq

2018-02-18 12:40:53

Solution

现在连基础简单题都一点都写不动了…… 原题: 校门外马路上本来从编号0到L,每一编号的位置都有1棵树。有砍树者每次从编号A到B处连续砍掉每1棵树,就连树苗也不放过(记 0 A B ,含A和B);幸运的是还有植树者每次从编号C到D 中凡是空穴(树被砍且还没种上树苗或树苗又被砍掉)的地方都补种上树苗(记 1 C D,含C和D);问最终校门外留下的树苗多少棵?植树者种上又被砍掉的树苗有多少棵? L <= 10000,N <= 100 刚开始想线段树,怎么都想不出优美的做法 因为一个巨坑的地方是第二个子问题要求已经种过又被拔掉的个数…… 最后的想法是开两个线段树,一个记录树的个数,另一个记录有没有被拔过 然后开写之前看了一眼题解,发现了这道题的核心 l\*n<=1e6 。。。。。。。。 看数据范围啊看数据范围啊看数据范围啊啊啊 看完数据范围再想题,这种关键的问题都忘了…… 行吧行吧直接暴力就行了 暴力能水过就懒得写线段树了,就这样吧 \_(:з」∠)\_ 代码: ```cpp #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int rd(){int z=0,mk=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')mk=-1; ch=getchar();} while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0'; ch=getchar();} return z*mk; } int n,m; int flg[11000],flg2[11000]; int cnt=0; int main(){//freopen("ddd.in","r",stdin); cin>>n>>m; int mk,l,r; for(int i=0;i<=n;++i) flg[i]=-1,flg2[i]=false; while(m --> 0){ mk=rd(),l=rd(),r=rd(); for(int i=l;i<=r;++i){ if(!mk) cnt+=(flg2[i] & (flg[i]!=0)); flg2[i] |= (mk ^ 1); if(!flg[i] || !mk) flg[i]=mk; } } int bwl=0; for(int i=0;i<=n;++i) bwl+=(flg[i]==1); cout<<bwl<<endl<<cnt<<endl; return 0; } ```