笛卡尔树+分治+主席输,1~19WA,20AC,求调
查看原帖
笛卡尔树+分治+主席输,1~19WA,20AC,求调
989792
lrx___楼主2024/7/21 19:12
// #define ___coding

#ifdef ___coding
#define ___coding1 true
#else
#define ___coding1 false
#endif
#include<cstdlib>
// #include<cassert>
// #include<cctype>
// #include<climits>
// #include<cmath>
#include<cstdio>
// #include<cstring>
// #include<ctime>
#include<algorithm>
using std::lower_bound;
// using std::max;
// using std::min;
// using std::next_permutation;
// using std::reverse;
using std::sort;
// using std::swap;
using std::unique;
using std::upper_bound;
// #include<bitset>
// using std::bitset;
// #include<deque>
// using std::deque;
// #include<fstream>
// using std::ifstream;
// using std::ofstream;
// #include<iomanip>
// using std::fixed;
// using std::setprecision;
// #include<iostream>
// using std::cin;
// using std::cout;
// using std::ios;
// #include<list>
// using std::list;
// #include<map>
// using std::map;
// #include<queue>
// using std::priority_queue;
// using std::queue;
// #include<stack>
// using std::stack;
// #include<set>
// using std::multiset;
// using std::set;
// #include<sstream>
// using std::stringstream;
// #include<string>
// using std::getline;
// using std::string;
// using std::to_string;
// #include<utility>
// using std::make_pair;
// using std::pair;
// #include<unordered_map>
// using std::unordered_map;
// #include<unordered_set>
// using std::unordered_set;
// #include<vector>
// using std::vector;
#define UP(i,a,b) for(i=a;i<=(b);++i)
#define DN(i,a,b) for(i=a;i>=(b);--i)
#define up(i,a,b) for(i=a;i<(b);++i)
#define dn(i,a,b) for(i=a;i>(b);--i)
#define pr make_pair
typedef unsigned char unc;
typedef unsigned short uns;
typedef unsigned uni;
typedef unsigned long unl;
typedef long long ll;
typedef unsigned long long ull;
const int BUF_SIZE(1<<20);
bool ___f;
char ___c,___a[45],*___p,___ibuf[BUF_SIZE+1],*___ib(___ibuf),*___ie(___ibuf),___obuf[BUF_SIZE+1],*___ob(___obuf),*___oe(___obuf+BUF_SIZE);
char& gtch(){if(___ib==___ie)___ie=(___ib=___ibuf)+fread(___ibuf,1,BUF_SIZE,stdin);if(___ib==___ie){return *___ibuf=-1;}return *___ib++;}
void ___flush(){fwrite(___obuf,1,___ob-___obuf,stdout);___ob=___obuf;}
void ptch(char c){if(___ob==___oe)___flush();*___ob=c;++___ob;}
typedef __int128 pll;
typedef unsigned __int128 upll;
void rd(pll &r){r=0;___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch()){___f=(___c=='-');}for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}if(___f){r=~(r-1);}}
void rd(upll &r){r=0;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}}
void wt(pll r){if(!r){ptch('0');return;}if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(upll r){if(!r){ptch('0');return;}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void rd(bool &r){r=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch()){r|=bool(___c^'0');}}
void rd(char &c){for(c=gtch();c==' '||c=='\r'||c=='\n';c=gtch());}
void rd(short &r){r=0;___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch()){___f=(___c=='-');}for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(short)(___c^'0');}if(___f){r=~(r-1);}}
void rd(int &r){r=0;___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch()){___f=(___c=='-');}for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}if(___f){r=~(r-1);}}
void rd(long &r){r=0;___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch()){___f=(___c=='-');}for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}if(___f){r=~(r-1);}}
void rd(ll &r){r=0;___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch()){___f=(___c=='-');}for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}if(___f){r=~(r-1);}}
void rd(unc &c){for(c=gtch();c==' '||c=='\r'||c=='\n';c=gtch());}
void rd(uns &r){r=0;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(uns)(___c^'0');}}
void rd(uni &r){r=0;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}}
void rd(unl &r){r=0;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}}
void rd(ull &r){r=0;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}}
void rd(char *s){for(*s=gtch();*s==' '||*s=='\r'||*s=='\n';*s=gtch());for(;~*s&&*s!=' '&&*s!='\r'&&*s!='\n';++s,*s=gtch());*s=0;}
void rd(char *s,char n){for(*s=gtch();*s==' '||*s=='\r'||*s=='\n';*s=gtch());for(;~*s&&*s!=n;++s,*s=gtch());*s=0;}
void wt(bool a){ptch('0'+a);}
void wt(char c){ptch(c);}
void wt(short r){if(!r){ptch('0');return;}if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(int r){if(!r){ptch('0');return;}if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(long r){if(!r){ptch('0');return;}if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(ll r){if(!r){ptch('0');return;}if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(unc c){ptch(c);}
void wt(uns r){if(!r){ptch('0');return;}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(uni r){if(!r){ptch('0');return;}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(unl r){if(!r){ptch('0');return;}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(ull r){if(!r){ptch('0');return;}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(char *s){for(;*s;++s){ptch(*s);}}
void wt(const char *s){for(;*s;++s){ptch(*s);}}
template<typename T,typename ...T1>void rd(T &a,T1 &...b){rd(a);rd(b...);}
template<typename T,typename ...T1>void wt(T a,T1 ...b){wt(a);wt(b...);}
template<typename T>void RD(T* a,int n=1){while(n--){rd(*a);++a;}}
ll _llabs(ll a){return a<0?-a:a;}

/*

*/
const int N(1e5+5);
int a[N],b[N],n,ls[N],rs[N],li[N],unq;
struct stack{
  int a[N],*t;
  void push(int k){++t;*t=k;}
  void pop(){--t;}
  int top(){return *t;}
  ull size(){return t-a;}
  void clear(){t=a;}
}s;
struct node{
  int sz;
  node *ls,*rs;
};
struct segment_tree{
  node t[N<<5],*tot,*root[N];
  node* update(int x,node* p,int l=1,int r=unq){
    int mid((l+r)>>1);
    node *u(++tot);
    u->ls=p->ls;u->rs=p->rs;u->sz=p->sz+1;
    if(l==r){
      return u;
    }
    if(x<=mid){
      u->ls=update(x,p->ls,l,mid);
    }else{
      u->rs=update(x,p->rs,mid+1,r);
    }
    return u;
  }
  void build(){
    int i;
    UP(i,1,n){
      root[i]=update(b[i],root[i-1]);
    }
  }
  ll query(int x,node* u,node* v,int l=1,int r=unq){
    int mid((l+r)>>1);
    if(l==r){
      return v->sz-u->sz;
    }
    if(x<=mid){
      return query(x,u->ls,v->ls,l,mid);
    }else{
      return query(x,u->rs,v->rs,mid+1,r)+v->ls->sz-u->ls->sz;
    }
  }
  void clear(){
    tot=t;
    t->ls=t->rs=t;
    root[0]=t;
  }
}tree;

ll dfs(int p,int l,int r){
  int i;
  ll res(0);
  if(l>r)return 0;
  if(p-l<r-p){
    UP(i,l,p){
      res+=tree.query(upper_bound(li+1,li+unq+1,a[p]/a[i])-li-1,tree.root[p-1],tree.root[r]);
    }
  }else{
    UP(i,p,r){
      res+=tree.query(upper_bound(li+1,li+unq+1,a[p]/a[i])-li-1,tree.root[l-1],tree.root[p]);
      // wt("res=",res,"\n");
    }
  }
  // wt("l=",l," r=",r," res=",res,"\n");
  return res+dfs(ls[p],l,p-1)+dfs(rs[p],p+1,r);
}
void main1(){
  int i,last;
  tree.clear();
  s.clear();
  rd(n);
  UP(i,1,n){
    rd(a[i]);
    li[i]=a[i];
  }
  sort(li+1,li+n+1);
  unq=unique(li+1,li+n+1)-(li+1);
  UP(i,1,n){
    b[i]=lower_bound(li+1,li+n+1,a[i])-li;
  }
  tree.clear();
  tree.build();
  // wt("query=",tree.query(2,tree.root[2],tree.root[4]),"\n");
  s.push(0);
  UP(i,1,n){
    while(s.size()>1&&a[i]>a[s.top()]){
      last=s.top();
      ls[i]=last;
      s.pop();
    }
    rs[s.top()]=i;
    s.push(i);
  }
  // UP(i,1,n){
  //   wt("i=",i," ls=",ls[i]," rs=",rs[i],"\n");
  // }
  wt(dfs(rs[0],1,n),'\n');
}
int main(){if(___coding1)freopen("in.txt","r",stdin);main1();___flush();if(___coding1){freopen("CON","r",stdin);system("pause");}return 0;}

2024/7/21 19:12
加载中...