zoukankan      html  css  js  c++  java
  • bzoj4358 premu

    题目链接

    莫队算法

    没有用线段树,而是看了showson的并查集%%%

     1 #include<algorithm>
     2 #include<iostream>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<string>
     7 #include<cmath>
     8 #include<ctime>
     9 #include<queue>
    10 #include<stack>
    11 #include<map>
    12 #include<set>
    13 #define rre(i,r,l) for(int i=(r);i>=(l);i--)
    14 #define re(i,l,r) for(int i=(l);i<=(r);i++)
    15 #define Clear(a,b) memset(a,b,sizeof(a))
    16 #define inout(x) printf("%d",(x))
    17 #define douin(x) scanf("%lf",&x)
    18 #define strin(x) scanf("%s",(x))
    19 #define LLin(x) scanf("%lld",&x)
    20 #define op operator
    21 #define CSC main
    22 typedef unsigned long long ULL;
    23 typedef const int cint;
    24 typedef long long LL;
    25 using namespace std;
    26 void inin(int &ret)
    27 {
    28     ret=0;int f=0;char ch=getchar();
    29     while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
    30     while(ch>='0'&&ch<='9')ret*=10,ret+=ch-'0',ch=getchar();
    31     ret=f?-ret:ret;
    32 }
    33 int n,m,a[50050],wei[50050],temp;
    34 int fa[50050],s[50050],bo[50050],pos[50050],sta[50050],top,ANS[50050];
    35 struct que
    36 {
    37     int l,r,id;
    38     void in(int i){inin(l),inin(r),id=i;}
    39     bool op < (const que &rhs)const {return wei[l]==wei[rhs.l]?r<rhs.r:l<rhs.l;}
    40 }q[50050];
    41 int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
    42 void merge(int x,int y)
    43 {
    44     x=find(x),y=find(y);
    45     if(x==y)return ;
    46     s[x]+=s[y];
    47     temp=max(temp,s[x]);
    48     fa[y]=x;
    49 }
    50 void init()
    51 {
    52     re(i,1,n)fa[i]=i,s[i]=0;
    53     temp=1;    
    54 }
    55 void add(int x)
    56 {
    57     bo[x]=1;
    58     s[x]=1;
    59     if(bo[x-1])merge(x-1,x);
    60     if(bo[x+1])merge(x,x+1);
    61 }
    62 int main()
    63 {
    64     inin(n);inin(m);
    65     int nn=sqrt(n);
    66     re(i,1,n)inin(a[i]),wei[i]=(i-1)/nn+1,pos[a[i]]=i;
    67     re(i,1,m)q[i].in(i);
    68     sort(q+1,q+m+1);
    69     int r=0;
    70     re(i,1,m)
    71     {
    72         if(i==1||wei[q[i].l]!=wei[q[i-1].l])
    73         {
    74             Clear(bo,0);Clear(s,0);
    75             init(),top=0;
    76             int head=(q[i].l-1)/nn*nn+1;
    77             r=min(head+nn-1,n);
    78             re(j,head,r)sta[++top]=a[j];
    79             sort(sta+1,sta+top+1);
    80         }
    81         while(r<q[i].r)add(a[++r]);
    82         int ans=temp,nl=1,nr=0;
    83         re(j,1,top)
    84         {
    85             int c=sta[j];
    86             if(pos[c]<q[i].l||pos[c]>q[i].r)continue;
    87             if(c==nr+1)nr+=s[find(c+1)]+1;
    88             else 
    89             {
    90                 ans=max(ans,nr-nl+1);
    91                 nl=c-s[find(c-1)];
    92                 nr=c+s[find(c+1)];
    93             }
    94         }
    95         ANS[q[i].id]=max(ans,nr-nl+1);
    96     }
    97     re(i,1,m)printf("%d
    ",ANS[i]);
    98      return 0;
    99 }
  • 相关阅读:
    叨叨叨
    四舍五入VS银行家舍入
    是雏还是鹰&mdash;&mdash;编程规范之变量命名
    .Net下二进制形式的文件(图片)的存储与读取(原创)
    asp.net中<%%>形式的用法(原创)
    让Hashtable支持自定义排序(原创)
    .NET下的迭代器(Iterator)模式
    本地视频播放-ios
    cocos2dx srand(time(NULL))重新设置一个随机种子
    cocos2dx 游戏重置方法
  • 原文地址:https://www.cnblogs.com/HugeGun/p/5240797.html
Copyright © 2011-2022 走看看