zoukankan      html  css  js  c++  java
  • POJ2104 整体二分

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<cctype>
     7 #include<climits>
     8 using namespace std;
     9 const int maxn=2e5+5;
    10 template<typename T>T read(){
    11     T x=0,f=1;char c=getchar();
    12     for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
    13     for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
    14     return x*f;
    15 }
    16 struct TAS{
    17     int a[maxn];
    18     void add(int x,int y){for(int i=x;i<maxn;i+=(i&-i))a[i]+=y;}
    19     int sum(int x,int y=0){for(int i=x;i>0;i-=(i&-i))y+=a[i];return y;}  
    20 }T;
    21 struct op{
    22     int x,y,k,s,tp,cur;
    23     op(){};
    24     op(int tp,int x,int y,int s,int k=0,int cur=0):
    25         tp(tp),x(x),y(y),s(s),k(k),cur(cur){};
    26 }q[maxn],q1[maxn],q2[maxn];
    27 int num,tmp[maxn],ans[maxn];
    28 void Bin_Search(int ql,int qr,int l,int r){
    29     if(ql>qr)return;
    30     if(l==r){
    31         for(int i=ql;i<=qr;++i)
    32             if(q[i].tp)ans[q[i].s]=l;
    33         return;
    34     }
    35     int mid=l+r>>1;
    36     for(int i=ql;i<=qr;++i){
    37         if(!q[i].tp&&q[i].y<=mid)T.add(q[i].x,1);
    38         else if(q[i].tp)tmp[i]=T.sum(q[i].y)-T.sum(q[i].x-1);
    39     }
    40     for(int i=ql;i<=qr;++i)
    41         if(!q[i].tp&&q[i].y<=mid)T.add(q[i].x,-1);
    42     int l1=0,l2=0;
    43     for(int i=ql;i<=qr;++i){
    44         if(q[i].tp){  
    45             if(q[i].cur+tmp[i]>q[i].k-1)q1[++l1]=q[i];
    46             else{q[i].cur+=tmp[i];q2[++l2]=q[i];}
    47         }
    48         else{
    49             if(q[i].y<=mid)q1[++l1]=q[i];
    50             else q2[++l2]=q[i];
    51         }
    52     }
    53     for(int i=1;i<=l1;++i)q[ql+i-1]=q1[i];
    54     for(int i=1;i<=l2;++i)q[ql+l1+i-1]=q2[i];
    55     Bin_Search(ql,ql+l1-1,l,mid);
    56     Bin_Search(ql+l1,qr,mid+1,r);
    57 }
    58 int n,m;
    59 int main(){
    60     scanf("%d%d",&n,&m);
    61     memset(q,0,sizeof q);num=0;
    62     for(int i=1;i<=n;++i)q[++num]=op(0,i,read<int>(),0);
    63     for(int i=1;i<=m;++i){
    64         int x=read<int>(),y=read<int>(),z=read<int>();
    65         q[++num]=op(1,x,y,i,z);
    66     }
    67     Bin_Search(1,num,-1e9,1e9);
    68     for(int i=1;i<=m;++i)printf("%d
    ",ans[i]);
    69     return 0;
    70 }

    板子题就是好用

  • 相关阅读:
    mailto 调用邮件客户端乱码问题的解决办法
    MySQL开启慢查询
    Java 模拟 Http Post
    使用XSLT转换XML2XML
    上传File时,浏览器总是添加<pre>的解决办法
    转:简单SQL语句小结
    我的crm报告竣工了!
    vs2005快捷键
    转:C# 参考之转换关键字:operator、explicit与implicit
    正值表达式2
  • 原文地址:https://www.cnblogs.com/ndqzhang1111/p/11338789.html
Copyright © 2011-2022 走看看