只簡單帶過幾個比較常用的 STL
可以去參考 STL教學
用法也可以去 cplusplus reference
pair<type1,type2> p;
p.first; // 第一個
p.second; // 第二個
p=make_pair(a,b) / p={a,b}; // 設定 p 為 (a,b)vector<type> v(length); // 宣告 長度不設就會是0
v.assign(l,val); // 設定陣列長度 l , 初始值皆為 val
v.push_back(x) / v.emplace_back(x) ; // 在尾端加入 x
v.pop_back(); // 刪除最後面的值
v[i]; // v 中第 i 個元素
v.begin(); // 第一個位置
v.end(); // 尾部的下一個位置
v.insert(pos,val); // 在位置 pos 插入 val
v.erase(pos); // 移除位置 pos 的
// p.s. pos 是 iterator , 因此表示位置 i pos=v.begin()+i;list<type> v(length); // 宣告 長度不設就會是0
v.assign(l,val); // 設定陣列長度 l , 初始值皆為 val
v.push_back(x) / v.emplace_back(x) ; // 在尾端加入 x
v.push_front(x) / v.emplace_front(x);// 在首端加入 x
v.pop_back(); // 刪除最後面的值
v.pop_front(); // 刪除最前面的值
v.begin(); // 第一個位置
v.end(); // 尾部的下一個位置
v.insert(pos,val); // 在位置 pos 插入 val
v.erase(pos); // 移除位置 pos 的
// p.s. pos 是 iterator , 但在list 無法隨意訪問位置 istack<type> st; // 初始stack st
st.push(x); // 在尾端插入一個元素 x
st.top(); // 拿尾端的元素
st.pop(); // 移除尾端元素queue<type> st; // 初始queue st
st.push(x); // 在尾端插入一個元素 x
st.front(); // 拿尾端的元素
st.pop(); // 移除尾端元素deque<type> dq;
dq.push_front(x);
dq.push_back(x);
dq.front();
dq.back();
dq.pop_front();
dq.pop_back();
dq[i];priority_queue<type> pq; // 初始priority_queue pq (預設為最大)
priority_queue<type,vector<type>,cmp> pq; // 自定義大小
struct cmp{
bool operator () (pair<int,int> a,pair<int,int> b){
//pair 自定義函式寫法
if(a.S!=b.S) return a.S>b.S;
return a.F>b.F;
}
};
pq.push(x); // 在尾端插入一個元素 x
pq.top(); // 拿尾端的元素
pq.pop(); // 移除尾端元素map<type1,type2> m; // key(type1) , val(type2)
m[key]=val; , m[key]+=val,m[key]-=val,... // 和陣列操作類似
m.insert({key,val});
m.erase({key,val});
m.find(key); // 確認是否有key 值,如果有回傳其 iterator , 否則回傳 m.end();
// 遍歷 map (按照 key 由小到大)
for(auto [key,val]:m) ...
for(auto it=m.begin();it!=m.end();it++) ...
// (it 為iterator, 實際應為 map<type1,type2>::iterator it; 太長改用 auto 代替)unordered_map<type1,type2> m; // key(type1) , val(type2)
m[key]=val; , m[key]+=val,m[key]-=val,... // 和陣列操作類似
m.insert({key,val});
m.erase({key,val});
m.find(key); // 確認是否有key 值,如果有回傳其 iterator , 否則回傳 m.end();
// 遍歷 map
for(auto [key,val]:m) ...
for(auto it=m.begin();it!=m.end();it++) ...
// (it 為iterator, 實際應為 unordered_map<type1,type2>::iterator it; 太長改用 auto 代替)set<type> st;
st.insert(x);
st.erase(x); // 刪除元素x
st.erase(pos); // 刪除位置 pos
st.find(x); // 有的話回傳 iterator , 沒有的話回傳 st.end();multiset<type> st;
st.insert(x);
st.erase(x); // 刪除所有元素 x
st.erase(pos); // 刪除位置 pos
st.find(x); // 有的話回傳 iterator , 沒有的話回傳 st.end();while(i<n||j<m){
if(i<n&&(j>=m||a[i]<b[j]) cout<<a[i++]<<" ";
else cout<<b[j++]<<" ";
}cout<<"\n";for(int i=0;i<n;i++){
x+=v[i];
while(l<i&&x>s){
l++;
x-=v[l];
}
if(x<=s){
len=max(len,i-l);
}
}cout<<len<<"\n";lower_bound(l,l+n,x)
lower_bound(v.begin(),v.end(),x)
upper_bound(l,l+n,x)
upper_bound(v.begin(),v.end(),x)
int l=0,r=n;
while(l+1<r){
int mid=(l+r)>>1;
if(ok(mid)) r=mid;
else l=mid;
}
cout<<r<<"\n";
double l=0,r=n;
for(int cnt=0;cnt<30;cnt++){
int mid=(l+r)>>1;
if(ok(mid)) r=mid;
else l=mid;
}
cout<<r<<"\n";bool ok(int x){
int sum=0;
for(int i:a){
int p=lower_bound(b.begin(),b.end(),x-i)-b.begin();
sum+=p;
}
return sum<k;
}
int main(){
sort(a.begin(),a.end());
sort(b.begin(),b.end());
int l=a[0]+b[0]-1;
int r=a[n-1]+b[n-1]+1;
while(l+1<r){
int middle=(l+r)>>1;
if(ok(middle)) l=middle;
else r=middle;
}
}while(r-l>10){
int l2=(l*2+r)/3;
int r2=(l+r*2)/3;
if(cal(l2)<cal(r2)) l=l2;
else r=r2;
}
for(int i=l;i<=r;i++){
ans=max(ans,cal(i));
}double l,r;
for(int t=1;t<=100;t++){
double l2=(l*2+r)/3;
double r2=(l+r*2)/3;
if(cal(l2)<cal(r2)) l=l2;
else r=r2;
}deque<pii> dq;
for(int i=0;i<n;i++){
cin>>a[i];
while(dq.size()&&(dq.back().F<=a[i])) dq.pop_back();
if(dq.size()&&i-dq.front().S>=k) dq.pop_front();
dq.push_back(mp(a[i],i));
if(i>=k-1) cout<<dq.front().F<<"\n";
}