首页 > 其他分享 >2024.9.14

2024.9.14

时间:2024-09-14 22:02:26浏览次数:9  
标签:cnt 14 val int 2024.9 top ++ dp

今日总结:
1:约数个数和
这道题主要是一道数学题,主要的推到过程需要用到莫比乌斯反演,但是在求第一步用分块处理出1~n内的f(i)的值,再用线性筛求出u(i)的值和他的前缀和,我卡在了最后一步对原式进行数论分块

点击查看代码
#include<bits/stdc++.h>

using namespace std;

const int N = 5e4 + 10;
typedef long long LL;

int t,cnt;
int p[N],mu[N],sum[N];
LL g[N];
bool v[N];

void init(int n)
{
	mu[1] = 1;
	for(int i = 2;i <= n;i ++)
	{
		if(!v[i])
		{
			p[ ++ cnt] = i;
			mu[i] = -1;
		}
		for(int j = 1;j <= cnt && p[j] * i <= n;j ++)
		{
			v[p[j] * i] = 1;
			if(i % p[j] == 0) break;
			else mu[i * p[j]] = -mu[i];
		}
	}
	for(int i = 1;i <= n;i ++)
		sum[i] = sum[i - 1] + mu[i];
	for(int i = 1;i <= n;i ++)
	{
		LL res = 0;
		for(int l = 1,r;l <= i;l = r + 1)
		{
			r = (i / (i / l));
			res += 1LL * (r - l + 1) * 1ll * (i / l);
		}
		g[i] = res;
	}
}

int main()
{
	scanf("%d",&t);
	init(50000);
	while(t --)
	{
		int n,m;
		scanf("%d %d",&n,&m);
		LL res = 0;
		for(int l = 1,r;l <= min(n,m);l = r + 1)
		{
			r = min(n / (n / l),m / (m / l));
			res += (sum[r] - sum[l - 1]) * 1ll * g[n / l] * 1ll * g[m / l];
		}
		printf("%lld\n",res);
	}
	return 0;
}

2:硬币购物
动态转移方程如下:

dp[j] += dp[j - c[i]];

res += pm[cnt % 2] * (tmp >= 0 ? dp[tmp] : 0);

点击查看代码
#include<bits/stdc++.h>

using namespace std;

#define int long long
const int N = 4;
const int Max = 1e5 + 10;
const int pm[] = {1,-1};

int tot,s;
int c[N],d[N],dp[Max] = {1};

signed main()
{
	for(int i = 0;i < 4;i ++)
	{
		scanf("%lld",&c[i]);
		for(int j = c[i];j < Max;j ++)
			dp[j] += dp[j - c[i]];
	}
	scanf("%lld",&tot);
	while(tot --)
	{
		for(int i = 0;i < 4;i ++)
			scanf("%lld",&d[i]);
		scanf("%lld",&s);
		int res = 0;
		for(int i = 0;i < 16;i ++)
		{
			int tmp = s,cnt = 0;
			for(int j = 0;j < 4;j ++)
			{
				if((i >> j) & 1)
				{
					cnt ++;
					tmp -= (d[j] + 1) * c[j];
				}
			}
			res += pm[cnt % 2] * (tmp >= 0 ? dp[tmp] : 0);
		}
		printf("%lld\n",res);
	}
	return 0;
}

3:
雨天的尾巴
此题为一道线段树合并的板子题

点击查看代码
#include<bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10;
const int M = 6e6 + 10;
typedef long long ll;

int n,m,cnt,R,num;
int l[M],r[M],d[M],t[M];
int top[N],fa[N],head[N],deep[N],son[N],sum[N],X[N],Y[N],Z[N],rt[N],Ans[N];

struct Node
{
	int val,nxt;
}e[N << 1];

inline void add(int x,int y)
{
	e[++ num].val = y;
	e[num].nxt = head[x];
	head[x] = num;
}

inline void dfs_1(int x)
{
	sum[x] = 1;
	int Max = -1;
	for(int i = head[x];i;i = e[i].nxt)
	{
		if(!deep[e[i].val])
		{
			deep[e[i].val] = deep[x] + 1;
			fa[e[i].val] = x;
			dfs_1(e[i].val);
			sum[x] += sum[e[i].val];
			if(sum[e[i].val] > Max) Max = sum[e[i].val],son[x] = e[i].val;
		}
	}
}

inline void dfs_2(int x,int topp)
{
	top[x] = topp;
	if(!son[x]) return;
	dfs_2(son[x],topp);
	for(int i = head[x];i;i = e[i].nxt)
	{
		if(!top[e[i].val])
			dfs_2(e[i].val,e[i].val);
	}
}

inline int Lca(int x,int y)
{
	while(top[x] != top[y])
	{
		if(deep[top[x]] < deep[top[y]]) swap(x,y);
		x = fa[top[x]];
	}
	if(deep[x] < deep[y]) return x;
	return y;
}

inline void pushup(int a)
{
	if(d[l[a]] >= d[r[a]])
	{
		d[a] = d[l[a]];
		t[a] = t[l[a]];
	}
	else
	{
		d[a] = d[r[a]];
		t[a] = t[r[a]];
	}
}

inline int query(int a,int x,int y,int pos,int val)
{
	if(!a) a = ++ cnt;
	if(x == y)
	{
		d[a] += val;
		t[a] = x;
		return a;
	}
	int mid = (x + y) / 2;
	if(pos <= mid) l[a] = query(l[a],x,mid,pos,val);
	else r[a] = query(r[a],mid + 1,y,pos,val);
	pushup(a);
	return a;
}

inline int merge(int a,int b,int x,int y)
{
	if(!a) return b;
	if(!b) return a;
	if(x == y)
	{
		d[a] += d[b];
		t[a] = x;
		return a;
	}
	int mid = (x + y) / 2;
	l[a] = merge(l[a],l[b],x,mid);
	r[a] = merge(r[a],r[b],mid + 1,y);
	pushup(a);
	return a;
}

inline void redfs(int x)
{
	for(int i = head[x];i;i = e[i].nxt)
	{
		if(deep[e[i].val] > deep[x])
		{
			redfs(e[i].val);
			rt[x] = merge(rt[x],rt[e[i].val],1,R);
		}
	}
	if(d[rt[x]]) Ans[x] = t[rt[x]];
}

int main()
{
	scanf("%d %d",&n,&m);
	int x,y;
	for(int i = 1;i < n;i ++)
	{
		scanf("%d %d",&x,&y);
		add(y,x),add(x,y);
	}
	deep[1] = 1;
	dfs_1(1),dfs_2(1,1);
	for(int i = 1;i <= m;i ++)
	{
		scanf("%d %d %d",&X[i],&Y[i],&Z[i]);
		R = max(R,Z[i]);
	}
	for(int i = 1;i <= m;i ++)
	{
		int lca = Lca(X[i],Y[i]);
		rt[X[i]] = query(rt[X[i]],1,R,Z[i],1);
		rt[Y[i]] = query(rt[Y[i]],1,R,Z[i],1);
		rt[lca] = query(rt[lca],1,R,Z[i],-1);
		if(fa[lca]) rt[fa[lca]] = query(rt[fa[lca]],1,R,Z[i],-1);
	}
	redfs(1);
	for(int i = 1;i <= n;i ++)
		printf("%d\n",Ans[i]);
	return 0;
}

标签:cnt,14,val,int,2024.9,top,++,dp
From: https://www.cnblogs.com/lucky-myself/p/18414583

相关文章

  • 2024.9.13 总结(考 DP)
    (实际上是2024.9.14写的)本来以为是考DS的。()T1题目里给的那个性质可能是来干扰的。异或上右移一位的数,其实就是除了第一位(最左边的),算贡献的时候都要看这一位异或前一位是不是1。于是随便线性DP,状态里记一下当前位填0还是1就行了。DP数组状态的第一维可以不要,省空......
  • BZOJ4144 Petrol
    最小生成树+最短路+并查集维护题目#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=2e5+100,M=N*2;intn,m,s;inth[N],e[M],ne[M],w[M],idx;intdis[N],pos[N];boolvis[N];intf[N];inta[N]; boolans[N];intq;structNODE{......
  • 2024-09-14:用go语言,给定一个正整数数组 nums,定义一个加密函数 encrypt(x),其将一个整数
    2024-09-14:用go语言,给定一个正整数数组nums,定义一个加密函数encrypt(x),其将一个整数x的每一位数字都替换为x中的最大数字,然后返回加密后的数字。例如,encrypt(523)会返回555,encrypt(213)会返回333。现在需要计算数组中所有元素加密后的和,然后返回这个和。输入:nums=[10,2......
  • 360 9.14笔试
    第二题大模拟真的有点折磨了第一题给出m种饮料,每种饮料只有一杯,接下来有n个客人,每个客人有两种想喝的饮料,请问最多能满足多少位客人。数据范围比较小n=20,所以直接暴力求解#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,m;cin>>n>>......
  • 虾皮9.14笔试
    三道都是简化的板子题第一题给出每个位置的过路费,求从左上角到右下角的最小花费是多少。只允许往下或者往右走。数据范围只有100直接暴力搜索即可。intminPathSum(vector<vector<int>>&grid){intm=grid.size();intn=grid[0].size();intres=......
  • 京东9.14笔试
    被美团挂的第二天早上神志不清,第三题写错了距离计算函数,人麻了第一题将数组划分成两个区间,要求区间和乘积最小。经典的前缀和+枚举即完成#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+5;inth[N];intmain(){intn;cin>>n;......
  • 2024.9.13(周五)
    完成机器学习查询数据集的作业数据集名称样本数属性属性个数标签任务Iris数据集150花萼长度,花萼宽度,花瓣长度,花瓣宽度4鸟类(Setosa,Versicolor,Virginica)分类MNIST数据集70,000像素值(28x28像素)784手写数字(0-9)分类Titanic数据集891乘客ID,船舱......
  • SS240914A. 神灵庙(desire)
    SS240914A.神灵庙(desire)问一棵有\(n\)个叶子的任意形态的二叉树,左儿子边权是\(1\),右儿子边权是\(2\),给叶子任意顺序附上\(a_i\)的权值,问\(\sumdep_ia_i\)最小。首先如果树的形态确定了,显然是深度大的叶子选小的\(a_i\)。(注:这里的深度都是只带权到根的距离)因为是树......
  • 0914鲜花——开学以来
    开学了,这是好的,久违的一切都变得熟悉起来秋风清爽,感受到了与HL完全不同的心胸开阔我喜欢秋天的每一个你回头看看开学以来的两周,无疑是不好与好共存的有些事让我心碎又给我安慰有些事令我气愤又令我沉潜有些人令我重读又令我发现短短两周,变i的我品味了人间百态有重启模飞的......
  • 9.14 模拟赛
    A.矩形小C有一个\(n\timesn\)的矩阵,每个格子有一个颜色\(a_{i,j}\len\)。给定\(k\),你需要计算出对于所有格子,以这个格子为左上角的最大正方形,满足内部颜色数量不超过\(k\)。\(n\le500\)。枚举左上角\(i,j\),二分正方形的边长,然后用\(|a|\)的复杂度求这个正......