23.12.31周报(赛后康复训练,期末复习阶段)

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的最后一天,成都天气灰蒙蒙的,不是阴天的雾,是霾。

接下来两周要期末考试。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值