26.3.24 1600-1900 板刷日记
2181 F. Fragmented Nim
tag:博弈论
谁先给对手送去一个大于 \(1\) 的堆,谁就必输
判断 \(1\) 的个数就行
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int n;
cin>>n;
vector<int> a(n+1);
int cnt=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==1) cnt++;
}
if(cnt==n){
if(n&1) cout<<"Alice\n";
else cout<<"Bob\n";
}
else{
if(cnt&1) cout<<"Bob\n";
else cout<<"Alice\n";
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
}
2201 A1. Lost Civilization (Easy Version)
tag: 单调栈,贪心,妙妙题
用一个栈,把数从后往前放进去,能消掉就消掉,得到 Easy Version 的答案
同时,也得到每个数字,前面最近的可以把它消掉的数字位置 (Hard Version 需要用到)
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int n;
cin>>n;
vector<int> a(n+1);
for(int i=1;i<=n;i++){
cin>>a[i];
}
vector<int> stk;
for(int i=n;i>=1;i--){
while(stk.size() && a[i]+1==stk.back()){
stk.pop_back();
}
stk.push_back(a[i]);
}
cout<<stk.size()<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
}
2201 A2. Lost Civilization (Hard Version)
经典计算每个点的贡献,计算每个点会在多少个区间内有贡献即可
如果这个区间的左端点,超过了这个可以消掉当前数字的最近数字位置,则当前数字不会对当前区间产生贡献
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int n;
cin>>n;
vector<int> a(n+1);
int ans=0;
for(int i=1;i<=n;i++){
cin>>a[i];
}
vector<int> L(n+1);
vector<int> stk;
for(int i=n;i>=1;i--){
while(stk.size() && a[i]+1==a[stk.back()]){
L[stk.back()]=i;
stk.pop_back();
}
stk.push_back(i);
}
for(int i=1;i<=n;i++){
ans+=(i-L[i])*(n-i+1);
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
}
2196 B. Another Problem about Beautiful Pairs
tag: 根号分治
分类讨论 \(a[i]\) 是否大于 \(\sqrt n\) 即可
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int n;
cin>>n;
vector<int> a(n+1);
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
int B=sqrt(n);
//ai * aj = j-i
for(int i=1;i<=B;i++){
for(int j=1;j<=n;j++){
//idx= j - ai*aj
int idx=j-i*a[j];
if(idx>=1 && idx<=n && a[idx]==i) ans++;
}
}
for(int i=1;i<=n;i++){
if(a[i]<=B) continue;
for(int aj=1;aj<=B;aj++){
int j=a[i]*aj+i;
if(j>=1 && j<=n && a[j]==aj) ans++;
}
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
}
2195 E. Idiot First Search
tag: DFS,树上 DP
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 1e9+7;
void solve(){
int n;
cin>>n;
vector<vector<int>> g(n+1);
g[0].push_back(1);
for(int i=1;i<=n;i++){
int u,v;
cin>>u>>v;
if(u==0 && v==0) continue;
g[i].push_back(u);
g[i].push_back(v);
}
vector<int> f(n+1);
vector<int> ans(n+1);
auto dfs=[&](auto dfs,int u,int pre)-> void {
if(g[u].size()==0){
f[u]=1;
}
else{
for(auto v:g[u]){
dfs(dfs,v,u);
f[u]+=f[v];
}
f[u]+=3;
f[u]%=mod;
}
};
dfs(dfs,1,0);
queue<int> q;
q.push(1);
ans[1]=f[1];
vector<int> st(n+1);
st[0]=1,st[1]=1;
while(q.size()){
auto u=q.front();
q.pop();
for(auto v:g[u]){
if(st[v]) continue;
st[v]=1;
ans[v]=ans[u]+f[v];
ans[v]%=mod;
q.push(v);
}
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
}

浙公网安备 33010602011771号