zoukankan      html  css  js  c++  java
  • codeforces 469B Chat Online 解题报告

    题目链接:http://codeforces.com/problemset/problem/469/B

    题目意思:给出 Little Z 的上线时间段,分别是[a1, b1], [a2, b2],...,[ap, bp] (bi < ai + 1) ,以及 Little X的上线时间段,不过他的上线时间段需要依赖 t,也就是上线时间段为[c1+t, d1+t],[c2+t, d2+t],...,[cq+t, dq+t](dj < cj + 1 )。问从[l, r] 中 选择 t,使得 X 与 Z 两个人上线的时间至少有一个时刻的数量有多少个。(这些区间段都包括边界点!)

       思路就是用一个vis[]数组把 Z 的上线时间段全部标记为1,然后对于 X 的所有时间段,通过 + x( l <= x <= r)来判断是否已经被标记过,是的话就说明 x 这个点是可选的,可纳入答案范围内。

        比赛的时候其实是有这个思路的,但是怕超时就不敢写,然后一直纠结...纠结......纠结(1000*50*1000:[l,r] * q * [cj, dj] ),想不到确实可以这样做,后悔死了~~~

        赛后做发现有一个小小的要注意的地方,从test 4 那里可以看出,判断 vis 时有可能超出1000,所以vis 数组要开到2000以上!!!否则memset初始化不到1000以外的数据,导致初始值不明确,以致最后的判断可能会有误!!!

       

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 const int maxn = 1000 + 10;
     8 int vis[2*maxn];   // ci+x, di+x (l<= x <=r)有可能超出1000,所以要开大点
     9 int c[maxn], d[maxn];
    10 
    11 int main()
    12 {
    13     int p, q, l, r, a, b;
    14   //  freopen("in.txt", "r", stdin);
    15 
    16     while (scanf("%d%d%d%d", &p, &q, &l, &r) != EOF)
    17     {
    18         memset(vis, 0, sizeof(vis));
    19         for (int i = 0; i < p; i++)
    20         {
    21             scanf("%d%d", &a, &b);
    22             for (int j = a; j <= b; j++)
    23                 vis[j] = 1;
    24         }
    25         for (int i = 0; i < q; i++)
    26             scanf("%d%d", &c[i], &d[i]);
    27 
    28         int ans = 0;
    29         for (int k = l; k <= r; k++)
    30         {
    31              int flag = 0;
    32              for (int i = 0; i < q && !flag; i++)
    33              {
    34                  for (int j = c[i]+k; j <= d[i]+k && !flag; j++)
    35                  {
    36                     if (vis[j])  // 如果vis大小是1000,if判断中写成vis[i] = 1是错误的,注意注意!!!
    37                     {
    38                         flag = 1;
    39                         break;
    40                     }
    41                 }
    42             }
    43             if (flag)
    44                 ans++;
    45         }
    46         printf("%d
    ", ans);
    47     }
    48     return 0;
    49 }
    View Code
  • 相关阅读:
    UVa 10474
    UVa 1339
    UVa 1368
    UVa 1585
    UVa 1586
    ACM中Java高效输入输出封装
    Ajax中Get请求与Post请求的区别
    AJAX——核心XMLHttpRequest对象
    PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
    PHP类方法重写原则
  • 原文地址:https://www.cnblogs.com/windysai/p/3984013.html
Copyright © 2011-2022 走看看