• 【HDOJ】4267 A Simple Problem with Integers


    树状数组。Easy.

      1 /* 4267 */
      2 #include <iostream>
      3 #include <string>
      4 #include <map>
      5 #include <queue>
      6 #include <set>
      7 #include <stack>
      8 #include <vector>
      9 #include <deque>
     10 #include <algorithm>
     11 #include <cstdio>
     12 #include <cmath>
     13 #include <ctime>
     14 #include <cstring>
     15 #include <climits>
     16 #include <cctype>
     17 #include <cassert>
     18 #include <functional>
     19 #include <iterator>
     20 #include <iomanip>
     21 using namespace std;
     22 //#pragma comment(linker,"/STACK:102400000,1024000")
     23 
     24 #define sti                set<int>
     25 #define stpii            set<pair<int, int> >
     26 #define mpii            map<int,int>
     27 #define vi                vector<int>
     28 #define pii                pair<int,int>
     29 #define vpii            vector<pair<int,int> >
     30 #define rep(i, a, n)     for (int i=a;i<n;++i)
     31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
     32 #define clr                clear
     33 #define pb                 push_back
     34 #define mp                 make_pair
     35 #define fir                first
     36 #define sec                second
     37 #define all(x)             (x).begin(),(x).end()
     38 #define SZ(x)             ((int)(x).size())
     39 #define lson            l, mid, rt<<1
     40 #define rson            mid+1, r, rt<<1|1
     41 
     42 const int maxn = 50005;
     43 const int maxm = 55;
     44 int n;
     45 
     46 
     47 inline int lowest(int x) {
     48     return -x & x;
     49 }
     50 
     51 typedef struct arr_t {
     52     int s[maxn];
     53     
     54     void clr() {
     55         memset(s, 0, sizeof(s));
     56     }
     57     
     58     void update(int x, int delta) {
     59         while (x <= n) {
     60             s[x] += delta;
     61             x += lowest(x);
     62         }
     63     }
     64     
     65     int sum(int x) {
     66         int ret = 0;
     67         
     68         while (x) {
     69             ret += s[x];
     70             x -= lowest(x);
     71         }
     72         return ret;
     73     }
     74 } arr_t;
     75 
     76 arr_t ts[maxm];
     77 int A[maxn], M[11][maxn];
     78 int ID[11][11];
     79 
     80 void init_() {
     81     int cnt = 0;
     82     
     83     rep(i, 1, 11) {
     84         rep(j, 0, i) {
     85             ID[i][j] = cnt++;
     86         }
     87     }
     88     
     89     rep(i, 1, 11) {
     90         int k = i-1;
     91         rep(j, 1, maxn) {
     92             M[k][j] = M[k][j-1] + 1;
     93             if (M[k][j] == i)
     94                 M[k][j] = 0;
     95         }
     96     }
     97 }
     98 
     99 void init() {
    100     rep(i, 0, maxm)
    101         ts[i].clr();
    102 }
    103 
    104 void update(int a, int b, int k, int delta) {
    105     int from = a;
    106     int to = a+(b-a)/k*k;
    107     int findex = (from+k-1)/k;
    108     int tindex = (to+k-1)/k;
    109     int id = ID[k][a%k];
    110     
    111     ts[id].update(findex, delta);
    112     ts[id].update(tindex+1, -delta);
    113 }
    114 
    115 int sum(int x) {
    116     int id, index, delta;
    117     int ret = 0;
    118     
    119     rep(i, 1, 11) {
    120         index = (x+i-1)/i;
    121         id = ID[i][M[i-1][x]];
    122         delta = ts[id].sum(index);
    123         ret += delta;
    124     }
    125     return ret;
    126 }
    127 
    128 int main() {
    129     ios::sync_with_stdio(false);
    130     #ifndef ONLINE_JUDGE
    131         freopen("data.in", "r", stdin);
    132         freopen("data.out", "w", stdout);
    133     #endif
    134     
    135     int type;
    136     int a, b, k, c;
    137     int q;
    138     int ans;
    139     
    140     init_();
    141     while (scanf("%d", &n)!=EOF) {
    142         rep(i, 1, n+1)
    143             scanf("%d", &A[i]);
    144         init();
    145         scanf("%d", &q);
    146         while (q--) {
    147             scanf("%d %d", &type, &a);
    148             if (type == 1) {
    149                 scanf("%d %d %d", &b, &k, &c);
    150                 update(a, b, k, c);
    151             } else {
    152                 ans = sum(a) + A[a];
    153                 printf("%d
    ", ans);
    154             }
    155         }
    156     }
    157     
    158     #ifndef ONLINE_JUDGE
    159         printf("time = %d.
    ", (int)clock());
    160     #endif
    161     
    162     return 0;
    163 }
  • 相关阅读:
    Oracle 提示 用户在线,无法删除的清理方法
    拉格朗日乘子法和KKT条件
    主题模型及其在文本情感分析中的应用
    spring-data-elasticsearch整合elasticsearch
    自然数的K次幂的数列求和
    SVM 简要推导过程
    机器学习中导数最优化方法(基础篇)
    漫谈:机器学习中距离和相似性度量方法
    A geometric interpretation of the covariance matrix
    数据挖掘算法之协同过滤算法
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4962925.html
Copyright © 2020-2023  润新知