T1T1

考试错误:一遍ACAC的,没有错误。

思路:

一道双端队列模版题,思路过于简单,

代码:

#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;
    }
}

T2T2

考试错误:只想到了链表,没有想到哈希表的优化,所以没有做出来。

思路:

链表模板题,只需要用一个哈希表来存储位置,其他按双链表来就行。

代码:

#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] << " ";
}

T4T4

考试错误:一遍ACAC的,没有错误。

思路:

表达式求值(削弱版),用栈做就行,懂的都懂。

代码:

#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;
}

T5T5

考试错误:错误的用了贪心的方法来做,导致"听取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;
}