前20分钟做题,后面看题,二题战士,赛后补题www
A - Permutation Forgery
直接逆序输出即可
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[110];
int main()
{IO;int T;cin>>T;while(T--){cin>>n;for(int i=0;i<n;i++) cin>>a[i];reverse(a,a+n);for(int i=0;i<n;i++) cout<<a[i]<<' ';cout<<endl;}return 0;
}
B - Array Cancellation
考虑一个数组中的一个负数,如何至少花费多少代价变为0。
如果前面没有正数必须要花费硬币,否则就和前面的正数抵消。对于花费硬币就和最后面的正数抵消,维护前缀和瞎搞一下即可。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010;
int n;
ll a[N];
ll s[N];
int main()
{IO;int T;cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];ll res=0;for(int i=1;i<=n;i++)if(a[i]<0) res-=min(0ll,s[i-1]+res+a[i]);cout<<res<<endl;}return 0;
}
C - Balanced Bitstring
这题一直没想出来,赛后看题解也想了一会儿,我好菜啊
考虑对于长度为kkk的窗口在原串上移动,移动的过程中最前面的字符被弹出窗口s[i]s[i]s[i],新加入一个字符s[i+k]s[i+k]s[i+k],如果要保证窗口内111的数量和000的数量不变,那么必须满足s[i]=s[i+k]s[i]=s[i+k]s[i]=s[i+k],如果上述条件满足能够保证所有长度为kkk的子串111的数量和000的数量相等,在只需判断第一个窗口内111的个数和000的个数是否不大于k2\frac{k}{2}2k即可
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=300010;
int n,k;
int a[N];
int main()
{IO;int T;cin>>T;while(T--){cin>>n>>k;for(int i=0;i<=n;i++) a[i]=-1;string s;cin>>s;bool ok=1;for(int i=0;i<n;i++){int j=i%k;if(s[i]=='?') continue;else{if(a[j]==-1)a[j]=s[i]-'0';else{if(a[j]!=s[i]-'0')ok=0;}}}if(ok){int cnt0=0,cnt1=0;for(int i=0;i<k;i++) cnt0+=a[i]==0,cnt1+=a[i]==1;if(cnt0>k/2||cnt1>k/2) ok=0;}if(ok) cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0;
}
D - Tree Tag
Bob想要赢的充要条件
① 最初的dist(a,b)>dadist(a,b) >dadist(a,b)>da
如果不满足,第一步直接就可以到b所在的点
② 树的直径>2×da>2×da>2×da
如果不满足,a可以想办法跳到树的中心,然后就在一步之内到达任意点
③ db>2×dadb>2×dadb>2×da
如果不满足,每次a想办法与b保持da的距离,那么b一定不断远离a,知道不能远离的时候就不能跳出范围,然后就输了。
这也太难想了吧,想出来的都是神仙
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=100010;
int n,a,b,da,db;
int h[N],e[N*2],ne[N*2],idx;
int dep[N];
int dlen;
void add(int a,int b)
{e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
int dfs1(int u,int fa)//树的直径
{int d1=0,d2=0;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa) continue;int d=1+dfs1(j,u);if(d>d1) d2=d1,d1=d;else if(d>d2) d2=d;}dlen=max(dlen,d1+d2);return d1;
}
void dfs2(int u,int fa)//求初始的dist(a,b)
{dep[u]=dep[fa]+1;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa) continue;dfs2(j,u);}
}
int main()
{IO;int T;cin>>T;while(T--){cin>>n>>a>>b>>da>>db;for(int i=1;i<=n;i++) h[i]=-1,dep[i]=0;idx=0;dlen=0;for(int i=1;i<n;i++) {int a,b;cin>>a>>b;add(a,b),add(b,a);}dfs1(1,0);dfs2(a,0);int dist=dep[b]-dep[a];if(dist>da&&dlen>2*da&&db>2*da) cout<<"Bob"<<endl;else cout<<"Alice"<<endl;}return 0;
}
要加油哦~