求助卡常
查看原帖
求助卡常
404961
baiABCiBaraki545楼主2023/5/1 22:10

目前可以卡进 800ms

求卡常/dk

#include <bits/stdc++.h>
#define siz 633
typedef long long ll;
#define EOL putchar('\n')
#define getchar() (bp1==bp2&&(bp2=(bp1=buf)+fread(buf,1,fast_io,stdin),bp1==bp2)?EOF:*bp1++)
#define putchar(x) (bp3-obuf<fast_io?0:(fwrite(obuf,1,fast_io,stdout),bp3=obuf),*bp3++=(x))
#define END (fwrite(obuf,1,bp3-obuf,stdout),exit(0))
const int fast_io = 15000003;
char buf[fast_io], obuf[fast_io], *bp1 = buf, *bp2 = buf, *bp3 = obuf;
void rd(ll &x)
{
    int ch; x = 0;
    while(isspace(ch=getchar()));
    if(ch == EOF) return;
    do x = ch-'0'+x*10; while(isdigit(ch=getchar()));
}
void rd(int &x)
{
    int ch; x = 0;
    while(isspace(ch=getchar()));
    if(ch == EOF) return;
    do x = ch-'0'+x*10; while(isdigit(ch=getchar()));
}
void pt(ll x)
{
    if(x>9)pt(x/10);
    putchar(x%10+'0');
}
struct Node {
   int val, pos;
   bool operator < (const Node &rhs) const { return val < rhs.val; }
} b2[100011];
int p[100011], n, B, N, L[333], R[333], bel[100011], bi[100011], i, j, len, k, pos;
int pre[100011], suf[100011], b21[100011], b22[100011];
ll f[333][100011], d[333][333];
inline void add(int k, int d)
{//cout<<k<<endl;
   for(; k <= n; k += k&-k) bi[k] += d;
}
inline int ask(int k)
{//cout<<k<<endl;
   int ans = 0; for(; k; k &= k-1) ans += bi[k];
   return ans;
}
void init()
{
   B = std::min(siz, n);
   L[1] = N = 1; R[1] = B;
   while(R[N] < n) { L[N+1] = R[N]+1; R[N+1] = std::min(n, R[N]+B); ++N; }
   for(i = 1; i <= n; i += 8)
   {
      b2[i] = (Node) { p[i], i };
      b2[i+1] = (Node) { p[i+1], i+1 };
      b2[i+2] = (Node) { p[i+2], i+2 };
      b2[i+3] = (Node) { p[i+3], i+3 };
      b2[i+4] = (Node) { p[i+4], i+4 };
      b2[i+5] = (Node) { p[i+5], i+5 };
      b2[i+6] = (Node) { p[i+6], i+6 };
      b2[i+7] = (Node) { p[i+7], i+7 };
   }
   for(i = 1; i <= N; ++i)
   {
      std::sort(b2+L[i], b2+R[i]+1);
      for(j = L[i]; j <= R[i]; ++j) bel[j] = i, b21[j] = b2[j].val, b22[j] = b2[j].pos;
      int x = 0;
      for(j = L[i]; j <= R[i]; ++j) { add(p[j], 1); pre[j] = x += ask(n)-ask(p[j]); }
      d[i][i] = x;
      for(j = L[i]; j <= R[i]; ++j) { add(p[j], -1); suf[j] = x; x -= ask(p[j]); }
   }
   std::sort(b2+1, b2+n+1);
   for(i = 1; i <= N; ++i)
   {
      for(j = 1, pos = L[i]; j <= n; ++j)
      {
         while(pos <= R[i] && b21[pos] < j) ++pos;
         const int id = b2[j].pos;
         if(id < L[i]) f[i][id] += pos-L[i];
         else if(id > R[i]) f[i][id] += R[i]+1-pos-(pos<=R[i]&&b21[pos]==j);
      }
   }
   for(i = 1; i <= N; ++i)
      for(j = 2; j <= n; j += 8)
      {
         f[i][j] += f[i][j-1];
         f[i][j+1] += f[i][j];
         f[i][j+2] += f[i][j+1];
         f[i][j+3] += f[i][j+2];
         f[i][j+4] += f[i][j+3];
         f[i][j+5] += f[i][j+4];
         f[i][j+6] += f[i][j+5];
         f[i][j+7] += f[i][j+6];
      }
   for(int len = 1; len < N; ++len)
      for(i = 1; i+len <= N; i += 8)
      {
         j = i+len; d[i][j] = d[i][j-1]+d[i+1][j]-d[i+1][j-1]+f[j][R[i]]-f[j][L[i]-1];
         d[i+1][j+1] = d[i+1][j  ]+d[i+2][j+1]-d[i+2][j  ]+f[j+1][R[i+1]]-f[j+1][L[i+1]-1];
         d[i+2][j+2] = d[i+2][j+1]+d[i+3][j+2]-d[i+3][j+1]+f[j+2][R[i+2]]-f[j+2][L[i+2]-1];
         d[i+3][j+3] = d[i+3][j+2]+d[i+4][j+3]-d[i+4][j+2]+f[j+3][R[i+3]]-f[j+3][L[i+3]-1];
         d[i+4][j+4] = d[i+4][j+3]+d[i+5][j+4]-d[i+5][j+3]+f[j+4][R[i+4]]-f[j+4][L[i+4]-1];
         d[i+5][j+5] = d[i+5][j+4]+d[i+6][j+5]-d[i+6][j+4]+f[j+5][R[i+5]]-f[j+5][L[i+5]-1];
         d[i+6][j+6] = d[i+6][j+5]+d[i+7][j+6]-d[i+7][j+5]+f[j+6][R[i+6]]-f[j+6][L[i+6]-1];
         d[i+7][j+7] = d[i+7][j+6]+d[i+8][j+7]-d[i+8][j+6]+f[j+7][R[i+7]]-f[j+7][L[i+7]-1];
      }
}
int t1[100011], t2[100011], cnt1, cnt2;
inline int merg(int *a, int n, int *b, int m)
{
   int p = 0, q = 0, ans = 0;
   while(q < m)
   {
      while(p < n && a[p] < b[q]) ++p;
      ans += n-p;
      ++q;
      if(p == n) break;
   }
   return ans;
}
ll query(const int l, const int r)
{
   const int x = bel[l], y = bel[r];
   if(x == y)
   {
      cnt1 = cnt2 = 0;
      for(i = L[x]; i <= R[x]; i += 8)
      {
         b22[i]<l&&(t1[++cnt1]=b21[i])||(b22[i]<=r&&(t2[++cnt2]=b21[i]));
         i+1<=R[x]&&(b22[i+1]<l&&(t1[++cnt1]=b21[i+1])||(b22[i+1]<=r&&(t2[++cnt2]=b21[i+1])));
         i+2<=R[x]&&(b22[i+2]<l&&(t1[++cnt1]=b21[i+2])||(b22[i+2]<=r&&(t2[++cnt2]=b21[i+2])));
         i+3<=R[x]&&(b22[i+3]<l&&(t1[++cnt1]=b21[i+3])||(b22[i+3]<=r&&(t2[++cnt2]=b21[i+3])));
         i+4<=R[x]&&(b22[i+4]<l&&(t1[++cnt1]=b21[i+4])||(b22[i+4]<=r&&(t2[++cnt2]=b21[i+4])));
         i+5<=R[x]&&(b22[i+5]<l&&(t1[++cnt1]=b21[i+5])||(b22[i+5]<=r&&(t2[++cnt2]=b21[i+5])));
         i+6<=R[x]&&(b22[i+6]<l&&(t1[++cnt1]=b21[i+6])||(b22[i+6]<=r&&(t2[++cnt2]=b21[i+6])));
         i+7<=R[x]&&(b22[i+7]<l&&(t1[++cnt1]=b21[i+7])||(b22[i+7]<=r&&(t2[++cnt2]=b21[i+7])));
      }
      return pre[r]-(l==L[x]?0:pre[l-1])-merg(t1+1, cnt1, t2+1, cnt2);
   }
   long long ans = suf[l]+pre[r]+d[x+1][y-1];
   for(i = x+1; i < y; i += 8)
   {
      i < y && (ans += f[i][r]-f[i][L[y]-1]+f[i][R[x]]-f[i][l-1]);
      i+1 < y && (ans += f[i+1][r]-f[i+1][L[y]-1]+f[i+1][R[x]]-f[i+1][l-1]);
      i+2 < y && (ans += f[i+2][r]-f[i+2][L[y]-1]+f[i+2][R[x]]-f[i+2][l-1]);
      i+3 < y && (ans += f[i+3][r]-f[i+3][L[y]-1]+f[i+3][R[x]]-f[i+3][l-1]);
      i+4 < y && (ans += f[i+4][r]-f[i+4][L[y]-1]+f[i+4][R[x]]-f[i+4][l-1]);
      i+5 < y && (ans += f[i+5][r]-f[i+5][L[y]-1]+f[i+5][R[x]]-f[i+5][l-1]);
      i+6 < y && (ans += f[i+6][r]-f[i+6][L[y]-1]+f[i+6][R[x]]-f[i+6][l-1]);
      i+7 < y && (ans += f[i+7][r]-f[i+7][L[y]-1]+f[i+7][R[x]]-f[i+7][l-1]);
   }
   cnt1 = cnt2 = 0;
   for(i = L[x]; i <= R[x]; i += 8)
   {
      b22[i] >= l && (t1[++cnt1] = b21[i]);
      i+1 <= R[x] && b22[i+1] >= l && (t1[++cnt1] = b21[i+1]);
      i+2 <= R[x] && b22[i+2] >= l && (t1[++cnt1] = b21[i+2]);
      i+3 <= R[x] && b22[i+3] >= l && (t1[++cnt1] = b21[i+3]);
      i+4 <= R[x] && b22[i+4] >= l && (t1[++cnt1] = b21[i+4]);
      i+5 <= R[x] && b22[i+5] >= l && (t1[++cnt1] = b21[i+5]);
      i+6 <= R[x] && b22[i+6] >= l && (t1[++cnt1] = b21[i+6]);
      i+7 <= R[x] && b22[i+7] >= l && (t1[++cnt1] = b21[i+7]);
   }
   for(i = L[y]; i <= R[y]; i += 8)
   {
      b22[i] <= r && (t2[++cnt2] = b21[i]);
      i+1 <= R[y] && b22[i+1] <= r && (t2[++cnt2] = b21[i+1]);
      i+2 <= R[y] && b22[i+2] <= r && (t2[++cnt2] = b21[i+2]);
      i+3 <= R[y] && b22[i+3] <= r && (t2[++cnt2] = b21[i+3]);
      i+4 <= R[y] && b22[i+4] <= r && (t2[++cnt2] = b21[i+4]);
      i+5 <= R[y] && b22[i+5] <= r && (t2[++cnt2] = b21[i+5]);
      i+6 <= R[y] && b22[i+6] <= r && (t2[++cnt2] = b21[i+6]);
      i+7 <= R[y] && b22[i+7] <= r && (t2[++cnt2] = b21[i+7]);
   }
   return ans+merg(t1+1, cnt1, t2+1, cnt2);
}
signed main()
{
   int m; ll lastans = 0; rd(n); rd(m);
   for(int i = 1; i <= n; ++i)
      rd(p[i]);
   init();
   while(m--)
   {
      ll l, r; rd(l); rd(r);
      l ^= lastans; r ^= lastans;
      pt(lastans = query(l, r)); EOL;
   }
   END;
}
2023/5/1 22:10
加载中...