23年的最后一次周报。
两场cf,毁了我的年前上青梦。
昨晚round917 div2的B感觉是个很厉害的思维题,被卡了很久
题意:自行理解
思路:(set模拟和哈希会mle),在进行k次操作后,字符串将会由后长度为n-k的字符串和前k个字符中的其一组成,所以一个类似前缀和的操作,记录前k个字符中有多少不同的字符,累加起来
代码如下:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;
const int N=2e5+10;
const int mod=131,p=261;
int n;
string s;
bool vi[30];
int cnt;
ll ans;
void solve(){
memset(vi,0,sizeof vi);
ans=cnt=0;
cin >> n >> s;
for(int i=0;i<n;i++){
if(!vi[s[i]-'a']) vi[s[i]-'a']=1,cnt++;
ans+=cnt;
}
cout << ans << "\n";
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _=1;
cin >> _;
while(_--) solve();
return 0;
}
//make it count
//开ll plz
上午来vp了一把round915 div2,被虚拟腐乳了,第二题开始被卡住。
题意:自行理解
思路:可能是有一点点vp的原因,不是很用力在想。一次操作拿下俩叶子节点,答案为叶子数/=2向上取整。
代码如下:
#include <bits/stdc++.h>
using namespace std;
using ll=unsigned long long;
using PII=pair<int,int>;
const int N=1e5+10,M=1e5+10;
const int mod=998244353;
int n;
vector<int>ve[N];
ll ans;
void solve(){
for(int i=1;i<=N;i++) ve[i].clear();
ans=0;
cin >> n;
for(int i=1;i<n;i++){
int u,v;
cin >> u >> v;
ve[u].push_back(v);
ve[v].push_back(u);
}
for(int i=1;i<=n;i++) ans+=ve[i].size()==1;//判断是否为叶子节点
ans&1?ans=ans/2+1:ans/=2;
cout << ans << "\n";
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int O_o=1;
cin >> O_o;
while(O_o--) solve();
return 0;
}
//make it count
//开ll plz
晚上看了下依赖背包问题(困死)。
星期二:
队内打了场训练赛(round15,打的烂,但挺有收获的,晚上把题都给补了,但没空写题解了。
星期三:
把依赖背包板子敲出来了。
板子如下:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;
const int N=1e5+10,M=1e5+10;
const int mod=998244353;
struct nod{
int nex,to;
}e[110];
int hd[110],cnt;
int n;
int m;
int v[110],w[110];
int dp[110][110];
void add(int u,int v){
e[++cnt].to=v;
e[cnt].nex=hd[u];
hd[u]=cnt;
}
void dfs(int x){
for(int i=hd[x];i;i=e[i].nex){
int y=e[i].to;
dfs(y);
for(int j=m-v[x];j>=0;j--){
for(int k=0;k<=j;k++){
dp[x][j]=max(dp[x][j-k]+dp[y][k],dp[x][j]);
}
}
}
for(int i=m;i>=v[x];i--) dp[x][i]=dp[x][i-v[x]]+w[x];
for(int i=0;i<v[x];i++) dp[x][i]=0;
}
void solve(){
cin >> n >> m;
int r;
for(int i=1;i<=n;i++){
int p;
cin >> v[i] >> w[i] >> p;
if(p==-1) r=i;
else add(p,i);
}
dfs(r);
cout << dp[r][m];
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int O_o=1;
// cin >> O_o;
while(O_o--) solve();
return 0;
}
//make it count
//开ll plz
星期四:
做了道23级校赛的题,并查集01背包,差点当成刚学的依赖背包了。比较基础,就不放了。
补补vjudge上开学测验的那几道算法题,刚好适合学新算法。
看了近一下午tarjan算法,没咋懂。
星期五:
昨晚div4 (round 918)上大分,以优秀的罚时a了前六道,非常好!期待明天30号那场。
星期六:
打了杭电的一场比赛,麻。晚上打了cf的goodbye 2023,a题没开ll被hack,居然还加了11分。
周日:
2023的最后一天,成都天气灰蒙蒙的,不是阴天的雾,是霾。
接下来两周要期末考试。