zoukankan      html  css  js  c++  java
  • BZOJ 3809Gty的二逼妹子序列 解题报告+data marker

                                  --BZOJ

    http://www.lydsy.com/JudgeOnline/problem.php?id=3809



    考虑对l,r跑莫队,对一组维护美丽度出现次数的桶修改,

    然后把桶序列用分块维护查询

    然后是吐槽:

    内存28M,哦,这个题居然卡内存。。。。。

    卡内存!!!

    然后我就为本校的权限号贡献了三次MLE......

    代码:

     1 #include<cstdio>
     2 #include<cmath>
     3 #include<algorithm>
     4 using std::sort;
     5 struct ss{
     6     int l,r,a,b,num;
     7 }x[1000010];
     8 int n,m,cut;
     9 int tong[100005];
    10 int id[100005];
    11 int mark[400];
    12 int a[100005];
    13 int ans[1000010];
    14 bool cmp(ss a,ss b){
    15     if(id[a.l]==id[b.l])
    16         return a.r<b.r;
    17     return id[a.l]<id[b.l];
    18 }
    19 inline void in(int &ans)
    20 {
    21     ans=0;bool p=false;char ch=getchar();
    22     while((ch>'9' || ch<'0')&&ch!='-') ch=getchar();
    23     if(ch=='-') p=true,ch=getchar();
    24     while(ch<='9'&&ch>='0') ans=ans*10+ch-'0',ch=getchar();
    25     if(p) ans=-ans;
    26 }
    27 void modui();
    28 int fin_brick(int l,int r);
    29 int main()
    30 {
    31     int i,j,k;
    32     in(n),in(m);
    33     cut=(int)sqrt(n);
    34     if(cut*cut<n)cut++;
    35     for(i=1;i<=n;i++)
    36         in(a[i]);
    37     for(i=1;i<=m;i++)
    38         in(x[i].l),in(x[i].r),in(x[i].a),in(x[i].b),x[i].num=i;
    39     for(i=1;i<=n;i++)
    40         id[i]=i/cut;
    41     sort(x+1,x+m+1,cmp);
    42     modui();
    43     for(i=1;i<=m;i++)
    44         printf("%d
    ",ans[i]);
    45     return 0;
    46 }
    47 void modui(){
    48     int l_p=x[1].l,r_p=x[1].l-1,i;
    49     for(i=1;i<=m;i++){
    50         while(r_p<x[i].r){
    51             r_p++;
    52             if(!tong[a[r_p]])
    53                 mark[a[r_p]/cut]++;
    54             tong[a[r_p]]++;
    55         }
    56         while(r_p>x[i].r){
    57             tong[a[r_p]]--;
    58             if(!tong[a[r_p]])
    59                 mark[a[r_p]/cut]--;
    60             r_p--;
    61         }
    62         while(l_p>x[i].l){
    63             l_p--;
    64             if(!tong[a[l_p]])
    65                 mark[a[l_p]/cut]++;
    66             tong[a[l_p]]++;
    67         }
    68         while(l_p<x[i].l){
    69             tong[a[l_p]]--;
    70             if(!tong[a[l_p]])
    71                 mark[a[l_p]/cut]--;
    72             l_p++;
    73         }
    74         ans[x[i].num]=fin_brick(x[i].a,x[i].b);
    75     }
    76 }
    77 int fin_brick(int l,int r){
    78     int b_l=l/cut,b_r=r/cut,ll=l%cut,rr=r%cut;
    79     int i,j,ans=0;
    80     if(b_l==b_r){
    81         for(i=l;i<=r;i++)
    82             if(tong[i])
    83                 ans++;
    84         return ans;
    85     }
    86     for(i=ll,j=l;i<=cut-1;i++,j++)
    87         if(tong[j])
    88             ans++;
    89     for(i=rr,j=r;i>=0;i--,j--)
    90         if(tong[j])
    91             ans++;
    92     b_l++;b_r--;
    93     for(i=b_l;i<=b_r;i++)
    94         ans+=mark[i];
    95     return ans;
    96 }
    #include<cstdio>
    #include<cstdlib>
    #include<ctime>
    using namespace std;
    int main()
    {
        srand(time(0));
        int n=100000,m=1000000;
        int i;
        printf("%d %d
    ",n,m);
        for(i=1;i<=n;i++)
            printf("%d ",rand()%n+1);
        printf("
    ");
        for(i=1;i<=m;i++){
            int l=rand()%n+1,a=rand()%n+1;
            int r=l+rand()%(n-l+1),b=a+rand()%(n-a+1);
            printf("%d %d %d %d
    ",l,r,a,b);
        }
    }
    data_maker

    祝AC

  • 相关阅读:
    .NET 正则表达式使用高级技巧之替换类介绍
    道法术器势
    JS函数匿名替换
    批量更改数据库表架构(生成sql后直接执行!)
    转: 从现实生活中理解什么是广播机制
    public View getView(int position, View convertView, final ViewGroup parent)三个参数的意思
    Android Intent个人介绍
    WPF中Timer与DispatcherTimer类的区别
    C# 使用ManualResetEvent 进行线程同步
    C# 使用AutoResetEvent进行线程同步
  • 原文地址:https://www.cnblogs.com/nietzsche-oier/p/6567585.html
Copyright © 2011-2022 走看看