• POJ2761(Feed the dogs)


    题目链接:传送门

    题目大意:静态区间询问第k小

    题目思路:整体二分,与poj2104一模一样 讲解链接:传送门

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <cstring>
     7 #include <stack>
     8 #include <cctype>
     9 #include <queue>
    10 #include <string>
    11 #include <vector>
    12 #include <set>
    13 #include <map>
    14 #include <climits>
    15 #define lson root<<1,l,mid
    16 #define rson root<<1|1,mid+1,r
    17 #define fi first
    18 #define se second
    19 #define ping(x,y) ((x-y)*(x-y))
    20 #define mst(x,y) memset(x,y,sizeof(x))
    21 #define mcp(x,y) memcpy(x,y,sizeof(y))
    22 using namespace std;
    23 #define gamma 0.5772156649015328606065120
    24 #define MOD 1000000007
    25 #define inf 0x3f3f3f3f
    26 #define N 200005
    27 #define maxn 50005
    28 typedef pair<int,int> PII;
    29 typedef long long LL;
    30 
    31 int n,m;
    32 struct Node{
    33     int id,l,r,v,f;
    34     Node(){}
    35     Node(int a,int b,int c,int d,int e){
    36         id=a;l=b;r=c;v=d;f=e;
    37     }
    38 }node[N],t1[N],t2[N];
    39 int tree[N],hcnt,ans[N];
    40 void add(int i,int v){for(;i<=n;i+=(i&-i))tree[i]+=v;}
    41 int query(int i){int res=0;for(;i;i-=(i&-i))res+=tree[i];return res;}
    42 void solve(int ql,int qr,int l,int r){
    43     if(ql>qr)return;
    44     if(l==r){
    45         for(int i=ql;i<=qr;++i)if(node[i].f==2)
    46             ans[node[i].id]=l;
    47         return;
    48     }
    49     int mid=l+r>>1;
    50     int len1=0,len2=0;
    51     for(int i=ql;i<=qr;++i){
    52         if(node[i].f==1){
    53             if(node[i].v<=mid){
    54                 add(node[i].id,1);
    55                 t1[len1++]=node[i];
    56             }
    57             else t2[len2++]=node[i];
    58         }
    59         else{
    60             int temp=query(node[i].r)-query(node[i].l-1);
    61             if(temp<node[i].v){
    62                 node[i].v-=temp;
    63                 t2[len2++]=node[i];
    64             }
    65             else t1[len1++]=node[i];
    66         }
    67     }
    68     for(int i=0;i<len1;++i)if(t1[i].f==1)add(t1[i].id,-1);
    69     for(int i=0;i<len1;++i)node[i+ql]=t1[i];
    70     for(int i=0;i<len2;++i)node[i+ql+len1]=t2[i];
    71     solve(ql,ql+len1-1,l,mid);
    72     solve(ql+len1,qr,mid+1,r);
    73 }
    74 int main(){
    75     int i,j,group,x,y,v;
    76     while(scanf("%d%d",&n,&m)!=EOF){
    77         hcnt=0;
    78         int _min=inf,_max=-inf;
    79         for(i=1;i<=n;++i){
    80             scanf("%d",&x);
    81             _max=max(_max,x);_min=min(_min,x);
    82             node[++hcnt]=Node(i,1,1,x,1);
    83         }
    84         for(i=1;i<=m;++i){
    85             scanf("%d%d%d",&x,&y,&v);
    86             node[++hcnt]=Node(i,x,y,v,2);
    87         }
    88         solve(1,hcnt,_min,_max);
    89         for(i=1;i<=m;++i)printf("%d
    ",ans[i]);
    90     }
    91     return 0;
    92 }
  • 相关阅读:
    『嗨威说』算法设计与分析
    『嗨威说』算法设计与分析
    『嗨威说』算法设计与分析
    『嗨威说』算法设计与分析
    『嗨威说』数据结构
    『嗨威说』数据结构
    『嗨威说』数据结构
    『嗨威说』数据结构
    『嗨威说』数据结构
    『嗨威说』数据结构的基本概念和术语、算法分析的时间复杂度(深度剖析)
  • 原文地址:https://www.cnblogs.com/Kurokey/p/5626100.html
Copyright © 2020-2023  润新知