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 }
  • 相关阅读:
    java Activiti 工作流引擎 SSM 框架模块设计方案
    自定义表单 Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    数据库设计的十个最佳实践
    activiti 汉化 stencilset.json 文件内容
    JAVA oa 办公系统模块 设计方案
    java 考试系统 在线学习 视频直播 人脸识别 springboot框架 前后分离 PC和手机端
    集成 nacos注册中心配置使用
    “感恩节 ”怼记
    仓颉编程语言的一点期望
    关于System.out.println()与System.out.print("\n")的区别
  • 原文地址:https://www.cnblogs.com/bombe1013/p/5078822.html
Copyright © 2011-2022 走看看