zoukankan      html  css  js  c++  java
  • 整体二分(SP3946 K-th Number ZOJ 2112 Dynamic Rankings)

    SP3946 K-th Number

    (/2和>>1不一样!!)

    #include <algorithm>
    #include <bitset>
    #include <complex>
    #include <deque>
    #include <exception>
    #include <fstream>
    #include <functional>
    #include <iomanip>
    #include <ios>
    #include <iosfwd>
    #include <iostream>
    #include <istream>
    #include <iterator>
    #include <limits>
    #include <list>
    #include <locale>
    #include <map>
    #include <memory>
    #include <new>
    #include <numeric>
    #include <ostream>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stack>
    #include <stdexcept>
    #include <streambuf>
    #include <string>
    #include <typeinfo>
    #include <utility>
    #include <valarray>
    #include <vector>
    
    #if __cplusplus >= 201103L
    #include <array>
    #include <atomic>
    #include <chrono>
    #include <condition_variable>
    #include <forward_list>
    #include <future>
    #include <initializer_list>
    #include <mutex>
    #include <random>
    #include <ratio>
    #include <regex>
    #include <scoped_allocator>
    #include <system_error>
    #include <thread>
    #include <tuple>
    #include <typeindex>
    #include <type_traits>
    #include <unordered_map>
    #include <unordered_set>
    #endif
    #define INF 1000000007
    #define MAXN 200010
    using namespace std;
    struct Node {
        int x,y,a,b,c;
    }q[MAXN],a[MAXN],b[MAXN];
    int t[MAXN],ans[MAXN],n,m,x,y,z,cnt,k;
    inline int read() {
        char ch;
        bool f=false;
        int res=0;
        while (((ch=getchar())<'0'||ch>'9')&&ch!='-');
        if (ch=='-')
            f=true;
        else 
            res=ch-'0';
        while ((ch=getchar())>='0'&&ch<='9')
            res=(res<<3)+(res<<1)+ch-'0';
        return f?~res+1:res;
    }
    inline int lowbit(int x) {
        return x&(-x);
    }
    inline void add(int x,int y) {
        while (x<=n) {
            t[x]+=y,x+=lowbit(x);
        }
    }
    inline int sum(int x) {
        int summ=0;
        while (x>0) {
            summ+=t[x],x-=lowbit(x);
        }
        return summ;
    }
    inline void Build(int x,int i){
        cnt++;
        q[cnt].x=x,q[cnt].b=1,q[cnt].c=i;
    }
    inline void Build1(int x,int y,int k,int i){
        cnt++;
        q[cnt].x=x,q[cnt].y=y,q[cnt].a=k,q[cnt].b=2,q[cnt].c=i;
    }
    void sc(int t,int w,int l,int r) {
        if (t>=w)
            return;
        if (l==r) {
            for (int i=t;i<=w;++i)
                if (q[i].b==2)
                    ans[q[i].c]=l;
            return;
        }
        int mid=(l+r)>>1,t1=0,w1=0;
        for (int i=t;i<=w;++i)
            if (q[i].b==1) {
                if (q[i].x<=mid)
                    add(q[i].c,1),a[++t1]=q[i];
                else
                    b[++w1]=q[i];
            }
            else {
                int tw=sum(q[i].y)-sum(q[i].x-1);
                if (tw>=q[i].a)
                    a[++t1]=q[i];
                else {
                    q[i].a=q[i].a-tw;
                    b[++w1]=q[i];
                }
            }
        for (int i=1;i<=t1;++i)
            if (a[i].b==1)
                add(a[i].c,-1);
        for (int i=1;i<=t1;++i)
            q[t+i-1]=a[i];
        for (int i=1;i<=w1;++i)
            q[t+t1+i-1]=b[i];
        sc(t,t+t1-1,l,mid);
        sc(t+t1,w,mid+1,r);
    }
    int main() {
        n=read(),m=read();
        for (int i=1;i<=n;++i) {
            x=read();
            Build(x,i);
        }
        for (int i=1;i<=m;++i) {
            x=read(),y=read(),k=read();
            Build1(x,y,k,i);
        }
        sc(1,cnt,-INF,INF);
        for (int i=1;i<=m;++i)
            printf("%d
    ",ans[i]);
        return 0;
    }
    

    ZOJ 2112 Dynamic Rankings

    #include <algorithm>
    #include <bitset>
    #include <complex>
    #include<cstring>
    #include <deque>
    #include <exception>
    #include <fstream>
    #include <functional>
    #include <iomanip>
    #include <ios>
    #include <iosfwd>
    #include <iostream>
    #include <istream>
    #include <iterator>
    #include <limits>
    #include <list>
    #include <locale>
    #include <map>
    #include <memory>
    #include <new>
    #include <numeric>
    #include <ostream>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stack>
    #include <stdexcept>
    #include <streambuf>
    #include <string>
    #include <typeinfo>
    #include <utility>
    #include <valarray>
    #include <vector>
    
    #if __cplusplus >= 201103L
    #include <array>
    #include <atomic>
    #include <chrono>
    #include <condition_variable>
    #include <forward_list>
    #include <future>
    #include <initializer_list>
    #include <mutex>
    #include <random>
    #include <ratio>
    #include <regex>
    #include <scoped_allocator>
    #include <system_error>
    #include <thread>
    #include <tuple>
    #include <typeindex>
    #include <type_traits>
    #include <unordered_map>
    #include <unordered_set>
    #endif
    #define INF 1000000007
    #define MAXN 2000010
    using namespace std;
    struct Node {
        int x,y,a,b,c;
    }q[MAXN],a[MAXN],b[MAXN];
    int t[MAXN],ans[MAXN],n,m,x,y,z,cnt,k;
    int aa[MAXN];
    char ch;
    int ansn;
    inline int read() {
        char ch;
        bool f=false;
        int res=0;
        while (((ch=getchar())<'0'||ch>'9')&&ch!='-');
        if (ch=='-')
            f=true;
        else 
            res=ch-'0';
        while ((ch=getchar())>='0'&&ch<='9')
            res=(res<<3)+(res<<1)+ch-'0';
        return f?~res+1:res;
    }
    inline int lowbit(int x) {
        return x&(-x);
    }
    inline void add(int x,int y) {
        while (x<=n) {
            t[x]+=y,x+=lowbit(x);
        }
    }
    inline int sum(int x) {
        int summ=0;
        while (x>0) {
            summ+=t[x],x-=lowbit(x);
        }
        return summ;
    }
    inline void Build(int x,int i) {
        cnt++;
        q[cnt].x=x,q[cnt].b=1,q[cnt].c=i;
    }
    inline void Build1(int x,int y,int k,int i) {
        cnt++,ansn++;
        q[cnt].x=x,q[cnt].y=y,q[cnt].a=k,q[cnt].b=0,q[cnt].c=ansn;
    }
    inline void Build2(int x,int y,int i) {
        cnt++;
        q[cnt].x=aa[x],q[cnt].b=-1,q[cnt].c=x;
    }
    inline void Build3(int x,int y,int i) {
        cnt++;
        q[cnt].x=aa[x],q[cnt].b=1,q[cnt].c=x;
    }
    void sc(int t,int w,int l,int r) {
        if (t>w)
            return;
        if (l==r) {
            for (int i=t;i<=w;++i)
                if (q[i].b==0)
                    ans[q[i].c]=l;
            return;
        }
        int mid=(l+r)>>1,t1=0,w1=0;
        for (int i=t;i<=w;++i)
            if (q[i].b) {
                if (q[i].x<=mid)
                    /*add(q[i].c,1),*/add(q[i].c,q[i].b),a[++t1]=q[i];
                else
                    b[++w1]=q[i];
            }
            else {
                int tw=sum(q[i].y)-sum(q[i].x-1);
                if (tw>=q[i].a)
                    a[++t1]=q[i];
                else {
                    q[i].a=q[i].a-tw;
                    b[++w1]=q[i];
                }
            }
        for (int i=1;i<=t1;++i)
            if (a[i].b)
                add(a[i].c,-a[i].b);
        for (int i=1;i<=t1;++i)
            q[t+i-1]=a[i];
        /*for (int i=1;i<=t1;++i)
            printf("%d %d %d %d %d ",a[i].x,a[i].y,a[i].a,a[i].b,a[i].c);
        printf("
    ");*/
        for (int i=1;i<=w1;++i)
            q[t+t1+i-1]=b[i];
        sc(t,t+t1-1,l,mid);
        sc(t+t1,w,mid+1,r);
    }
    int main() {
        int T=read();
        while (T--){
            memset(q,0,sizeof q);
            memset(a,0,sizeof a);
            memset(b,0,sizeof b);
            memset(ans,0,sizeof ans);
            n=read(),m=read(),cnt=0,ansn=0;
            for (int i=1;i<=n;++i) {
                aa[i]=read();
                Build(aa[i],i);
            }
            for (int i=1;i<=m;++i) {
                /*scanf("%c",&ch);*/cin>>ch;x=read(),y=read();
                if (ch=='Q'){
                    k=read();
                    Build1(x,y,k,i);
                }
                else {
                    Build2(x,y,i);
                    aa[x]=y;
                    Build3(x,y,i);
                }
            }
            //for (int i=1;i<=cnt;++i)
            //    printf("%d %d %d %d %d
    ",q[i].x,q[i].y,q[i].a,q[i].b,q[i].c);
            sc(1,cnt,-INF,INF);
            for (int i=1;i<=ansn;++i)
                printf("%d
    ",ans[i]);
        }
        return 0;
    }
    

      

  • 相关阅读:
    Dockerfile编写语法
    java应用测试报告生成(二):利用ant的build.xml生成测试报告
    java应用测试报告生成(一): sonarqube配合Jenkins生成测试报告及覆盖率
    cannot create windows service for mysql
    线程交互:生产消费模型
    线程同步与锁
    线程的五种状态及改变状态的三种方法
    简单的git入门介绍及常用操作
    CentOS/RHEL 7中的firewall控制
    oracle数据库兼容mysql的差异写法
  • 原文地址:https://www.cnblogs.com/wjnclln/p/10508813.html
Copyright © 2011-2022 走看看