90pts求调第三个数据点RE了(悬一关)

P1886 滑动窗口 /【模板】单调队列

xuhrrr @ 2024-03-01 18:29:52

代码如下:

#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <deque>
using namespace std;
struct node{
    long long x,id;
};
node a[1000005];
deque <node> q1,q2;
int n,k;
int main()
{
    cin >> n >> k;
    for(int i = 1 ; i <= n ; ++i){
        cin >> a[i].x;
        a[i].id = i;
    }
    for(int i = 1 ; i <= k ; ++i){
        if(q1.empty()){
            q1.push_back(a[i]);
        }
        else{
            while(!q1.empty() && q1.back().x > a[i].x){
                q1.pop_back();
            }
            q1.push_back(a[i]);
        }
    }
    cout << q1.front().x << " ";
    for(int i = k + 1,j = 2 ; i <= n ; ++i,++j){
        while(q1.front().id < j){
            q1.pop_front();    
        }
        if(q1.empty()){
            q1.push_back(a[i]);
        }
        else{
            while(!q1.empty() && q1.back().x > a[i].x){
                q1.pop_back();
            }
            q1.push_back(a[i]);
        }
        cout << q1.front().x << " ";
    }
    cout << endl;
    for(int i = 1 ; i <= k ; ++i){
        if(q2.empty()){
            q2.push_back(a[i]);
        }
        else{
            while(!q2.empty() && q2.back().x < a[i].x){
                q2.pop_back();
            }
            q2.push_back(a[i]);
        }
    }
    cout << q2.front().x << " ";
    for(int i = k + 1,j = 2 ; i <= n ; ++i,++j){
        while(q2.front().id < j){
            q2.pop_front();    
        }
        if(q2.empty()){
            q2.push_back(a[i]);
        }
        else{
            while(!q2.empty() && q2.back().x < a[i].x){
                q2.pop_back();
            }
            q2.push_back(a[i]);
        }
        cout << q2.front().x << " ";
    }
    return 0;
}

by xuhrrr @ 2024-03-01 18:30:33

第三个点数据是100 1 780 -645 296 985 957 -342 -47 29 540 654 -28 226 -596 -868 921 -849 -613 -655 946 941 -139 650 -682 682 184 321 -356 611 -349 -21 -481 -524 36 501 -49 -39 176 366 -61 51 -977 356 835 618 -378 -353 -26 825 -165 590 384 -702 281 425 905 909 -377 -358 283 -660 -40 920 79 -809 331 658 -394 656 -63 -626 -180 -322 356 -341 575 282 -17 177 852 553 -609 -727 386 45 149 439 -815 422 -844 466 259 242 -176 -338 -106 -874 354 -668 -834 -860


by __Cby___ @ 2024-03-01 19:24:44

//#include <iostream>
//#include <queue>
//using namespace std;
//struct node {
//  int x, y, dis;
//};
//queue<node> q[10], p[10];
//int a[10];
//char mp[1025][1025];
//int dx[4] = { -1,0,1,0};
//int dy[4] = { 0,1,0,-1 };
//int cl[10];
//int n, m, k;
//bool check(int x, int y) {
//  if (x<1 || y<1 || x>n || y>m)return 0;
//  return 1;
//}
//int main() {
//  cin >> n >> m >> k;
//  for (int i = 1; i <= k; i++)cin >> a[i];
//  int tt = 0;
//  for (int i = 1; i <= n; i++) {
//      for (int j = 1; j <= m; j++) {
//          cin >> mp[i][j];
//          if (mp[i][j] >= '0' && mp[i][j] <= '9') {
//              cl[mp[i][j] - '0']++;
//              p[mp[i][j] - '0'].push({ i,j,0 });
//          }
//          if (mp[i][j] == '.')tt++;
//      }
//  }
//  int i = 1;
//  int cnt = 0;
//  while (1) {
//      q[i] = p[i];
//      //cout << 112 << endl;
//      while (!p[i].empty())p[i].pop();
//      while (!q[i].empty()) {
//          node t = q[i].front();
//          q[i].pop();
//          //cout << t.x << " " << t.y <<" "<<t.dis << endl;
//      /*  for (int i = 1; i <= n; i++) {
//              for (int j = 1; j <= m; j++) {
//                  cout << mp[i][j] << " ";
//              }
//              cout << endl;
//          }*/
//          if (t.dis == a[i]) {
//              p[i].push({t.x, t.y,0});
//              continue;
//          }
//          for (int u = 0; u < 4; u++) {
//              int wx = t.x + dx[u];
//              int wy = t.y + dy[u];
//              if (!check(wx, wy))continue;
//              if (mp[wx][wy] == '.') {
//              //cout << mp[wx][wy] << endl;
//                  cl[i]++;
//                  tt--;
//                  q[i].push({ wx,wy,t.dis + 1 });
//                  mp[wx][wy] = i+'0';
//                  if (!tt)break;
//              }
//          }
//      }
//      if (!tt)break;
//      i = i % k + 1;
//      cnt++;
//      //cout << i << endl;
//      if (cnt >= 10000025)break;
//  }
//  for (int i = 1; i <= k; i++) {
//      cout << cl[i] << " ";
//  }
//  cout << endl;
//  return 0;
//}
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <deque>
using namespace std;
struct node {
    long long x, id;
};
node a[1000005];
deque <node> q1, q2;
int n, k;
int main()
{
    cin >> n >> k;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i].x;
        a[i].id = i;
    }
    for (int i = 1; i <= k; ++i) {
        if (q1.empty()) {
            q1.push_back(a[i]);
        }
        else {
            while (!q1.empty() && q1.back().x > a[i].x) {
                q1.pop_back();
            }
            q1.push_back(a[i]);
        }
    }
    cout << q1.front().x << " ";
    for (int i = k + 1, j = 2; i <= n; ++i, ++j) {
        while (!q1.empty() && q1.front().id < j) {
            q1.pop_front();
        }
        if (q1.empty()) {
            q1.push_back(a[i]);
        }
        else {
            while (!q1.empty() && q1.back().x > a[i].x) {
                q1.pop_back();
            }
            q1.push_back(a[i]);
        }
        cout << q1.front().x << " ";
    }
    cout << endl;
    for (int i = 1; i <= k; ++i) {
        if (q2.empty()) {
            q2.push_back(a[i]);
        }
        else {
            while (!q2.empty() && q2.back().x < a[i].x) {
                q2.pop_back();
            }
            q2.push_back(a[i]);
        }
    }
    cout << q2.front().x << " ";
    for (int i = k + 1, j = 2; i <= n; ++i, ++j) {
        while (!q2.empty() && q2.front().id < j) {
            q2.pop_front();
        }
        if (q2.empty()) {
            q2.push_back(a[i]);
        }
        else {
            while (!q2.empty() && q2.back().x < a[i].x) {
                q2.pop_back();
            }
            q2.push_back(a[i]);
        }
        cout << q2.front().x << " ";
    }
    return 0;
}

by __Cby___ @ 2024-03-01 19:24:59

@xuhrrr 这个是正确的


by __Cby___ @ 2024-03-01 19:25:45

while (q1.front().id < j) {
   q1.pop_front();
}

变成

while (!q1.empty() && q1.front().id < j) {
   q1.pop_front();
}

by __Cby___ @ 2024-03-01 19:26:44

while (q2.front().id < j) {
   q2.pop_front();
}

变成

while (!q2.empty() && q2.front().id < j) {
   q2.pop_front();
}

by __Cby___ @ 2024-03-01 19:27:14

不然访问 空队列的元素会 RE


by xuhrrr @ 2024-03-01 19:41:56

@__Cby___ 谢谢大佬,确实没注意到为空的情况


|