zoukankan      html  css  js  c++  java
  • HDOJ 5213

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5213
    BC 上的题,题解很清楚,会莫对的应该不难,
    对于一个询问,我们拆成四个询问,开始拆成求区间矩形的样子,我想多了。
    然后就是模板的莫队了。
    一个变量打错,一直DEBUG  
     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<string.h>
     4 #include<math.h>
     5 #include<string>
     6 #include<iostream>
     7 using namespace std;
     8 
     9 #define N 600055
    10 typedef long long LL;
    11 int a[N],pos[N],block;
    12 int n,m,k,idx;
    13 int ans1[N],tmp[N];
    14 
    15 struct node
    16 {
    17     int l,r,id;
    18     int p;
    19 }q[N];
    20 
    21 //BZOJ 4129
    22 int cmp(node a,node b)
    23 {
    24     if (pos[a.l]==pos[b.l]) return a.r<b.r;
    25     return pos[a.l]<pos[b.l];
    26 }
    27 
    28 void solve()
    29 {
    30     int l=1,r=0;
    31     int ans=0;
    32     for (int i=1;i<=m;i++)
    33     {
    34         while (l>q[i].l)
    35         {
    36             l--;
    37             if (k-a[l]>0) ans+=tmp[k-a[l]];
    38             tmp[a[l]]++;
    39         }
    40         while (r<q[i].r)
    41         {
    42             r++;
    43             if (k-a[r]>0) ans+=tmp[k-a[r]];
    44             tmp[a[r]]++;
    45         }
    46         while (l<q[i].l)
    47         {
    48             if (k-a[l]>0) ans-=tmp[k-a[l]];
    49             tmp[a[l]]--;
    50             l++;
    51         }
    52         while (r>q[i].r)
    53         {
    54             if (k-a[r]>0) ans-=tmp[k-a[r]];
    55             tmp[a[r]]--;
    56             r--;
    57         }
    58         ans1[q[i].id]+=q[i].p*ans;
    59     }
    60 }
    61 
    62 int main()
    63 {
    64  while (scanf("%d%d",&n,&k)!=EOF)
    65  {
    66     memset(ans1,0,sizeof(ans1));
    67     for (int i=1;i<=n;i++)
    68     scanf("%d",&a[i]);
    69     memset(tmp,0,sizeof(tmp));
    70 
    71     block=sqrt(n);
    72     for (int i=1;i<=n;i++)
    73     pos[i]=(i-1)/block+1;
    74     idx=0;
    75     scanf("%d",&m);
    76 
    77     for (int i=1;i<=m;i++)
    78     {
    79       int l,r,l2,r2;
    80       scanf("%d%d%d%d",&l,&r,&l2,&r2);
    81       q[++idx].l=l;q[idx].r=r2;q[idx].id=i;q[idx].p=1;
    82       if (r+1<=l2-1)
    83       {
    84           q[++idx].l=r+1,q[idx].r=l2-1,q[idx].id=i,q[idx].p=1;
    85       }
    86       q[++idx].l=l;q[idx].r=l2-1;q[idx].id=i,q[idx].p=-1;
    87       q[++idx].l=r+1;q[idx].r=r2;q[idx].id=i,q[idx].p=-1;
    88     }
    89     swap(idx,m);
    90     sort(q+1,q+m+1,cmp);
    91     //for (int i=1;i<=m;i++) cout<<q[i].id<<" ";
    92    //cout<<endl;
    93    // cout<<m<<" "<<idx<<endl;
    94     solve();
    95     for (int i=1;i<=idx;i++)
    96     printf("%d
    ",ans1[i]);
    97     }
    98     return 0;
    99 }
  • 相关阅读:
    【python】python中的定义类属性和对像属性
    【Python】Python—判断变量的基本类型
    【python】Python中给List添加元素的4种方法分享
    【python】python各种类型转换-int,str,char,float,ord,hex,oct等
    【python】python 中的三元表达式(三目运算符)
    【python】 sort、sorted高级排序技巧
    【SQLAlchemy】SQLAlchemy技术文档(中文版)(中)
    【SQLAlchemy】SQLAlchemy技术文档(中文版)(上)
    【其他】VS提示不一致的行尾
    UML 之 用例图
  • 原文地址:https://www.cnblogs.com/forgot93/p/4786444.html
Copyright © 2011-2022 走看看