HDU 3577 Fast Arrangement

来源:互联网 发布:淘宝家居装修论坛网 编辑:程序博客网 时间:2024/06/12 01:52
  这题属于数据结构和模拟题,大家要注意的是如果是1 3,那么1,2加一,3并不加,因为3的时候他已经下火车了。(PS:因为这个纠结了好久)。代码中有两个数组,一个是mxs,代表他的儿子的最大值,num代表他自己的次数。
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#define maxn 1000000#define mem(a) memset(a, 0, sizeof(a))using namespace std;int mxs[maxn * 4 + 5], num[maxn * 4 + 5], k, res[maxn + 5];void add(int ll, int rr, int l, int r, int n){     if(ll <= l&&r <= rr)     {         num[n]++;         mxs[n]++;         return ;     }     int mid = (l + r) / 2;     if(ll <= mid)  add(ll, rr, l, mid, n * 2);     if(rr > mid)  add(ll, rr, mid + 1, r, n * 2 + 1);     mxs[n] = max(mxs[n * 2], mxs[n * 2 + 1]) + num[n];}int check(int ll,int rr,int l,int r,int n){    if(ll <= l&&r <= rr)    {        return mxs[n];    }    int mid = (l + r) / 2, nn = 0;    if(ll <= mid)    nn = max(nn, check(ll, rr, l, mid, n * 2));    if(rr > mid)   nn = max(nn, check(ll, rr, mid + 1, r, n * 2 + 1));    return nn + num[n];}int main(){     int t, i, j, q, a, b, cas = 1, w;     scanf("%d",&t);     while(t--)     {         w = 0;         mem(num);         mem(mxs);         scanf("%d%d",&k, &q);         for(i = 1;i <= q;i++)         {              scanf("%d%d",&a, &b);              if(check(a, b - 1, 1, maxn, 1) < k)    {                  res[++w] = i;                  add(a, b - 1, 1, maxn, 1);              }         }         printf("Case %d:\n", cas++);         for(i = 1;i <= w;i++)         {             printf("%d ",res[i]);         }         printf("\n\n");     }     return 0;}

0 0
原创粉丝点击