Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:贪心AC,树状数组+并查集维护In Reply To:贪心AC,树状数组+并查集维护 Posted by:Ink213 at 2015-04-29 16:55:02 > #include <algorithm> > #include <cstring> > #include <cstdio> > #include <map> > using namespace std; > int a[63005]; > int lowbit(int x) > { > return x&(-x); > } > void upd(int x) > { > while(x <= 60000){ > ++a[x]; > x += lowbit(x); > } > } > int query(int x) > { > int ret = 0; > while(x){ > ret += a[x]; > x -= lowbit(x); > } > return ret; > } > struct OP > { > int a, b, c; > } op[63005]; > int fa[63005]; > bool cmp(OP x,OP y) > { > if(x.b == y.b) return x.a < y.a; > return x.b < y.b; > } > int fd(int x) > { > if(fa[x] == x) return x; > return fa[x] = fd(fa[x]); > } > int main() > { > int i, j, n; > while(~scanf("%d",&n)){ > for(i=0; i<n; ++i){ > scanf("%d%d%d",&op[i].a,&op[i].b,&op[i].c); > } > for(i=0; i<=60000; ++i) fa[i] = i; > int ans = 0; > sort(op, op+n, cmp); > memset(a, 0, sizeof(a)); > for(i=0; i<n; ++i){ > ++op[i].a; > ++op[i].b; > int it; > int cur = query(op[i].b) - query(op[i].a-1); > if(cur < op[i].c){ > op[i].c -= cur; > for(j=op[i].b; op[i].c; --op[i].c, ++ans){ > it = fd(j); > upd(it); > fa[it] = it-1; > j = it-1; > } > } > } > printf("%d\n",ans); > } > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator