Atcoder Beginner Contest 139

忽然看到有电子竞技就打了下

A:
B:
C:nmd看错题了。wa了好几发。单调栈/单调队列
D:
无脑dp吧还是。好像不用开二维?

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
int n;
string s[66];
ll b[66][2][2];//第i位x[i]==j&&y[i]==k 的方案数
int y[66];
int main(){
    ios::sync_with_stdio(false);
    cin>>n;
    y[n]=1;
    for(int i=1;i<=n;i++){
        cin>>s[i];
    }
    b[0][0][0]=1;
    b[0][1][1]=1;
    for(int i=1;i<=n;i++){
        if(s[i]=="AND"){
            b[i][1][1]= b[i - 1][0][1] + b[i - 1][1][1];

            b[i][0][0]= b[i - 1][0][1] + b[i - 1][1][0] + b[i - 1][1][1] + b[i - 1][0][0];

            b[i][1][0]= b[i - 1][0][0] + b[i - 1][1][0];

            b[i][0][1]=0;

        }else{
            b[i][0][0]= b[i - 1][0][0] + b[i - 1][1][0];

            b[i][1][1]= b[i - 1][0][1] + b[i - 1][1][0] + b[i - 1][1][1] + b[i - 1][0][0];

            b[i][1][0]=0;

            b[i][0][1]= b[i - 1][0][1] + b[i - 1][1][1];
        }
    }
    cout << b[n][0][1] + b[n][1][1] << endl;
}

E:
这题好玩!我第一眼一看这不是我之前出的那道吗
造矩阵玩,我觉得挺有趣的

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 2e5+5;
int n,m,q;
struct point{
    ll x,y,z;
}p[200005];
struct Mat{
    ll a[3][3];
    Mat(){
        memset(a,0, sizeof(a));
    }
    Mat mul(const Mat &b){
        Mat c;
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                for(int k=0;k<3;k++){
                    c.a[i][j]+=a[i][k]*b.a[k][j];
                }
            }
        }
        return c;
    }
    vector<ll> getans(point p){
        vector<ll> v;
        v.push_back(a[0][0]*p.x+a[0][1]*p.y+a[0][2]*p.z);
        v.push_back(a[1][0]*p.x+a[1][1]*p.y+a[1][2]*p.z);
        return v;
    }
};
Mat op1,op2,op3,op4,e;
Mat mat[N];
void init(){
    e.a[0][0]=e.a[1][1]=e.a[2][2]=1;
    op1.a[0][1]=-1,op1.a[1][0]=1,op1.a[2][2]=1;
    op2.a[0][1]=1,op2.a[1][0]=-1,op2.a[2][2]=1;
    op3.a[0][0]=-1,op3.a[1][1]=1,op3.a[2][2]=1;//op3.a[0][2]=p;
    op4=e,op4.a[1][1]=-1;//op4.a[1][2]=p;

    swap(op1,op2);
}
int main(){
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>p[i].x>>p[i].y,p[i].z=1;
    cin>>m;
    init();
    mat[0]=e;
    for(int i=1,op,p;i<=m;i++){
        cin>>op;
        if(op==1){
            mat[i]=op1.mul(mat[i-1]);
        }else if(op==2){
            mat[i]=op2.mul(mat[i-1]);
        }else if(op==3){
            cin>>p;
            op3.a[0][2]=p*2;
            mat[i]=op3.mul(mat[i-1]);
        }else{
            cin>>p;
            op4.a[1][2]=p*2;
            mat[i]=op4.mul(mat[i-1]);
        }
    }
    cin>>q;
    int a,b;
    while (q--){
        cin>>a>>b;
        vector<ll> ans = mat[a].getans(p[b]);
        cout<<ans[0]<<' '<<ans[1]<<endl;
    }
}

F:
三种转移其实都想清楚了。
但是我TM写的记忆化搜索,然后炸了。
别问,以前就几乎没碰过期望这类的题目x

看的题解 https://atcoder.jp/contests/abc189/editorial/588

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define pdd pair<db,db>
template<class Ty1,class Ty2>
inline const pair<Ty1,Ty2> operator+(const pair<Ty1, Ty2>&p1, const pair<Ty1, Ty2>&p2){
    pair<Ty1, Ty2> ret;
    ret.first = p1.first + p2.first;
    ret.second = p1.second + p2.second;
    return ret;
}
template<class Ty1, class Ty2>
inline const pair<Ty1, Ty2> operator-(const pair<Ty1, Ty2>&p1, const pair<Ty1, Ty2>&p2){
    pair<Ty1, Ty2> ret;
    ret.first = p1.first - p2.first;
    ret.second = p1.second - p2.second;
    return ret;
}
const int N = 2e5+5;
db b[N],k[N];
int n,m,t;
bool c[N];
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>m>>t;
    for(int i=1,x;i<=t;i++)cin>>x, c[x]=1;

    db sum1=0,sum2=0;

    for(int i=n-1;~i;i--){
        sum1 -= b[i + m + 1];
        sum2 -= k[i + m + 1];
        if(c[i]){
            k[i]=1;
            b[i]=0;
        }else{
            b[i]= sum1 / m + 1;
            k[i]= sum2 / m;
        }
        sum1+=b[i];
        sum2+=k[i];
    }
    if(abs(1.0 - k[0]) <= 1e-6)cout << -1 << endl;
    else printf("%.11f\n", b[0] / (1.0 - k[0]));
}

泪目

posted @ 2021-01-23 22:42  MXang  阅读(73)  评论(0编辑  收藏  举报