SDOI2018:原题识别

题解:

https://files.cnblogs.com/files/clrs97/old-solution.pdf

Code:

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010,M=1010,E=5500000,BUF=10000000,OUT=10000000;
unsigned int SA,SB,SC;
int Case,n,p,m,lim,X,i,j,k,op,x,y,a[N],g[N],nxt[N],st[N],en[N],dfn,s[N<<1],q[N];
int b[M],cb,f[M][M],ga[N<<1],gq[N<<1],vl[E],vr[E],w[E],NXT[E],ED;
ll ans[N<<1],bit[N<<1],bitx[N<<1],bity[N<<1],bitxy[N<<1];
char Buf[BUF],*buf=Buf,Out[OUT],*ou=Out;int Outn[30],Outcnt;
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
inline void read(unsigned int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
inline void write(ll x){
  if(!x)*ou++=48;
  else{
    for(Outcnt=0;x;x/=10)Outn[++Outcnt]=x%10+48;
    while(Outcnt)*ou++=Outn[Outcnt--];
  }
}
inline void writeln(ll x){write(x);*ou++=‘\n‘;}
inline unsigned int rng61(){
  SA^=SA<<16;
  SA^=SA>>5;
  SA^=SA<<1;
  unsigned int t=SA;
  SA=SB;
  SB=SC;
  SC^=t^SA;
  return SC;
}
inline void addedge(int x,int y){nxt[y]=g[x];g[x]=y;}
inline void add(int&x,int l,int r,int z){vl[++ED]=l;vr[ED]=r;w[ED]=z;NXT[ED]=x;x=ED;}
void dfs(int x){
  lim=st[x]=++dfn;
  s[dfn]=1;
  for(int i=g[x];i;i=nxt[i])dfs(i);
  en[x]=++dfn;
  s[dfn]=-1;
}
inline bool cmp(int x,int y){return a[x]<a[y];}
inline void initrect(){
  int _=0,i,j;
  sort(b+1,b+cb+1);
  for(i=1;i<=cb;i++)if(b[i]!=b[i-1])b[++_]=b[i];
  cb=_;
  for(i=1;i<=cb;i++)for(j=1;j<=cb;j++)f[i][j]=0;
}
inline void maketag(int xl,int xr,int yl,int yr,int p){
  xl=lower_bound(b,b+cb+1,xl-1)-b+1;
  xr=lower_bound(b,b+cb+1,xr)-b+1;
  yl=lower_bound(b,b+cb+1,yl-1)-b+1;
  yr=lower_bound(b,b+cb+1,yr)-b+1;
  f[xl][yl]+=p;
  f[xl][yr]-=p;
  f[xr][yl]-=p;
  f[xr][yr]+=p;
}
inline void getrect(){
  int i,j;
  for(i=1;i<=cb;i++)for(j=1;j<=cb;j++){
    f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
    if(f[i][j]){
      add(ga[b[i-1]+1],b[j-1]+1,b[j],1);
      add(ga[b[i]+1],b[j-1]+1,b[j],-1);
    }
  }
}
inline void solve(int x,int mode){
  if(mode==0){
    b[++cb]=st[x]-1;
    b[++cb]=en[x];
    for(int i=g[x];i;i=nxt[i]){
      b[++cb]=st[i]-1;
      b[++cb]=en[i];
    }
  }else{
    maketag(st[x],en[x],1,lim,1);
    maketag(1,lim,st[x],en[x],1);
    for(int i=g[x];i;i=nxt[i])maketag(st[i],en[i],st[i],en[i],-2);
  }
}
inline void ins(int y,int p){
  ll B=1LL*s[X-1]*p,C=1LL*s[y-1]*p,D=1LL*s[X-1]*s[y-1]*p;
  for(;y<=lim;y+=y&-y){
    bit[y]+=p;
    bitx[y]+=B;
    bity[y]+=C;
    bitxy[y]+=D;
  }
}
inline ll ask(int y){
  ll A=0,B=0,C=0,D=0;int o=y;
  for(;y;y-=y&-y){
    A+=bit[y];
    B+=bitx[y];
    C+=bity[y];
    D+=bitxy[y];
  }
  return A*s[X]*s[o]-B*s[o]-C*s[X]+D;
}
void work(){
  read(n),read(p),read(SA),read(SB),read(SC);
  for(i=1;i<=n;i++)g[i]=0;
  for(i=1;i<=n+n;i++)ga[i]=gq[i]=bit[i]=bitx[i]=bity[i]=bitxy[i]=0;
  dfn=ED=0;
  for(i=2;i<=p;i++)addedge(i-1,i);
  for(i=p+1;i<=n;i++)addedge(rng61()%(i-1)+1,i);
  for(i=1;i<=n;i++)a[i]=rng61()%n+1;
  dfs(1);
  for(i=1;i<=lim;i++)s[i]+=s[i-1];
  for(i=1;i<=n;i++){
    q[i]=i;
    if(en[i]>lim)en[i]=lim;
  }
  sort(q+1,q+n+1,cmp);
  for(i=1;i<=n;i=j){
    b[0]=0;
    b[cb=1]=lim;
    for(j=i;j<=n&&a[q[i]]==a[q[j]];j++)solve(q[j],0);
    initrect();
    for(k=i;k<j;k++)solve(q[k],1);
    getrect();
  }
  read(m);
  for(i=1;i<=m;i++){
    read(op),read(x),read(y);
    ans[i]=0;
    int xl,xr,yl,yr;
    if(op==1){
      xl=xr=st[x];
      yl=yr=st[y];
    }else{
      xl=1,xr=st[x];
      yl=1,yr=st[y];
    }
    add(gq[xl-1],yl,yr,-i);
    add(gq[xr],yl,yr,i);
  }
  for(X=1;X<=lim;X++){
    for(j=ga[X];j;j=NXT[j]){
      ins(vl[j],w[j]);
      ins(vr[j]+1,-w[j]);
    }
    for(j=gq[X];j;j=NXT[j]){
      k=w[j];
      if(k>0)ans[k]+=ask(vr[j])-ask(vl[j]-1);
      else ans[-k]-=ask(vr[j])-ask(vl[j]-1);
    }
  }
  for(i=1;i<=m;i++)writeln(ans[i]);
}
int main(){
  fread(Buf,1,BUF,stdin);
  read(Case);
  while(Case--)work();
  fwrite(Out,1,ou-Out,stdout);
  return 0;
}

  

原文地址:https://www.cnblogs.com/clrs97/p/9064632.html

时间: 2024-08-30 10:21:29

SDOI2018:原题识别的相关文章

#LOJ2564 SDOI2018 原题识别 主席树

转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/9057297.html 原题链接: 今天考试考了前天的SDOI考题 天啊我菜爆,只有T2拿了30分 然后考试后半程一直在打T1 觉得考试思路很有意思,于是就顺着打下来了 个人感觉这个是$O(nlogn^{2})$的,但是在loj上我比claris的程序快了1s多,只不过编程复杂度不止翻倍啊…… 下面介绍一下我的解法 其实最早启发我的是链上的部分分 定义$pre_{i}$为i前面最近的和i同色的点的下标,我们把

sdut 2413:n a^o7 !(第三届山东省省赛原题,水题,字符串处理)

n a^o7 ! Time Limit: 1000MS Memory limit: 65536K 题目描述 All brave and intelligent fighters, next you will step into a distinctive battleground which is full of sweet and happiness. If you want to win the battle, you must do warm-up according to my inst

sdut 2411:Pixel density(第三届山东省省赛原题,字符串处理)

Pixel density Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Pixels per inch (PPI) or pixel density is a measurement of the resolution of devices in various contexts; typically computer displays, image scanners, and digital camera image s

sdut 2416:Fruit Ninja II(第三届山东省省赛原题,数学题)

Fruit Ninja II Time Limit: 5000MS Memory limit: 65536K 题目描述 Have you ever played a popular game named "Fruit Ninja"?Fruit Ninja (known as Fruit Ninja HD on the iPad and Fruit Ninja THD for Nvidia Tegra 2 based Android devices) is a video game de

sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)

Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Several days ago, a beast caught a beautiful princess and the princess was put in prison. To rescue the princess, a prince who wanted to marry the princess set out immedia

(各个公司面试原题)在线做了一套CC++综合测试题,也来测一下你的水平吧(二)

刚才把最后的10道题又看了下,也发上来吧. 下面给出试题,和我对题目的一些理解 前10道题地址 (各个公司面试原题)在线做了一套CC++综合测试题,也来测一下你的水平吧(一) 11.设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为? C c; void main() { A*pa=new A(); B b; static D d; delete pa; } A.    A B C D B.    A B D C C.   A C D B D.   A C B D 答案:

WEB服务器搭建(作业)没有原题只是结果

WEB服务器搭建(作业)没有原题只是结果

浅谈《剑指offer》原题:求1+2+……+n

<剑指offer>上的一道原题,求1+2+--+n,要求不能使用乘除法,for.while.if.else.switch.case等关键字以及条件判断语句(a?b:c). 第一次看到这道题大约有一年的时间了,在霸笔网易的时候,当时我就晕了...心想这是神马东西,后来发现这是原题!!然后后悔自己没看过书了... <剑指offer>上给出了不错的解法,但是这里有个解法更巧妙,虽然技术含量不高,但是可以参考,这就是<程序员面试笔试宝典>中所给出的答案. 解法一:利用宏定义求解

NOIP2010原题考试总结

这一次考试真的是--了.第一题送分题只拿了30分,就是因为题读错了(又是题读错了),真的是遇得到,被老师骂的--,然后T2是做过的原题当然没有什么好说的做对了,T3就详见我的T3的博文了,哎T4同上.又是满是问题的考试,之前的问题没有解决的表现-- 版权声明:请随意转载O(∩_∩)O