zoukankan      html  css  js  c++  java
  • 【HDOJ】2430 Beans

    这题目用线段树超时了,其实也差不多应该超时。10^6大数据量。看了一下网上的解法是单调队列。大概了解了一下,是个挺有意思的数据结构。
    首先,需要求满足0<=(S[r]-S[l])%p<=k时,(S[r]-S[l])的最大值。
    由于S[r]>=S[l],因此即求S[r]%p-k <= S[l]%p <= S[r]%p的最优解。
    单调队列可解,按S[i]%p和i排列,每次固定r,求最优的l值,l在队头。

      1 /* 2430 */
      2 #include <iostream>
      3 #include <sstream>
      4 #include <string>
      5 #include <map>
      6 #include <queue>
      7 #include <set>
      8 #include <stack>
      9 #include <vector>
     10 #include <deque>
     11 #include <algorithm>
     12 #include <cstdio>
     13 #include <cmath>
     14 #include <ctime>
     15 #include <cstring>
     16 #include <climits>
     17 #include <cctype>
     18 #include <cassert>
     19 #include <functional>
     20 #include <iterator>
     21 #include <iomanip>
     22 using namespace std;
     23 //#pragma comment(linker,"/STACK:102400000,1024000")
     24 
     25 #define sti                set<int>
     26 #define stpii            set<pair<int, int> >
     27 #define mpii            map<int,int>
     28 #define vi                vector<int>
     29 #define pii                pair<int,int>
     30 #define vpii            vector<pair<int,int> >
     31 #define rep(i, a, n)     for (int i=a;i<n;++i)
     32 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
     33 #define clr                clear
     34 #define pb                 push_back
     35 #define mp                 make_pair
     36 #define fir                first
     37 #define sec                second
     38 #define all(x)             (x).begin(),(x).end()
     39 #define SZ(x)             ((int)(x).size())
     40 #define lson            l, mid, rt<<1
     41 #define rson            mid+1, r, rt<<1|1
     42 
     43 typedef struct node_t {
     44     int q, p;
     45     
     46     node_t() {}
     47     node_t(int q, int p):
     48         q(q), p(p) {}
     49     
     50     friend bool operator< (const node_t& a, const node_t& b) {
     51         if (a.q == b.q)
     52             return a.p < b.p;
     53         return a.q < b.q;
     54     }
     55         
     56 } node_t;
     57 
     58 const int maxn = 1e6+5;
     59 int a[maxn];
     60 __int64 sum[maxn];
     61 node_t nd[maxn];
     62 int n, p, k;
     63 int Q[maxn];
     64 __int64 ans;
     65 
     66 void solve() {
     67     int l = 1, r = 0;
     68     __int64 tmp;
     69     ans = -1;
     70     
     71     rep(i, 0, n+1) {
     72         while (l<=r && nd[i].p < nd[Q[r]].p)
     73             --r;
     74         Q[++r] = i;
     75         while (l<=r && (nd[i].q - nd[Q[l]].q) > k)
     76             ++l;
     77         if (l >= r)
     78             continue;
     79         tmp = sum[nd[i].p] - sum[nd[Q[l]].p];
     80         ans = max(ans, tmp/p);
     81     }
     82 }
     83 
     84 int main() {
     85     ios::sync_with_stdio(false);
     86     #ifndef ONLINE_JUDGE
     87         freopen("data.in", "r", stdin);
     88         freopen("data.out", "w", stdout);
     89     #endif
     90     
     91     int t;
     92     
     93     scanf("%d", &t);
     94     rep(tt, 1, t+1) {
     95         scanf("%d %d %d", &n, &p, &k);
     96         nd[0].p = nd[0].q = 0;
     97         sum[0] = 0;
     98         rep(i, 1, n+1) {
     99             scanf("%d", &a[i]);
    100             sum[i] = sum[i-1] + a[i];
    101             nd[i].p = i;
    102             nd[i].q = sum[i] % p;
    103         }
    104         sort(nd, nd+n+1);
    105         solve();
    106         printf("Case %d: %I64d
    ", tt, ans);
    107     }
    108     
    109     #ifndef ONLINE_JUDGE
    110         printf("time = %d.
    ", (int)clock());
    111     #endif
    112     
    113     return 0;
    114 }
  • 相关阅读:
    自定义TypeConverter把基础类型转换为复杂类型
    自学MVC看这里——全网最全ASP.NET MVC 教程汇总
    C#枚举器接口IEnumerator的实现
    nopCommerce架构分析系列(二)数据Cache
    NET下三种缓存机制(Winform里面的缓存使用 )
    【RequireJS--API学习笔记】
    Linux文件的所有权与权限
    ftp服务及其实现之vsftpd
    计算机传输层端口分类
    命令:tr
  • 原文地址:https://www.cnblogs.com/bombe1013/p/5078822.html
Copyright © 2011-2022 走看看