- 伍衍 的博客
DAY10
- @ 2024-7-18 18:48:03
考试错误:一遍的,没有错误。
思路:
一道双端队列模版题,思路过于简单,略。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+50;
int a[N];
int hh=N/2+1,tt=hh-1;
signed main(){
freopen("pd.in","r",stdin);
freopen("pd.out","w",stdout);
int s;
cin >> s;
int idx=1;
while(s--){
char c,d;
cin >> c >> d;
if(c=='A'){
if(d=='L'){
a[--hh]=idx++;
}else{
a[++tt]=idx++;
}
}if(c=='D'){
int k;
cin >> k;
if(d=='L') hh+=k;
else tt-=k;
}
}
for(int i=hh;i<=tt;i++){
cout << a[i] << endl;
}
}
考试错误:只想到了链表,没有想到哈希表的优化,所以没有做出来。
思路:
链表模板题,只需要用一个哈希表来存储位置,其他按双链表来就行。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+50;
int e[N],l[N],r[N],idx;
unordered_map<int,int> mp;
void init(){
idx=2;
r[0]=1;
l[1]=0;
}
void add(int k,int x){
mp[x]=idx;
e[idx]=x;
r[idx]=r[k];
l[idx]=k;
l[r[k]]=idx;
r[k]=idx++;
}
void remove(int k) {
r[l[k]]=r[k];
l[r[k]]=l[k];
}
signed main(){
freopen("insdel.in","r",stdin);
freopen("insdel.out","w",stdout);
init();
int n;
cin >> n;
for(int i=1;i<=n;i++){
int a;
cin >> a;
if(i==1) add(0,a);
else add(idx-1,a);
}
int q;
cin >> q;
while(q--){
int op;
cin >> op;
if(op==1){
int x,y;
cin >> x >> y;
add(mp[x],y);
}else{
int x;
cin >> x;
remove(mp[x]);
}
}
for(int i=r[0];i!=1;i=r[i]) cout << e[i] << " ";
}
考试错误:一遍的,没有错误。
思路:
表达式求值(削弱版),用栈做就行,懂的都懂。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<int> s;
signed main(){
freopen("horse.in","r",stdin);
freopen("horse.out","w",stdout);
int n;
cin >> n;
for(int i=1;i<=n;i++){
bool b;
cin >> b;
if(b==0) s.push_back(-1);
else{
int idx=0;
while(s.back()!=-1){
idx+=s.back();
s.pop_back();
}
s.pop_back();
s.push_back(max((long long)(1),idx*2)%12345678910);
}
}
int num=0;
for(int i=0;i<s.size();i++){
num=(num+s[i]%12345678910)%12345678910;
}
cout << num%12345678910;
}
考试错误:错误的用了贪心的方法来做,导致"听取WA声一片".
思路:
这是一道堆的模版题,每次取出堆的前两个数并相加,然后累加并加入到堆中。最后输出即可。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+50;
int a[N];
priority_queue<int,vector<int>,greater<int> > q;
signed main(){
freopen("qg.in","r",stdin);
freopen("qg.out","w",stdout);
int n;
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
q.push(a[i]);
}
int ans=0;
for(int i=1;i<n;i++){
int A=q.top();
q.pop();
int B=q.top();
q.pop();
q.push(A+B);
ans+=A+B;
}
cout << ans;
}