忽然看到有电子竞技就打了下
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
", b[0] / (1.0 - k[0]));
}
泪目