2022.10.2
6题 高罚时 , 呃呃。
B. Binary Tree
签到题,队友上来就秒了
#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;
inline void solve(){
int n = 0; cin >> n;
for(int i = 1, u, v; i < n; i++) cin >> u >> v;
if(n & 1) cout << "Alice\n";
else cout << "Bob\n";
}
signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
int t = 1; cin >> t;
while(t--) solve();
return 0;
}
D. Defining Labels
一个类似于进制转换的题目,题意给队友之后队友单切了。
#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;
int k, x;
void dfs(int num){
if(num > k) dfs((num - 1) / k);
cout << (num % k ? num % k : k) + 9 - k;
}
vector<int>ans;
inline void solve(){
ans.clear();
cin >> k >> x;
dfs(x);
cout << endl;
}
signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
int t = 1; cin >> t;
while(t--) solve();
return 0;
}
E. Erasing Numbers
依旧是队友!猜了个结论嗯冲冲过去了。我就提了一嘴对每个数分成01序列考虑。
#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;
const int N = 5e3 + 10;
int a[N], tmp[N];
int n;
int check(int x){
int cnt0 = 0, cnt1 = 0;
for(int i = 1; i <= n; i++){
if(i == x) continue;
tmp[i] = (a[i] < a[x]) ? 0 : 1;
tmp[i] == 0 ? cnt0++ : cnt1++;
}
int det = abs(cnt0 - cnt1);
if(!det) return 1;
int cnt = 0;
for(int i = 1; i <= x - 1; i++){
if(cnt0 > cnt1){
if(tmp[i] == 0) cnt++;
else cnt--;
} else {
if(tmp[i] == 1) cnt++;
else cnt--;
}
cnt = max(cnt, 0ll);
if(cnt == 3) cnt -= 2, det -= 2;
}
cnt = 0;
for(int i = x + 1; i <= n; i++){
if(cnt0 > cnt1){
if(tmp[i] == 0) cnt++;
else cnt--;
} else {
if(tmp[i] == 1) cnt++;
else cnt--;
}
cnt = max(cnt, 0ll);
if(cnt == 3) cnt -= 2, det -= 2;
}
return (det <= 0) ? 1 : 0;
}
inline void solve(){
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n; i++) cout << check(i);
cout << endl;
}
signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
int t = 1; cin >> t;
while(t--) solve();
return 0;
}
G. Game Design
给队友题意之后过了一会儿队友就说想出来了。
按照二的次幂构造即可。
#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;
const int mod=1000000007;
const int N = 2e5 + 10,inf=1e9;
int f[200005],cnt;
int w[200005],x;
vector<int>p;
inline void solve(){
cin>>x;
if(x==1){
cout<<2<<endl;
cout<<1<<endl;
cout<<1<<" "<<inf<<endl;
return;
}
while(x){
p.push_back(x%2);
x/=2;
}
reverse(p.begin(),p.end());
for(auto x:p){
cnt++;
f[cnt]=cnt-1;
}
for(int i=cnt;i;i--){
if(p[cnt-i]){
w[i]=cnt+1-i;
}
else{
w[i]=inf;
}
}
int nowcnt=cnt;
for(int i=1;i<nowcnt;i++){
cnt++;w[cnt]=1;f[cnt]=i;
cnt++;w[cnt]=1;f[cnt]=cnt-1;
}
cout<<cnt<<endl;
for(int i=2;i<=cnt;i++){
cout<<f[i]<<" \n"[i==cnt];
}
for(int i=1;i<=cnt;i++){
cout<<w[i]<<" \n"[i==cnt];
}
}
signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
int t = 1; //cin >> t;
while(t--) solve();
return 0;
}
I. Incoming Asteroids
一个经典的trick,如果一个元素会受多个因素影响可以均等的拆成多份,在任何一个因素达成条件之后可以暴力的ck是否满足全部条件。
这样的暴力复杂度是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn) 的,这题加上一个set维护,复杂度是
O
(
n
l
o
g
2
n
)
O(nlog^2n)
O(nlog2n) 。
注意这题有强制在线和输出末尾不能有空格的要求。
#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
#define pii pair<int,int>
using namespace std;
const int N = 2e5 + 10;
set<pii>st[1000005];
int now[1000005];
int cnt;
vector<pii>p[200005];
int b[200005],need[200005],a[200005];
int n,m,last;
vector<int>ans;
inline void solve(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int op;cin>>op;
if(op==1){
cnt++;
int k,x;cin>>a[cnt]>>k;
a[cnt]^=last;
for(int j=1;j<=k;j++){
cin>>x;
x^=last;
p[cnt].push_back({x,now[x]});
}
need[cnt]=a[cnt]/k;
if(need[cnt]==0)need[cnt]=1;
for(auto [y,cao]:p[cnt]){
st[y].insert({cao+need[cnt],cnt});
}
}
else{
ans.clear();
int x,y;cin>>x>>y;
x^=last;
y^=last;
now[x]+=y;
int tot=0;
while(st[x].size()){
//if(++tot>5)break;
//cout<<st[x].size()<<"???\n";
auto [tmp,u]=*st[x].begin();
//cout<<tmp<<" "<<u<<endl;
//assert(tmp>now[x]);
if(tmp<=now[x]){
for(auto [y,fk]:p[u]){
b[u]+=now[y]-fk;
st[y].erase({fk+need[u],u});
}
if(b[u]>=a[u]){
ans.push_back(u);
}
else{
need[u]=(a[u]-b[u])/p[u].size();
if(need[u]==0)need[u]=1;
for(auto &[y,cao]:p[u]){
cao=now[y];
st[y].insert({cao+need[u],u});
}
}
}
else{
break;
}
}
cout<<ans.size();
last=ans.size();
sort(ans.begin(),ans.end());
for(auto x:ans)cout<<" "<<x;
cout<<endl;
}
}
}
signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
int t = 1; //cin >> t;
while(t--) solve();
return 0;
}
J. Junior Mathematician
经典数位dp,不过取模过多可能导致常数太大而tle35,注意常数即可。
#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
//#define int long long
#define ll long long
#define endl '\n'
using namespace std;
const int mod=1000000007;
const int N = 2e5 + 10;
int fa[N], c[N],m;
string s,t;
vector<int>L,R;
int bs[100005];
ll dp1[5005][62][62],dp2[5005][62][62];
//表示后i个数字,f(x)-x为j,后缀数位和为k的方案数
//1是小于等于,2是大于
void cg(string &s,vector<int>&p){
p.emplace_back(0);
for(auto x:s){
p.emplace_back(x-'0');
}
}
void init(){
cin>>s>>t>>m;
L.clear();R.clear();
cg(s,L);cg(t,R);
bs[0]=1;
for(int i=1;i<=5000;i++){
bs[i]=bs[i-1]*10%m;
}
}
ll dfs(vector<int>&p){
int n=p.size()-1;
for(int i=0;i<=n;i++){
for(int j=0;j<m;j++){
for(int k=0;k<m;k++){
dp1[i][j][k]=dp2[i][j][k]=0;
}
}
}
dp1[n][0][0]=1;
for(int i=n;i;i--){
for(int t=0;t<=9;t++){
for(int j=0;j<m;j++){
for(int k=0;k<m;k++){
int nowk=k+t,nowj=(j+t*(k-bs[n-i]+m))%m;
if(nowk>=m)nowk%=m;
if(t>p[i]){
(dp2[i-1][nowj][nowk]+=dp1[i][j][k]+dp2[i][j][k])%=mod;
}
else if(t<p[i]){
(dp1[i-1][nowj][nowk]+=dp1[i][j][k]+dp2[i][j][k])%=mod;
}
else{
(dp2[i-1][nowj][nowk]+=dp2[i][j][k])%=mod;
(dp1[i-1][nowj][nowk]+=dp1[i][j][k])%=mod;
}
}
}
}
}
ll ans=0;
for(int i=0;i<m;i++){
(ans+=dp1[0][0][i])%=mod;
}
return ans;
}
inline void solve(){
init();
int sum=0,res=0,fk=0;
for(auto x:L){
res=(res+sum*x)%m;
(sum=sum+x)%=m;
fk=(fk*10+x)%m;
}
//cout<<dfs(R)<<" !! "<<dfs(L)<<endl;
cout<<(dfs(R)-dfs(L)+2*mod+(res==fk))%mod<<endl;
}
signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
int t = 1; cin >> t;
while(t--) solve();
return 0;
}