首页 > 代码库 > luogu P1047 校门外的树(我只会做这个难度的题啦p_q
luogu P1047 校门外的树(我只会做这个难度的题啦p_q
传送门
代码:
#include<bits/stdc++.h>using namespace std;#define maxn 1000000int n,m,x,y,z,ans;struct TreeType{ int l,r,f,w;}tree[maxn<<2];void tree_up(int k) { tree[k].w=tree[k<<1|1].w+tree[k<<1].w; }void tree_down(int k){ tree[k<<1].f+=tree[k].f; tree[k<<1|1].f+=tree[k].f; tree[k<<1].w+=(tree[k<<1].r-tree[k<<1].l+1)*tree[k<<1].f; tree[k<<1|1].w+=(tree[k<<1|1].r-tree[k<<1|1].l+1)*tree[k<<1|1].f; tree[k].f=0; }void tree_build(int l,int r,int k){ tree[k].l=l; tree[k].r=r; if(l==r) { tree[k].w=1; return ; } int mid=(tree[k].l+tree[k].r)>>1; tree_build(l,mid,k<<1); tree_build(mid+1,r,k<<1|1); tree_up(k);}void tree_change(int l,int r,int k,int x){ if(tree[k].l==l&&tree[k].r==r) { tree[k].w+=(tree[k].r-tree[k].l+1)*x; tree[k].f+=x; tree_down(k); return ; } if(tree[k].f) tree_down(k); int mid=(tree[k].l+tree[k].r)>>1; if(l>mid) tree_change(l,r,k<<1|1,x); else if(r<=mid) tree_change(l,r,k<<1,x); else { tree_change(l,mid,k<<1,x); tree_change(mid+1,r,k<<1|1,x); }}int tree_find(int k,int to){ if(tree[k].l==tree[k].r) return tree[k].w; if(tree[k].f) tree_down(k); int mid=(tree[k].r+tree[k].l)/2; if(to>mid) return tree_find(k*2+1,to); else return tree_find(k*2,to);}int main(){ scanf("%d%d",&n,&m); tree_build(0,n,1); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); tree_change(x,y,1,-1); } for(int i=0;i<=n;i++) if(tree_find(1,i)>0) ans++; cout<<ans; return 0;}
luogu P1047 校门外的树(我只会做这个难度的题啦p_q
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。