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);
}
}
点击查看代码
#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
本文来自博客园,作者:CuFeO4,转载请注明原文链接:https://www.cnblogs.com/hzoi-Cu/p/18155736