【51Nod】1275 连续子段的差异 单调队列

来源:互联网 发布:打不开网络共享文件夹 编辑:程序博客网 时间:2024/06/06 20:42

看见宇峰dalao在做这道题

就勉强凑了一波

一次AC

爽  : )


C++
15 ms
2048 KB
Accepted
2017/10/27
19:39:13
80
#10 ms 2024 KB Accepted  
#20 ms 2024 KB Accepted  
#30 ms 2024 KB Accepted  
#415 ms 2024 KB Accepted  
#50 ms 2024 KB Accepted  
#615 ms 2024 KB Accepted  
#715 ms 2024 KB Accepted  
#815 ms 2024 KB Accepted  
#90 ms 2024 KB Accepted  
#100 ms 2024 KB Accepted  
 
#110 ms 2024 KB Accepted  
#1215 ms 2040 KB Accepted  
#130 ms 2036 KB Accepted  
#1415 ms 2048 KB Accepted  
#150 ms 2040 KB Accepted  
#1615 ms 2040 KB Accepted  
#170 ms 2048 KB Accepted  
#1815 ms 2024 KB Accepted  
#1915 ms 2024 KB Accepted  
#200 ms 2048 KB Accepted  


#include <cstdio>#include <deque>#include <cstdlib>#include <algorithm>#define C (c=nc())using namespace std;typedef pair<long long,long long> pii;deque<pii>plus,minus;long long n,k,ans,q,l;inline char nc(void){static char ch[100010],*p1=ch,*p2=ch;return p1==p2&&(p2=(p1=ch)+fread(ch,1,100010,stdin),p1==p2)?EOF:*p1++;}inline void read(long long &n){static char c;long long f=1;n=0;C;while (c<'0'||c>'9') c=='-'?f=-1,C:C;while (c>='0'&&c<='9') n=(n<<3)+(n<<1)+c-48,C;return (void)(n*=f);}int main(void){read(n),read(k);read(q);plus.push_back(make_pair(q,1)),minus.push_back(make_pair(q,1));ans=l=1;register long long i;for (i=2;i<=n;++i){read(q);while (!plus.empty()&&plus.back().first>q) plus.pop_back();while (!minus.empty()&&minus.back().first<q) minus.pop_back();plus.push_back(make_pair(q,i)),minus.push_back(make_pair(q,i));while (abs(plus.front().first-minus.front().first)>k){long long del=min(plus.front().second,minus.front().second);if (plus.front().second==del) plus.pop_front();if (minus.front().second==del) minus.pop_front();l=del+1;}ans+=i-l+1;}printf("%d\n",ans);return 0;}




阅读全文
0 0