首页 > 其他分享 >10.14考试总结

10.14考试总结

时间:2024-10-14 17:48:34浏览次数:1  
标签:总结 int max mn st 考试 mx 10.14 dp

0+100+0,这也没啥好说的了,反正就差的一批吧……


\(T1\) \(Hunter\)

简单数论题,但 \(lyh\) 从来没有在考试的时候 \(A\) 过数论题。

考虑第一个人挂的时间 \(=\) 其他人比第一个人早挂的概率。

对于第 \(i\) 个人,简化问题,只留第一个人和第 \(i\) 个人,答案就是 \(\dfrac{w_i}{w_1+w_i}\)。

时间复杂度 \(O(n\log n)\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int p=998244353;
int n,w1,ans=1;
int qpow(int x,int y){
	int re=1;
	while(y){
		if(y&1) re=re*x%p;
		x=x*x%p,y>>=1;
	}return re;
}signed main(){
	freopen("hunter.in","r",stdin);
	freopen("hunter.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>w1;
	for(int i=2,w;i<=n;i++)
		cin>>w,ans=(ans+w*qpow(w+w1,p-2))%p;
	cout<<ans;
	return 0;
}

\(T2\) \(Defence\)

思维难度最低的。

很容易想到答案与最大的空缺长度有关,可以通过左移/右移完成,每次最大空缺长度 \(-1\),所以答案就是最大的空缺长度。

但是有一个 \(bug\),就是极左/极右两个区间,这时左移/右移就有了区别。可以看作一个环,所以这两个区间合并起来的长度还要和最大空缺长度取一个 \(\max\)。

合并字数信息想到线段树合并和 \(dsu\ on\ tree+set\)。前者 \(O(n\log n)\),后者 \(O(n\log^2n)\)。本人考场选择了第二种方案(因为好想)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
struct kl{
	int l,r;
	int f(){return r-l-1;}
	friend bool operator<(kl x,kl y){
		if(x.f()!=y.f()) return x.f()>y.f();
		return x.l<y.l;
	}
};set<kl>st[N];
int n,m,qu,ans[N],mn[N],mx[N];
set<int>q[N];vector<int>g[N];
void add(int x,int ad){
	if(q[x].count(ad)) return;
	auto it=q[x].lower_bound(ad);
	int r=(*it),l=(*(--it));
	st[x].erase({l,r});
	st[x].insert({l,ad});
	st[x].insert({ad,r});
	q[x].insert(ad);
}inline void dsu(int x){
	int sn=x,ms=st[x].size();
	for(auto y:g[x]){
		dsu(y),mn[x]=min(mn[x],mn[y]);
		mx[x]=max(mx[x],mx[y]);
		if(st[y].size()>ms)
			sn=y,ms=st[y].size();
	}if(mn[x]>m) return ans[x]=-1,void();
	swap(st[x],st[sn]),swap(q[x],q[sn]);
	for(auto y:g[x]){
		st[y].erase(st[y].begin(),st[y].end());
		while(q[y].size()){
			int now=(*q[y].begin());
			q[y].erase(now),add(x,now);
		}
	}kl c=(*st[x].begin());
	ans[x]=max(m-mx[x]+mn[x]-1,c.f());
}signed main(){
	freopen("defence.in","r",stdin);
	freopen("defence.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>qu;
	for(int i=1,u,v;i<n;i++)
		cin>>u>>v,g[u].push_back(v);
	for(int i=1;i<=n;i++){
		st[i].insert({0,m+1});
		q[i].insert(0),q[i].insert(m+1);
		mn[i]=m+1,mx[i]=0;
	}while(qu--){
		int u,p;cin>>u>>p,add(u,p);
		mx[u]=max(mx[u],p),mn[u]=min(mn[u],p);
	}dsu(1);
	for(int i=1;i<=n;i++)
		cout<<ans[i]<<"\n";
	return 0;
}

\(T3\) \(Connect\)

好题好题。

考虑到最终形态一定是一条链上每个点挂一个点集,所以我们可以枚举链,然后再挂点集。

设 \(dp_{s,i}\) 表示目前已选集合为 \(s\),链尾为 \(i\),则转移方程为:

  1. \(dp_{s\cup t,i}=\max(dp_{s\cup t,i},dp_{s,i}+calc(\{i\}\cup t))\),其中\(calc(s)\) 表示集合 \(s\) 中的所有点间的边长和,保证 \(s\cap t=\emptyset\)。

  2. \(dp_{s\cup\{i\},i}=\max(dp_{s\cup\{i\},i},dp_{s,j}+dis_{i,j})\),其中 \(dis_{i,j}\) 表示 \(i,j\) 间边的长度,保证 \(i,j\) 间必须有边且 \(s\cap\{j\}=\{j\}\) 且 \(s\cap\{i\}=\emptyset\)。

时间复杂度 \(O(3^{(n-1)}n^2)\),提前预处理,可以达到 \(O(3^{(n-1)}+2^nn^2)\),可以通过。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=20,M=1<<15;
int n,m,a[N],d[N][N],dat;
int dp[M][N],calc[M],ans;
void check(int s,int k){
	calc[s]=0;
	for(int i=1;i<=k;i++)
		for(int j=i+1;j<=k;j++)
			if(d[a[i]][a[j]]>0)
				calc[s]+=d[a[i]][a[j]];
}void dfs(int x,int s,int k){
	if(x>n) return check(s,k);
	dfs(x+1,s,k),a[k+1]=x;
	dfs(x+1,s|(1<<(x-1)),k+1);
}signed main(){
	freopen("connect.in","r",stdin);
	freopen("connect.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	memset(d,-0x3f,sizeof(d));
	memset(calc,-0x3f,sizeof(calc));
	memset(dp,-0x3f,sizeof(dp));
	for(int i=1,x,y,w;i<=m;i++)
		cin>>x>>y>>w,d[x][y]=d[y][x]=w,dat+=w;
	dfs(1,0,0),dp[1][1]=0;
	for(int s=3;s<(1<<n);s+=2)
		for(int i=1;i<=n;i++){
			if(!((s>>(i-1))&1)) continue;
			for(int t=((s-1)&s);t;t=((t-1)&s))
				dp[s][i]=max(dp[s][i],dp[t][i]+calc[(1<<(i-1))|(s^t)]);
			for(int j=1;j<=n;j++) if((s>>(j-1))%2&&d[i][j]>0)
				dp[s][i]=max(dp[s][i],dp[s^(1<<(i-1))][j]+d[i][j]);
		}
	cout<<dat-dp[(1<<n)-1][n];
	return 0;
}

标签:总结,int,max,mn,st,考试,mx,10.14,dp
From: https://www.cnblogs.com/chang-an-22-lyh/p/18464699/ks-20241014

相关文章

  • 【软件考试】一文学会原码,反码与补码
    文章目录三码互转十进制数转二进制三码互转在计算机中,数值通常以二进制形式表示,原码、反码和补码是三种不同的表示方法。一、原码概念:原码是最直观的二进制表示法,最高位为符号位,0表示正数,1表示负数,其余位表示数值的绝对值。例如,对于8位二进制数,+5的原码是......
  • 10.7~10.13 总结
    联考的题解还是在这里。做题:ARC125F这就是\(\deg\)做背包。把所有\(\deg\)减一。现在限制是和为\(n-2\),每个数是自然数。有性质:选取和为\(y\)的数的个数连续。设\(L_y\)为最少选的数,\(R_y\)为最多。设有\(z\)个\(0\)。只需证明:\[R_x-L_x\le2z+1\]对于任意方案......
  • redis未授权访问及利用总结
    Redis未授权访问漏洞漏洞原理redis默认端口6379,在默认配置情况下密码为空,因此如果将redis暴露到公网,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据,并且可以利用redis写入shell、写入公钥等危险操作漏洞复现安装redis下载安装包后进行解......
  • 云原生周刊:优化 Uber 的持续部署丨2024.10.14
    开源项目推荐CogCog是将机器学习模型打包到容器的工具。可通过配置将机器学习模型所需的环境和依赖,自动打包到容器里方便部署,让你不再为编写Docker文件和CUDA而痛苦,还能自动启动HTTP接口服务方便调用。KnowStreamingKnowStreaming是功能强大的Kafka集群监控和运维管......
  • ADS1292硬件电路调试总结
    作者:虚生一、前记ADS1292的硬件终于告一段落了。这期间遇到了不少问题,很多都是知识点层面的。最大的问题就是没有详细的了解芯片手册,在使用芯片之前还是应该仔细阅读芯片手册。如果需要ADS1299的芯片手册,可以和我联系。笔者在这里做个梳理。二、解析点重要引脚解析这里要......
  • 毛概考试重点总结
    一1怎么把握毛思的主要内容和活的灵魂新民主主义革命理论(内容)社会主义革命和社会主义建设理论革命军队建设和军事战略理论政策和策略的理论思想政治工作和文化工作理论党的建设理论除此之外国际战略和外交工作的理论实事求是(灵魂)群众路线独立自主2科学认识毛泽东思想的历......
  • 2024.10.14 1105版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 2024.10.14 1020版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 2024.10.14 1005版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 600条最强 Linux 命令总结(珍藏版)
    https://mp.weixin.qq.com/s/O5dauj1TU66skvci_ST9Rw  一、基本命令uname-m显示机器的处理器架构uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件(SMBIOS/DMI)hdparm-i/dev/hda罗列一个磁盘的架构特性hdparm-tT/dev/sda在磁盘上执行测试性读......