Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
27852 | LYLAKIOIAKIOI | 【S】T2 区间 | C++ | 运行超时 | 90 | 1092 MS | 29964 KB | 2556 | 2024-03-31 11:45:50 |
#include<bits/stdc++.h> #define jp8 push_back #define ls p*2 #define rs p*2+1 #define mid (l+r)/2 using namespace std; const int N=1e6+20; int n;int x;int a[N]; struct seg{ int vl; int tg;int ln; }t[N<<2]; void pu(int p){ t[p].vl=t[ls].vl+t[rs].vl; t[p].ln=t[ls].ln+t[rs].ln; }void pd(int p){ //f1 if(t[p].tg==1){ t[ls].tg=1;t[rs].tg=1; t[ls].vl=t[ls].ln;t[rs].vl=t[rs].ln; t[p].tg=0; }//f0 if(t[p].tg==2){ t[ls].tg=2;t[rs].tg=2; t[ls].vl=0;t[rs].vl=0; t[p].tg=0; } }void bd(int p,int l,int r){ if(l==r) { t[p].ln=1;return ; } bd(ls,l,mid);bd(rs,mid+1,r); pu(p); }void upd(int p,int l,int r,int pl,int pr,int op){ if(pl<=l&&r<=pr){ t[p].tg=op; if(op==1) t[p].vl=t[p].ln; if(op==2) t[p].vl=0; return ; }pd(p); if(pl<=mid) upd(ls,l,mid,pl,pr,op); if(pr>mid) upd(rs,mid+1,r,pl,pr,op); pu(p); }int qry(int p,int l,int r,int pl,int pr){ if(pl<=l&&r<=pr){ return t[p].vl; }pd(p); int res=0; if(pl<=mid) res+=qry(ls,l,mid,pl,pr); if(pr>mid) res+=qry(rs,mid+1,r,pl,pr); return res; } struct qj{ int vl,l,r; }; qj st[N][3]; int it[3]; int INF=1e9+10; void ph(qj a,int op){ st[++it[op]][op]=a; }void pp(int op){ it[op]--; } int main(){ cin>>n>>x; for(int i=1;i<=n;i++) cin>>a[i]; //0-mx 1-mn //1-f1 2-f0 long long ans=0;bd(1,1,n); if(a[1]+a[1]==x) ans++,upd(1,1,n,1,1,1); ph((qj){a[1],1,1},0);ph((qj){a[1],1,1},1); for(int i=2;i<=n;i++){ int sc=0; int l1=i,l2=i; if(a[i]*2==x) upd(1,1,n,i,i,1); while(it[0]!=0){ if(st[it[0]][0].vl<=a[i]){ l1=st[it[0]][0].l; pp(0); }else break; }ph((qj){a[i],l1,i},0); while(it[1]!=0){ if(st[it[1]][1].vl>=a[i]){ l2=st[it[1]][1].l; pp(1); }else break; }ph((qj){a[i],l2,i},1); if(l1<l2) sc=1; else sc=2; int ll=min(l1,l2); upd(1,1,n,ll,i,2); if(sc==1){ qj Q=st[it[0]][0]; int T=x-Q.vl; int l=1,r=it[1]; while(l<r){ if(st[mid][1].vl<T) l=mid+1; else r=mid; }if(st[l][1].vl==T){ int lp=max(Q.l,st[l][1].l); int rp=min(Q.r,st[l][1].r); //cout<<Q.l<<' '<<st[l][1].l<<' '; //cout<<lp<<' '<<rp<<endl; if(lp<=rp) upd(1,1,n,lp,rp,1); } }if(sc==2){ qj Q=st[it[1]][1]; int T=x-Q.vl; int l=1,r=it[0]; while(l<r){ if(st[mid][0].vl>T) l=mid+1; else r=mid; }if(st[l][0].vl==T){ int lp=max(Q.l,st[l][0].l); int rp=min(Q.r,st[l][0].r); if(lp<=rp) upd(1,1,n,lp,rp,1); } }ans+=qry(1,1,n,1,n); //cout<<ans<<endl; }cout<<ans; }