2024日记

4.24:
由乃打扑克然后……

我招谁惹谁了啊!

加个代码,求神帮调

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
#ifdef linux
#define gc getchar_unlocked
#define pc putchar_unlocked
#else
#define gc getchar
#define pc putchar
#endif
namespace IO{
    template<typename T>inline bool read(T &x){x=0;char s=gc();bool f=true;for(;(s<'0'||'9'<s);s=gc()) {if(s=='-') f=false;if(s==EOF)return false;}for(;'0'<=s&&s<='9';s=gc()) x=(x<<1)+(x<<3)+(s^48);if(!f) x=~x+1;return true;}
    inline bool read(double &x){x=0.0;char s=gc();bool f=true;for(;(s<'0'||'9'<s);s=gc()) {if(s=='-') f=false;if(s==EOF)return false;}for(;'0'<=s&&s<='9';s=gc()) x=(x*10)+(s^48);if(s!='.'){return true;}double res=0.1;s=gc();for(;'0'<=s&&s<='9';res/=10,s=gc()) x+=(s^48)*res;x=f?x:-x;return true;}
    inline bool read(string &str){string res;str.swap(res);char s=gc();for(;s==' '||s=='\n';s=gc());if(s==EOF) return false; for(;s!=' '&&s!='\n'&&s!=EOF;s=gc())str.push_back(s);return true;}
    inline bool read_line(string &str){string res;str.swap(res);char s=gc();for(;s==' '||s=='\n';s=gc());if(s==EOF) return false;for(;s!='\n'&&s!=EOF;s=gc()){str.push_back(s);}return true;}
    inline bool read_line(char *str){int len=0;char s=gc();for(;s==' '||s=='\n';s=gc());if(s==EOF) return false;for(;s!='\n'&&s!=EOF;s=gc()){str[len]=s;len++;}str[len]='\0';return true;}
    inline bool read(char &s){char x=gc();for(;x==' '&&x=='\n';x=gc());if(x==EOF||x==' '||x=='\n')return false;s=x;return true;}
    inline bool read(char *s){int len=0;char x=gc();for(;x==' '||x=='\n';x=gc());if(x==EOF)return false;for(;x!=' '&&x!='\n'&&x!=EOF;x=gc())s[len++]=x;s[len]='\0';return true;}
    template<class T,class... Args> inline bool read(T &x,Args&... args){return (read(x)&&read(args...));}
    template<class T>inline void write(T x){static T st[45];int top=0;if(x<0)x=~x+1,pc('-');do{st[top++]=x%10;}while(x/=10);while(top)pc(st[--top]^48);}
    inline void write(char x){pc(x);}
    inline void write(string s){for(register int i=0;s[i];++i) pc(s[i]);}
    inline void write(char *s){int len=strlen(s);for(int i=0;i<len;++i) pc(s[i]);}
    inline void write(const char *s){int len=strlen(s);for(int i=0;i<len;++i) pc(s[i]);}
    template<class T,class... Args> inline void write(T x,Args... args){write(x);write(args...);}
}using namespace IO;
const int N=1e5+10;
int n,m,a[N],add[N],L[N],R[N],pos[N],len,minn=INT_MAX,maxx=-INT_MAX;
vector<int> num[N];
inline void update(int l,int r,int k){
    int p=pos[l],q=pos[r];
    if(p==q){
        vector<int> ().swap(num[p]);
        for(int i=l;i<=r;++i) a[i]+=k;
        for(int i=L[p];i<=R[p];++i) num[p].emplace_back(a[i]);
        stable_sort(num[p].begin(),num[p].end());
        minn=min(minn,num[p].front()+add[p]);
        maxx=max(maxx,num[p].back()+add[p]);
        return;
    }
    vector<int> ().swap(num[p]);
    for(int i=l;i<=R[p];++i) a[i]+=k;
    for(int i=L[p];i<=R[p];++i) num[p].emplace_back(a[i]);
    stable_sort(num[p].begin(),num[p].end());
    minn=min(minn,num[p].front()+add[p]);
    maxx=max(maxx,num[p].back()+add[p]);
    vector<int> ().swap(num[q]);
    for(int i=L[q];i<=r;++i) a[i]+=k;
    for(int i=L[q];i<=R[q];++i) num[q].emplace_back(a[i]);
    stable_sort(num[q].begin(),num[q].end());
    minn=min(minn,num[q].front()+add[q]);
    maxx=max(maxx,num[q].back()+add[q]);
    for(int i=p+1;i<q;++i) add[i]+=k,minn=min(num[i].front()+add[i],minn),maxx=max(num[i].back()+add[i],maxx);
}
inline bool check(int mid,int l,int r,int k,int more){
    if(r<l) return more<k;
    int p=pos[l],q=pos[r],res=more;
    for(int i=p;i<=q;++i){
        if(num[i].back()+add[i]<=mid){res+=num[i].size();continue;}
        if(num[i].front()+add[i]>mid) continue;
        res+=upper_bound(num[i].begin(),num[i].end(),mid-add[i])-num[i].begin();
    }
    return res<k;
}
inline int query(int l,int r,int k){
    if(k>r-l+1) return -1;
    if(k==1){
        int res=INT_MAX,p=pos[l],q=pos[r];
        if(p==q){
            for(int i=l,ad=add[p];i<=r;++i) res=min(res,a[i]+ad);
            return res;
        }
        for(int i=l,ad=add[p];i<=R[p];++i) res=min(res,a[i]+ad);
        for(int i=L[q],ad=add[q];i<=r;++i) res=min(res,a[i]+ad);
        for(int i=p+1;i<q;++i) res=min(res,num[i].front()+add[i]);
        return res;
    }
    else if(k==r-l+1){
        int res=-INT_MAX,p=pos[l],q=pos[r];
        if(p==q){
            for(int i=l,ad=add[p];i<=r;++i) res=max(res,a[i]+ad);
            return res;
        }
        for(int i=l,ad=add[p];i<=R[p];++i) res=max(res,a[i]+ad);
        for(int i=L[q],ad=add[q];i<=r;++i) res=max(res,a[i]+ad);
        for(int i=p+1;i<q;++i) res=max(res,num[i].back()+add[i]);
        return res;
    }
    int left=minn,right=maxx,ans=0;
    vector<int> san;
    int p=pos[l],q=pos[r];
    if(p==q) for(int i=l,ad=add[p];i<=r;++i) san.emplace_back(a[i]+ad);
    else{
        for(int i=l,ad=add[p];i<=R[p];++i) san.emplace_back(a[i]+ad);
        for(int i=L[q],ad=add[q];i<=r;++i) san.emplace_back(a[i]+ad);
    }
    stable_sort(san.begin(),san.end());
    l=R[p]+1,r=L[q]-1;
    while(left<=right){
        int mid=(left+right)>>1;
        int more=upper_bound(san.begin(),san.end(),mid)-san.begin();
        if(check(mid,l,r,k,more)) left=mid+1;
        else ans=mid,right=mid-1;
    }
    return ans;
}
signed main(){
    #ifndef ONLINE_JUDGE
        infile("in.in");outfile("out.out");
    #else
    #endif
    read(n,m);
    for(int i=1;i<=n;++i) read(a[i]);
    len=1000;int siz=n/len;
    for(int i=1;i<=len;++i) L[i]=R[i-1]+1,R[i]=i*siz;
    if(R[len]<n) len++,L[len]=R[len-1]+1,R[len]=n;
    for(int i=1;i<=len;++i){
        for(int j=L[i];j<=R[i];++j){
            num[i].emplace_back(a[j]);
            pos[j]=i;
        }
        stable_sort(num[i].begin(),num[i].end());
        minn=min(minn,num[i].front());
        maxx=max(maxx,num[i].back());
    }
    while(m--){
        int op,l,r,k;read(op,l,r,k);
        if(op==1) write(query(l,r,k),'\n');
        else update(l,r,k);
    }
}
update: 归并后还是T……:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
#define inline __always_inline
using ll=long long;using ull=unsigned long long;
// #undef linux
#ifdef linux
#define gc() stdin->_IO_read_ptr<stdin->_IO_read_end?*stdin->_IO_read_ptr++:__uflow(stdin)
#define pc(x) stdout->_IO_write_ptr<stdout->_IO_write_end?*stdout->_IO_write_ptr++=x:__overflow(stdout,x)
#else
#define gc getchar
#define pc putchar
#endif
namespace IO{
    template<typename T>inline bool read(T &x){x=0;char s=gc();bool f=true;for(;(s<'0'||'9'<s);s=gc()) {if(s=='-') f=false;if(s==EOF)return false;}for(;'0'<=s&&s<='9';s=gc()) x=(x<<1)+(x<<3)+(s^48);if(!f) x=~x+1;return true;}
    inline bool read(double &x){x=0.0;char s=gc();bool f=true;for(;(s<'0'||'9'<s);s=gc()) {if(s=='-') f=false;if(s==EOF)return false;}for(;'0'<=s&&s<='9';s=gc()) x=(x*10)+(s^48);if(s!='.'){return true;}double res=0.1;s=gc();for(;'0'<=s&&s<='9';res/=10,s=gc()) x+=(s^48)*res;x=f?x:-x;return true;}
    inline bool read(string &str){string res;str.swap(res);char s=gc();for(;s==' '||s=='\n';s=gc());if(s==EOF) return false; for(;s!=' '&&s!='\n'&&s!=EOF;s=gc())str.push_back(s);return true;}
    inline bool read_line(string &str){string res;str.swap(res);char s=gc();for(;s==' '||s=='\n';s=gc());if(s==EOF) return false;for(;s!='\n'&&s!=EOF;s=gc()){str.push_back(s);}return true;}
    inline bool read_line(char *str){int len=0;char s=gc();for(;s==' '||s=='\n';s=gc());if(s==EOF) return false;for(;s!='\n'&&s!=EOF;s=gc()){str[len]=s;len++;}str[len]='\0';return true;}
    inline bool read(char &s){char x=gc();for(;x==' '&&x=='\n';x=gc());if(x==EOF||x==' '||x=='\n')return false;s=x;return true;}
    inline bool read(char *s){int len=0;char x=gc();for(;x==' '||x=='\n';x=gc());if(x==EOF)return false;for(;x!=' '&&x!='\n'&&x!=EOF;x=gc())s[len++]=x;s[len]='\0';return true;}
    template<class T,class... Args> inline bool read(T &x,Args&... args){return (read(x)&&read(args...));}
    template<class T>inline void write(T x){static T st[45];int top=0;if(x<0)x=~x+1,pc('-');do{st[top++]=x%10;}while(x/=10);while(top)pc(st[--top]^48);}
    inline void write(char x){pc(x);}
    inline void write(string s){for(register int i=0;s[i];++i) pc(s[i]);}
    inline void write(char *s){int len=strlen(s);for(int i=0;i<len;++i) pc(s[i]);}
    inline void write(const char *s){int len=strlen(s);for(int i=0;i<len;++i) pc(s[i]);}
    template<class T,class... Args> inline void write(T x,Args... args){write(x);write(args...);}
}using namespace IO;
const int N=1e5+10;
int n,m,a[N],add[N],L[N],R[N],pos[N],len,minn=INT_MAX,maxx=-INT_MAX;
vector<pair<int,int> > num[N];
#define pii pair<int,int>
#define mk make_pair
inline void rebuild(int l,int r,int id){
    vector<pii> res1,res2;
    for(auto k:num[id]){
        if(l<=k.second&&k.second<=r) res2.emplace_back(mk(a[k.second],k.second));
        else res1.emplace_back(k);
    }
    int len1=0,len2=0,aim1=res1.size()-1,aim2=res2.size()-1,ad=add[id];
    vector<pii> ().swap(num[id]);
    while(len1<=aim1||len2<=aim2){
        while(len1<=aim1&&(len2>aim2||res1[len1].first<=res2[len2].first)) num[id].emplace_back(res1[len1]),len1++;
        while(len2<=aim2&&(len1>aim1||res1[len1].first>=res2[len2].first)) num[id].emplace_back(res2[len2]),len2++;
    }
}
inline void update(int l,int r,int k){
    int p=pos[l],q=pos[r];
    if(p==q){
        for(int i=l;i<=r;++i) a[i]+=k;
        rebuild(l,r,p);
        minn=min(minn,num[p].front().first+add[p]);
        maxx=max(maxx,num[p].back().first+add[p]);
        return;
    }
    for(int i=l;i<=R[p];++i) a[i]+=k;
    rebuild(l,R[p],p);
    minn=min(minn,num[p].front().first+add[p]);
    maxx=max(maxx,num[p].back().first+add[p]);
    for(int i=L[q];i<=r;++i) a[i]+=k;
    rebuild(L[q],r,q);
    minn=min(minn,num[q].front().first+add[q]);
    maxx=max(maxx,num[q].back().first+add[q]);
    for(int i=p+1;i<q;++i) add[i]+=k,minn=min(num[i].front().first+add[i],minn),maxx=max(num[i].back().first+add[i],maxx);
}
inline bool check(int mid,int l,int r,int k,int more){
    if(r<l) return more<k;
    int p=pos[l],q=pos[r],res=more;
    for(int i=p;i<=q;++i){
        if(num[i].back().first+add[i]<=mid){res+=num[i].size();continue;}
        if(num[i].front().first+add[i]>mid) continue;
        res+=upper_bound(num[i].begin(),num[i].end(),mk(mid-add[i],99999))-num[i].begin();
    }
    return res<k;
}
inline int query(int l,int r,int k){
    if(k>r-l+1) return -1;
    if(k==1){
        int res=INT_MAX,p=pos[l],q=pos[r];
        if(p==q){
            for(int i=l,ad=add[p];i<=r;++i) res=min(res,a[i]+ad);
            return res;
        }
        for(int i=l,ad=add[p];i<=R[p];++i) res=min(res,a[i]+ad);
        for(int i=L[q],ad=add[q];i<=r;++i) res=min(res,a[i]+ad);
        for(int i=p+1;i<q;++i) res=min(res,num[i].front().first+add[i]);
        return res;
    }
    else if(k==r-l+1){
        int res=-INT_MAX,p=pos[l],q=pos[r];
        if(p==q){
            for(int i=l,ad=add[p];i<=r;++i) res=max(res,a[i]+ad);
            return res;
        }
        for(int i=l,ad=add[p];i<=R[p];++i) res=max(res,a[i]+ad);
        for(int i=L[q],ad=add[q];i<=r;++i) res=max(res,a[i]+ad);
        for(int i=p+1;i<q;++i) res=max(res,num[i].back().first+add[i]);
        return res;
    }
    int left=minn,right=maxx,ans=0;
    vector<int> san;
    int p=pos[l],q=pos[r];
    if(p==q){
        for(auto k:num[p]){
            if(l<=k.second&&k.second<=r) san.emplace_back(k.first+add[p]);
        }
    }
    else{
        int len1=0,len2=0,aim1=num[p].size()-1,aim2=num[q].size()-1;
        while(len1<=aim1||len2<=aim2){
            while(len1<=aim1&&(len2>aim2||num[p][len1].first+add[p]<=num[q][len2].first+add[q])){
                if(l<=num[p][len1].second&&num[p][len1].second<=R[p])
                    san.emplace_back(num[p][len1].first+add[p]);
                len1++;
            }
            while(len2<=aim2&&(len1>aim1||num[p][len1].first+add[p]>=num[q][len2].first+add[q])){
                if(L[q]<=num[q][len2].second&&num[q][len2].second<=r)
                    san.emplace_back(num[q][len2].first+add[q]);
                len2++;
            }
        }
    }
    l=R[p]+1,r=L[q]-1;
    while(left<=right){
        int mid=(left+right)>>1;
        int more=upper_bound(san.begin(),san.end(),mid)-san.begin();
        if(check(mid,l,r,k,more)) left=mid+1;
        else ans=mid,right=mid-1;
    }
    return ans;
}
signed main(){
    #ifndef ONLINE_JUDGE
        infile("in.in");outfile("out.out");
    #else
    #endif
    read(n,m);
    for(int i=1;i<=n;++i) read(a[i]);
    len=sqrt(n);int siz=n/len;
    for(int i=1;i<=len;++i) L[i]=R[i-1]+1,R[i]=i*siz;
    if(R[len]<n) len++,L[len]=R[len-1]+1,R[len]=n;
    for(int i=1;i<=len;++i){
        for(int j=L[i];j<=R[i];++j){
            num[i].emplace_back(mk(a[j],j));
            pos[j]=i;
        }
        stable_sort(num[i].begin(),num[i].end());
        minn=min(minn,num[i].front().first);
        maxx=max(maxx,num[i].back().first);
    }
    while(m--){
        int op,l,r,k;read(op,l,r,k);
        if(op==1){
            write(query(l,r,k),'\n');
            continue;
        }
        else update(l,r,k);
        // for(int i=1;i<=len;++i){
        //     cout<<i<<": ";
        //     for(auto j:num[i]) cout<<j.first<<' ';
        //     cout<<'\n';
        // }
    }
}

恼了恼了
4.27
重构以后还是T,随机数据下我比正解快两倍……

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
#define inlint __always_inline
#ifdef linux
#define gc getchar_unlocked
#define pc putchar_unlocked
#else
#define gc getchar
#define pc putchar
#endif
namespace IO{
    template<typename T>inline bool read(T &x){x=0;char s=gc();bool f=true;for(;(s<'0'||'9'<s);s=gc()) {if(s=='-') f=false;if(s==EOF)return false;}for(;'0'<=s&&s<='9';s=gc()) x=(x<<1)+(x<<3)+(s^48);if(!f) x=~x+1;return true;}
    inline bool read(double &x){x=0.0;char s=gc();bool f=true;for(;(s<'0'||'9'<s);s=gc()) {if(s=='-') f=false;if(s==EOF)return false;}for(;'0'<=s&&s<='9';s=gc()) x=(x*10)+(s^48);if(s!='.'){return true;}double res=0.1;s=gc();for(;'0'<=s&&s<='9';res/=10,s=gc()) x+=(s^48)*res;x=f?x:-x;return true;}
    inline bool read(string &str){string res;str.swap(res);char s=gc();for(;s==' '||s=='\n';s=gc());if(s==EOF) return false; for(;s!=' '&&s!='\n'&&s!=EOF;s=gc())str.push_back(s);return true;}
    inline bool read_line(string &str){string res;str.swap(res);char s=gc();for(;s==' '||s=='\n';s=gc());if(s==EOF) return false;for(;s!='\n'&&s!=EOF;s=gc()){str.push_back(s);}return true;}
    inline bool read_line(char *str){int len=0;char s=gc();for(;s==' '||s=='\n';s=gc());if(s==EOF) return false;for(;s!='\n'&&s!=EOF;s=gc()){str[len]=s;len++;}str[len]='\0';return true;}
    inline bool read(char &s){char x=gc();for(;x==' '&&x=='\n';x=gc());if(x==EOF||x==' '||x=='\n')return false;s=x;return true;}
    inline bool read(char *s){int len=0;char x=gc();for(;x==' '||x=='\n';x=gc());if(x==EOF)return false;for(;x!=' '&&x!='\n'&&x!=EOF;x=gc())s[len++]=x;s[len]='\0';return true;}
    template<class T,class... Args> inline bool read(T &x,Args&... args){return (read(x)&&read(args...));}
    template<class T>inline void write(T x){static T st[45];int top=0;if(x<0)x=~x+1,pc('-');do{st[top++]=x%10;}while(x/=10);while(top)pc(st[--top]^48);}
    inline void write(char x){pc(x);}
    inline void write(string s){for(register int i=0;s[i];++i) pc(s[i]);}
    inline void write(char *s){int len=strlen(s);for(int i=0;i<len;++i) pc(s[i]);}
    inline void write(const char *s){int len=strlen(s);for(int i=0;i<len;++i) pc(s[i]);}
    template<class T,class... Args> inline void write(T x,Args... args){write(x);write(args...);}
}using namespace IO;
const int N=1e5+10,M=sqrt(N)+10;
int n,m,a[N],pos[N],L[M],R[M],add[M],len,siz;
struct node{
    int val,pos;
    friend bool operator < (node x,node y){return x.val<y.val;} 
    bool operator <= (node y){return val<=y.val;}
}num[N];
node res1[N],res2[N];
inline void rebuild(int l,int r,int k){
    int p=pos[l],left=L[p],right=R[p],tot1=0,tot2=0;
    for(int i=left;i<=right;++i){
        if(l<=i&&i<=r) a[i]+=k;
        if(l<=num[i].pos&&num[i].pos<=r) res1[++tot1]=(node){num[i].val+k,num[i].pos};
        else res2[++tot2]=num[i];
    }
    int k1=1,k2=1,now=left;
    while(now<=right){
        if(k1<=tot1&&(k2>tot2||res1[k1]<=res2[k2])) num[now++]=res1[k1++];
        else num[now++]=res2[k2++];
    }
}
inline void update(int l,int r,int k){
    int p=pos[l],q=pos[r];
    if(p==q) return rebuild(l,r,k);
    rebuild(l,R[p],k);rebuild(L[q],r,k);
    for(int i=p+1;i<q;++i) add[i]+=k;
}
inline bool check(int l,int r,int mid,int k){
    int res=0,p=pos[l],q=pos[r];
    if(p==q){
        for(int i=l;i<=r;++i) res+=((a[i]+add[p])<=mid);
        return res<k;
    }
    for(int i=l,ad=add[p],emm=R[p];i<=emm;++i) res+=((a[i]+ad)<=mid);
    for(int i=L[q],ad=add[q];i<=r;++i) res+=((a[i]+ad)<=mid);
    for(int i=p+1;i<q;++i){
        if(num[L[i]].val+add[i]>mid) continue;
        if(num[R[i]].val+add[i]<=mid){res+=R[i]-L[i]+1;if(res>=k)return false;continue;}
        res+=upper_bound(num+L[i],num+R[i]+1,(node){mid-add[i],0})-num-L[i];
        if(res>=k) return false;
    }
    return res<k;
}
inline int query(int l,int r,int k){
    if(k>r-l+1) return -1;
    int p=pos[l],q=pos[r],left=INT_MAX,right=-INT_MAX;
    for(int i=l,ad=add[p];i<=R[p];++i){
        left=min(left,a[i]+ad);
        right=max(right,a[i]+ad);
    }
    for(int i=L[q],ad=add[q];i<=r;++i){
        left=min(left,a[i]+ad);
        right=max(right,a[i]+ad);
    }
    for(int i=p+1;i<q;++i){
        left=min(left,num[L[i]].val+add[i]);
        right=max(right,num[R[i]].val+add[i]);
    }
    int res=0;
    while(left<=right){
        int mid=(left+right)>>1;
        if(check(l,r,mid,k)) left=mid+1;
        else res=mid,right=mid-1;
    }
    return res;
}
signed main(){
    #ifndef ONLINE_JUDGE
        infile("in.in");outfile("out.out");
    #else
    #endif
    read(n,m);
    for(int i=1;i<=n;++i) read(a[i]);
    len=sqrt(n),siz=n/len;
    for(int i=1;i<=siz;++i) L[i]=(i-1)*len+1,R[i]=i*len;
    if(R[siz]<n) R[siz]=n;
    for(int i=1;i<=siz;++i){
        for(int j=L[i];j<=R[i];++j){
            pos[j]=i;
            num[j].val=a[j];
            num[j].pos=j;
        }
        stable_sort(num+L[i],num+R[i]+1);
    }
    while(m--){
        int op,l,r,k;
        read(op,l,r,k);
        if(op==1) write(query(l,r,k),'\n');
        else update(l,r,k);
    }
}

不调了,溜了

5.8
天天爱打卡
long long 减溢出了,调了2h因为没测RE
我是sb

posted @ 2024-04-24 16:20  CuFeO4  阅读(37)  评论(3编辑  收藏  举报