zoukankan      html  css  js  c++  java
  • BZOJ 3236[AHOI2013]作业

    题面:

    3236: [Ahoi2013]作业

    Time Limit: 100 Sec  Memory Limit: 512 MB
    Submit: 1704  Solved: 685
    [Submit][Status][Discuss]

    Description

    Input

    Output

    Sample Input

    3 4
    1 2 2
    1 2 1 3
    1 2 1 1
    1 3 1 3
    2 3 2 3

    Sample Output

    2 2
    1 1
    3 2
    2 1

    HINT

    N=100000,M=1000000

    离线莫队处理,对权值分块。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 #define N 100055
     7 #define M 1000066
     8 using namespace std;
     9 int gy[N],be[N],c[M],cc[M],n,m,nn,maxn,tot,num[N];
    10 struct Query{
    11     int l,r,a,b,id,ans1,ans2;
    12 }qr[M];
    13 bool cmp1(Query a,Query b){
    14     if(be[a.l]==be[b.l])
    15         return a.r<b.r;
    16     return be[a.l]<be[b.l];
    17 }
    18 bool cmp2(Query a,Query b){
    19     return a.id<b.id;
    20 }
    21 int lowbit(int x){
    22     return x&(-x);
    23 }
    24 void add(int x,int y){
    25     int xx=x;
    26     if(y==1&&++num[xx]==1){
    27         while(xx<=maxn){
    28             cc[xx]++;
    29             xx+=lowbit(xx);
    30         }
    31     }
    32     if(y==-1&&--num[xx]==0){
    33         while(xx<=maxn){
    34             cc[xx]--;
    35             xx+=lowbit(xx);
    36         }
    37     }
    38     while(x<=maxn){
    39         c[x]+=y;
    40         x+=lowbit(x);
    41     }
    42 }
    43 int query(int x){
    44     if(x>maxn) x=maxn;
    45     int ans=0;
    46     while(x){
    47         ans+=c[x];
    48         x-=lowbit(x);
    49     }
    50     return ans;
    51 }
    52 int query1(int x){
    53     if(x>maxn) x=maxn;
    54     int ans=0;
    55     while(x){
    56         ans+=cc[x];
    57         x-=lowbit(x);
    58     }
    59     return ans;
    60 }
    61 void work(){
    62     int l=1,r=0;tot=0;
    63     for(int i=1;i<=m;i++){
    64         while(l<qr[i].l) add(gy[l++],-1);
    65         while(l>qr[i].l) add(gy[--l],1);
    66         while(r<qr[i].r) add(gy[++r],1);
    67         while(r>qr[i].r) add(gy[r--],-1);
    68         qr[i].ans1=query(qr[i].b)-query(qr[i].a-1);
    69         qr[i].ans2=query1(qr[i].b)-query1(qr[i].a-1);
    70     }
    71 }
    72 int main()
    73 {
    74     scanf("%d%d",&n,&m); nn=(int)sqrt(n);
    75     for(int i=1;i<=n;i++){
    76         scanf("%d",&gy[i]);
    77         be[i]=(i-1)/nn+1;
    78         maxn=max(maxn,gy[i]);
    79     }
    80     int l,r,a,b;
    81     for(int i=1;i<=m;i++){
    82         scanf("%d%d%d%d",&l,&r,&a,&b);
    83         qr[i].l=l; qr[i].r=r;
    84         qr[i].a=a; qr[i].b=b;
    85         qr[i].id=i;
    86     }
    87     sort(qr+1,qr+m+1,cmp1);
    88     work();
    89     sort(qr+1,qr+m+1,cmp2);
    90     for(int i=1;i<=m;i++)
    91         printf("%d %d
    ",qr[i].ans1,qr[i].ans2);
    92     return 0;
    93 }
    BZOJ 3236
  • 相关阅读:
    Java GUI图形界面开发工具
    python操作MySQL数据库
    国外五大股票交易系统及其源码
    五个抄底摸高的交易系统和源代码
    海龟交易系统源码
    模式识别话题
    几种常见模式识别算法整理和总结
    比较好的开源人脸识别软件
    利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别
    JSONObject与JSONArray的使用
  • 原文地址:https://www.cnblogs.com/radioteletscope/p/7241903.html
Copyright © 2011-2022 走看看