luogu 3488 [POI2009]LYZ-Ice Skates 线段树 + 思维

水深无声 2021-11-17 16:16 208阅读 0赞

Code:

  1. #include <bits/stdc++.h>
  2. #define setIO(s) freopen(s".in","r",stdin), freopen(s".out","w",stdout)
  3. #define maxn 1000000
  4. #define ll long long
  5. #define lson (now<<1)
  6. #define rson ((now<<1)|1)
  7. using namespace std;
  8. int n,m;
  9. ll k,d;
  10. ll sum[maxn<<2],lmx[maxn<<2],rmx[maxn<<2],mx[maxn<<2];
  11. void pushup(int l,int r,int now) {
  12. int mid=(l+r)>>1,ls=lson,rs=(r>mid)?rson:0;
  13. sum[now]=sum[ls]+sum[rs];
  14. lmx[now]=max(lmx[ls],sum[ls]+lmx[rs]);
  15. rmx[now]=max(rmx[rs],sum[rs]+rmx[ls]);
  16. mx[now]=rmx[ls]+lmx[rs];
  17. mx[now]=max(mx[now], max(mx[ls], mx[rs]));
  18. }
  19. void build(int l,int r,int now) {
  20. if(l==r) {
  21. sum[now]=-k;
  22. return ;
  23. }
  24. int mid=(l+r)>>1;
  25. build(l,mid,lson);
  26. if(r>mid) build(mid+1,r,rson);
  27. pushup(l,r,now);
  28. }
  29. void update(int l,int r,int now,int x,ll v) {
  30. if(l==r) {
  31. sum[now]+=v;
  32. lmx[now]=rmx[now]=mx[now]=max(0ll, sum[now]);
  33. return;
  34. }
  35. int mid=(l+r)>>1;
  36. if(x<=mid) update(l,mid,lson,x,v);
  37. else update(mid+1,r,rson,x,v);
  38. pushup(l,r,now);
  39. }
  40. int main() {
  41. // setIO("input");
  42. scanf("%d%d%lld%lld",&n,&m,&k,&d);
  43. build(1,n,1);
  44. for(int i=1;i<=m;++i) {
  45. int r;
  46. ll x;
  47. scanf("%d%lld",&r,&x);
  48. update(1,n,1,r,x);
  49. if(mx[1] > k*d) printf("NIE\n");
  50. else printf("TAK\n");
  51. }
  52. return 0;
  53. }

  

转载于:https://www.cnblogs.com/guangheli/p/11231718.html

发表评论

表情:
评论列表 (有 0 条评论,208人围观)

还没有评论,来说两句吧...

相关阅读