zoukankan      html  css  js  c++  java
  • HDU 4267

    A Simple Problem with Integers

    Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 323 Accepted Submission(s): 133


    Problem Description
    Let A1, A2, ... , AN be N elements. You need to deal with two kinds of operations. One type of operation is to add a given number to a few numbers in a given interval. The other is to query the value of some element.
     
    Input
    There are a lot of test cases.
    The first line contains an integer N. (1 <= N <= 50000)
    The second line contains N numbers which are the initial values of A1, A2, ... , AN. (-10,000,000 <= the initial value of Ai <= 10,000,000)
    The third line contains an integer Q. (1 <= Q <= 50000)
    Each of the following Q lines represents an operation.
    "1 a b k c" means adding c to each of Ai which satisfies a <= i <= b and (i - a) % k == 0. (1 <= a <= b <= N, 1 <= k <= 10, -1,000 <= c <= 1,000)
    "2 a" means querying the value of Aa. (1 <= a <= N)
     
    Output
    For each test case, output several lines to answer all query operations.
     
    Sample Input
    4 1 1 1 1 14 2 1 2 2 2 3 2 4 1 2 3 1 2 2 1 2 2 2 3 2 4 1 1 4 2 1 2 1 2 2 2 3 2 4
     
    Sample Output
    1 1 1 1 1 3 3 1 2 3 4 1
     1 //原来我用插点问线做的,输出sum(temp) - sum(temp-1),一直tle 
     2 #include <stdio.h>
     3 #include <iostream>
     4 #include<string.h>
     5 using namespace std;
     6 
     7 const int MAXD = 50010;
     8 int N, M, d[100][MAXD], a[MAXD];
     9 
    10 void insert(int k, int x, int v)
    11 {
    12      for(; x <= N; x += x & -x) 
    13           d[k][x] += v;
    14 }
    15 
    16 void init()
    17 {
    18     int i, j;
    19      for(i = 1; i <= N; i ++)
    20           cin>>a[i];
    21      for(i = 0; i < 100; i ++) 
    22           memset(d[i], 0, sizeof(d[i][0]) * (N + 1));
    23 }
    24 
    25 int query(int id)
    26 {
    27     int i, k, x, ans = 0;
    28     for(i = 1; i <= 10; i ++)
    29     {
    30         k = (i - 1) * 10 + id % i;
    31         for(x = id; x > 0; x -= x & -x) 
    32           ans += d[k][x];
    33     }
    34     return a[id] + ans;
    35 }
    36 
    37 void solve()
    38 {
    39     int i, flag,temp;
    40     int a, b, k, c;
    41     cin>>M;
    42     while(M--)
    43     {
    44         cin>>flag;
    45         if(flag == 1)
    46         {
    47             cin>>a>>b>>k>>c;
    48             b -= (b - a) % k;
    49             insert(10 * (k - 1) + a % k, a, c);
    50             if(b < N) insert(10 * (k - 1) + b % k, b + 1, -c);
    51         }
    52         else if(flag == 2)
    53         {
    54             cin>>temp;
    55             cout<<query(temp)<<endl;
    56         }
    57     }
    58 }
    59 
    60 int main()
    61 {
    62     while(cin>>N)
    63     {
    64         init();
    65         solve();
    66     }
    67     return 0;
    68 }
  • 相关阅读:
    .Net Micro Framework中文讨论组
    .Net Micro Framework 4.0正式开源
    php论坛学习的一个遍历的问题(学习) 简单
    Visual C++ 2008入门经典 第十章标准模板库(二) 简单
    PHP类型转换&&类型强制转换 简单
    Visual C++ 2008入门经典 第九章练习题 简单
    Visual C++ 2008入门经典 第十章标准模板库 简单
    PHP服务端推送技术Long Polling 简单
    Visual C++ 2008入门经典 第九章类的继承和虚函数(三) 简单
    正则表达式学习一 简单
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2677226.html
Copyright © 2011-2022 走看看