[求助]我人傻常数大吗?O(n)单调队列只有80分

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

Terrasse @ 2018-07-18 19:46:04

#include<iostream>
#define MAXN 1000010
using namespace std;
int q[MAXN],idq[MAXN],idp[MAXN],p[MAXN];//分别是min队列、max队列及其中元素的序号
int ans[MAXN],ql=0,qr=-1,pl=0,pr=-1,n=0,k=0;//ql、qr是q队列的左端点、右端点,p队列同理
int main()
{
  int i=1,a=0;
  ios::sync_with_stdio(0);
  cin>>n>>k;
  for(i=1;i<=n;i++)
  {
    cin>>a;
    for(;qr>=ql && q[qr]>=a;qr--);
    q[++qr]=a;
    idq[qr]=i;
    if(idq[ql]+k==i)
    {
      ql++;
    }
    for(;pr>=pl && p[pr]<=a;pr--);
    p[++pr]=a;
    idp[pr]=i;
    if(idp[pl]+k==i)
    {
      pl++;
    }
    if(i<k)
    {
      continue;
    }
    cout<<q[ql]<<' ';
    ans[i]=p[pl];//max与min同时计算,留到最后输出
  }
  cout<<endl;
  for(i=k;i<=n;i++)
  {
    cout<<ans[i]<<' ';
  }
  cout<<endl;
  return 0;
}

大佬们请不要嫌弃蒟蒻的码风,帮忙看看怎么优化吧、、原则上不打算开O(2),毕竟NOIP不允许。


by Llf0703 @ 2018-07-18 19:47:17

@冰河世纪_朱 使用快读啊


by Terrasse @ 2018-07-18 19:58:11

@Llf0703 这。。有600ms左右时间费在读入上啊、、从今天起正式入坑快读


by colazcy @ 2018-07-18 20:15:55

这题可以氧气线段树强行怼过(逃


by tocek_shiki @ 2018-07-18 20:48:41

@冰河世纪_朱 不一定要快读啊

你可以在main函数里加上一句

ios::sync_with_stdio(false)


by Terrasse @ 2018-07-19 09:41:10

@fff团666 本来就加了的,,请看第九行,完全比不上快读。。


by Terrasse @ 2018-07-19 09:42:08

@colazcy 想过线段树,主要是想试试O(n)算法


by tocek_shiki @ 2018-07-19 18:13:12

@冰河世纪_朱 有趣。。。

看来再也不能用cin了


by Terrasse @ 2018-07-19 18:33:01

@fff团666 是啊,以后我看到100W个以上的数就会想到快读了。


by tocek_shiki @ 2018-07-19 19:13:48

@冰河世纪_朱 手写read了解一下


by Terrasse @ 2018-07-19 19:18:15

@fff团666 啊?没听懂。。read()除了手写还能怎么?


| 下一页