钉耙编程(3)

news2025/1/13 15:52:18

1001深度自同构

Problem Description

对于无向图中的点,定义一个点的度为与其相连的边的条数。

对于一棵有根树,定义一个点的深度为该点到根的距离。

对于由若干有根树构成的森林,定义该森林是深度自同构的,当且仅当森林中任意两个深度相同的节点都有相同的度。

请计数有多少个深度自同构的无编号有根树森林,使得其恰好由 nn 个节点构成,答案对 998244353998244353 取模。

Input

一个整数 N (1≤N≤106)N (1≤N≤106),代表计数的范围。

Output

输出一行 NN 个整数,第 ii 个数代表 n=in=i 时的答案,对 998244353998244353 取模。

标准代码:

#include<bits/stdc++.h>
using namespace std;
#define N 1000007
#define mod 998244353
int f[N] = {0, 1}, ans[N];
int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	int n; cin >> n; 
//   也可以这样写 
//	for (int i = 1; i <= n; ++i) 
//		for (int j = i; j <= n; j += i)  (f[j+1]+=f[i])%=mod;
	for (int i = 1; i <= n; i++)
		for (int j = 1; i * j <= n; j++) (f[j * i + 1] += f[i]) %= mod;
	for (int i = 1; i <= n; ++i) 
		for (int j = i; j <= n; j += i) (ans[j] += f[i]) %= mod;
	for (int i = 1; i <= n; ++i) printf("%d ", ans[i]);
	return 0;
}

1007 单峰数列

Problem Description

对于一个整数数列,如果其先严格递增,然后在某一点后严格递减,我们称这个数列为单峰数列(严格递增和严格递减的部分均要是非空)。

给定长度为 𝑛n 的整数数列 𝑎1,𝑎2,…,𝑎𝑛a1​,a2​,…,an​ ,请你支持 𝑞q 次操作:

  1. 1 l r x:将 𝑎𝑙,𝑎𝑙+1,…,𝑎𝑟al​,al+1​,…,ar​ 的每个数加 𝑥x。

  2. 2 l r:判断 𝑎𝑙,𝑎𝑙+1,…,𝑎𝑟al​,al+1​,…,ar​ 的元素是否全都相同。

  3. 3 l r:判断 𝑎𝑙,𝑎𝑙+1,…,𝑎𝑟al​,al+1​,…,ar​ 是否严格升序排序。当 𝑙=𝑟l=r 时,认为符合严格升序排序。

  4. 4 l r:判断 𝑎𝑙,𝑎𝑙+1,…,𝑎𝑟al​,al+1​,…,ar​ 是否严格降序排序。当 𝑙=𝑟l=r 时,认为符合严格降序排序。

  5. 5 l r:判断 𝑎𝑙,𝑎𝑙+1,…,𝑎𝑟al​,al+1​,…,ar​ 是否为单峰数列。保证 𝑟−𝑙+1≥3r−l+1≥3。

Input

第一行输入包含一个整数 𝑛 (3≤𝑛≤105)n (3≤n≤105)。

第二行输入包含 𝑛n 个整数 𝑎1,𝑎2,…,𝑎𝑛 (0≤𝑎𝑖≤109)a1​,a2​,…,an​ (0≤ai​≤109)。

第三行输入包含一个整数 𝑞 (1≤𝑞≤2×105)q (1≤q≤2×105)。

接下来的 𝑞q 行,每行描述一个操作,格式见题目描述。对于第一类操作,保证 −109≤𝑥≤109−109≤x≤109。

Output

对于每个询问输出一行一个整数,如果查询符合要求输出 1,否则输出 0

 

解析:

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef array<int, 4> state;
const int MAXN = 200000+5;
ll a[MAXN], b[MAXN];
state tr[MAXN<<2]; //线段树开4倍 
int n, q;
state unite(state a, state b){
    state tmp;
    tmp[0] = a[0] & b[0];
    tmp[1] = a[1] & b[1];
    tmp[2] = a[2] & b[2];
    tmp[3] = (a[1] & b[2]) | (a[1] & b[3]) | (a[3] & b[2]);
    return tmp;
}
void up(int x){
    tr[x] = unite(tr[x<<1], tr[x<<1|1]);
}
void build(int p,int l,int r){
	if(l==r){
		if (b[l] == 0) tr[p][0] = 1;
        else if (b[l] > 0) tr[p][1] = 1;
        else tr[p][2] = 1;
        return;
	}
	int mid=r+l>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	up(p);
}
void update(int p,int l,int r,int x,int v){
	if(l==r&l==x){
		b[l]+=v;
		if (b[l] == 0) tr[p][0] = 1;
        else if (b[l] > 0) tr[p][1] = 1;
        else tr[p][2] = 1;
        return;
	}
	int mid=l+r>>1;
	if(x<=mid) update(p<<1,l,mid,x,v);
	else update(p<<1|1,mid+1,r,x,v);
	up(p);
}
state query(int p,int l,int r,int L,int R){ //现在:l,r 要查:L,R;
    if(l>=L&&r<=R){
      	return {tr[p][0], tr[p][1], tr[p][2], tr[p][3]};
	}
	int mid=l+r>>1;
	if(R<=mid) return query(p<<1,l,mid,L,R);
	else if(L>mid) return query(p<<1|1,mid+1,r,L,R);
	else{
		state left=query(p<<1,l,mid,L,R);
		state rigth=query(p<<1,l,mid,L,R);
		return unite(left,rigth);
	}
}
int main(){
	cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        b[i] = a[i] - a[i-1];
    }
    build(1, 2, n);
    cin >> q;
    while(q--){
        int op, l, r, x;
        cin >> op >> l >> r;
        if(op == 1){
            cin >> x;
            if(l > 1) update(1, 2, n, l, x);
            if(r < n) update(1, 2, n, r+1, -x);
        } else if(op == 2){
            if(l == r){
                cout << "1\n";
                continue;
            }
            cout <<query(1,2,n,l+1,r)[0]<<endl;
        }else if(op==3){
        	 if(l == r){
                cout << "1\n";
                continue;
            }
            cout <<query(1,2,n,l+1,r)[1]<<endl;
		}else if(op==4){
        	 if(l == r){
                cout << "1\n";
                continue;
            }
            cout <<query(1,2,n,l+1,r)[2]<<endl;
		}else{
			cout <<query(1,2,n,l+1,r)[3]<<endl;
		}
	}
	return 0;
}

1008比特跳跃

Problem Description

比特国由 nn 个城市组成,编号为 1,2,⋯,n1,2,⋯,n。

有 mm 条双向道路连接这些城市,第 ii 条连通城市 uiui​ 和城市 vivi​,通过这条道路需要花费 titi​ 的时间。

此外,比特国的人们还可以使用“比特跳跃“来通行于任意两个城市之间。

从城市 xx 通过比特跳跃移动到城市 yy 需要花费 k×(x∣y)k×(x∣y) 的时间,其中 ∣∣ 表示按位或。比特跳跃可以使用任意多次。

现在请你计算出,从 11 号城市移动到每个城市所需的最短时间。

Input

第一行一个整数 t (1≤t≤15)t (1≤t≤15),代表数据组数。

对于每组数据:

第一行三个整数 n,m,k (2≤n≤105,0≤m≤105,0≤k≤106)n,m,k (2≤n≤105,0≤m≤105,0≤k≤106),代表城市个数,道路条数,比特跳跃的系数。

接下来 mm 行,每行三个整数 ui,vi,ti (1≤ui,vi≤n,0≤ti≤109)ui​,vi​,ti​ (1≤ui​,vi​≤n,0≤ti​≤109) ,代表一条道路的信息。

保证所有测试数据的 ∑n≤106,∑m≤106∑n≤106,∑m≤106 。

Output

对于每组数据,输出一行 n−1n−1 个整数,代表从 11 号城市移动到编号为 2,3,…,n2,3,…,n 的城市所需的最短时间。

解析:

代码:

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=1e5+5;
struct point{
	int id,val;  //起始点到该点当前的距离 
	bool operator <(const point &n1)const{
	    return val>n1.val;   //从小到大     
	} 
};
priority_queue<point>q;
int h[N],v[2*N],ne[2*N],w[2*N];
int vist[N],ans[N]; //是否收录进最优路线,起始点到该点当前的距离;
int idx; //从1开始 
int mind[N];
void add(int a,int b,int c){
    ne[++idx]=h[a];	h[a]=idx; v[idx]=b; w[idx]=c;
}
int lowbit(int i){
	return i&(-i);
}
int main(){
//	freopen("D:\\1008(4).txt","w",stdout);
	int t; cin>>t;
	while(t--){
	    memset(ans,0x3f,sizeof(ans));
	    memset(vist,0,sizeof(vist));
		int n,m,k; scanf("%d%d%d",&n,&m,&k);
		for(int i=1;i<=m;i++){
			int a,b,c; scanf("%d%d%d",&a,&b,&c); 
		    add(a,b,c);
		    add(b,a,c);
		}
		 for(int j=2;j<=n;++j) add(1,j,1ll*k*(1|j));
		q.push({1,0});
	    while(q.size()){
	       point tp=q.top(); q.pop();
	       if(vist[tp.id]) continue;
	       vist[tp.id]=1;
	       ans[tp.id]=tp.val;
	       for(int i=h[tp.id];i;i=ne[i])
	   	     if(ans[tp.id]+w[i]<ans[v[i]]){
	   	        ans[v[i]]=ans[tp.id]+w[i];
	     	    q.push({v[i],ans[v[i]]});
	          }
    	}
    	printf("%d ",ans[2]);
    	for(int i=3;i<=n;i++)
    	   printf("%d ",ans[i]);
    	printf("\n");
    	for(int i=1;i<=n;i++) mind[i]=ans[i];
    	for(int i=2;i<=n;i++){
    		if(i==lowbit(i)) continue;
    		for(int j=1;j<=n;j<<=1)
    		   if (i&j) mind[i]=min(mind[i],mind[i^j]);
    		if(mind[i]+1ll*k*i<ans[i]) ans[i]=mind[i]+1ll*k*i;
		}
		
		for (int i=1;i<=n;++i) vist[i]=0, q.push({i,ans[i]});
		while(q.size()){
	       point tp=q.top(); q.pop();
	       if(vist[tp.id]) continue;
	       vist[tp.id]=1;
	       ans[tp.id]=tp.val;
	       for(int i=h[tp.id];i;i=ne[i])
	   	     if(ans[tp.id]+w[i]<ans[v[i]]){
	   	        ans[v[i]]=ans[tp.id]+w[i];
	     	    q.push({v[i],ans[v[i]]});
	          }
    	}
    	printf("%d ",ans[2]);
    	for(int i=3;i<=n;i++)
    	   printf("%d ",ans[i]);
    	printf("\n");
	}
}

1011 抓拍

Problem Description

学校里有 𝑛n 名同学,初始时第 𝑖i 位同学从 (𝑥𝑖,𝑦𝑖)(xi​,yi​) 出发,以每秒 11 米的速度散步。

同学们散步的方向有东南西北四种可能。假设有一位同学正在位于 (0,0)(0,0),则下一秒︰

  • 如果向东走,到达 (1,0)(1,0)
  • 如果向西走,到达 (−1,0)(−1,0)
  • 如果向南走,到达 (0,−1)(0,−1)
  • 如果向北走,到达 (0,1)(0,1)

假设散步过程会进行无限长的时间,同学们散步的方向不会改变,并且忽略碰撞的情况(允许某个时刻多人在同一个点,互不影响)。

现在你可以选择某个非负整数秒时刻抓拍照片。

一张照片可以用长方形 ((𝑒,𝑛),(𝑤,𝑠))((e,n),(w,s)) 表示,东北角为 (𝑒,𝑛)(e,n),西南角为 (𝑤,𝑠)(w,s)。

只有抓拍的照片包含了所有同学时,我们才称这张照片是完美的。

请选择某个时刻抓拍一张完美的照片,使得照片的周长最小。

Input

第一行一个整数 𝑛 (1≤𝑛≤2×105)n (1≤n≤2×105),代表人数。

接下来 𝑛n 行,第 𝑖i 行包含两个整数 𝑥𝑖,𝑦𝑖 (−109≤𝑥𝑖,𝑦𝑖≤109)xi​,yi​ (−109≤xi​,yi​≤109) 和一个字符 𝑑𝑖di​ ,由空格分隔,描述第 𝑖i 位同学。

𝑑𝑖di​ 是 'E', 'W', 'S', 'N' 之一,分别代表第 𝑖i 位同学散步的方向是东、西、南、北。

Output

输出一行一个整数,代表最短的完美照片的周长。

解析:

三分法:时间复杂度是log(1.5)^(n);求单峰函数的最值。

当n=1e9时log(1.5)^(n)=50;log(2)^(n)=30;

核心代码:

代码:

#include<iostream>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int x[N],y[N],fid[N];
int fx[4]={1,-1,0,0};
int fy[4]={0,0,-1,1};
int n;
ll check(ll t){
	ll mxx,mxy,mnx,mny;
	mxx=mxy=-0x3f3f3f,mnx=mny=0x3f3f3f;
	for(int i=1;i<=n;i++){
		ll tpx=x[i]+t*fx[fid[i]],tpy=y[i]+t*fy[fid[i]];
		mxx=max(mxx,tpx);
		mxy=max(mxy,tpy);
		mnx=min(mnx,tpx);
		mny=min(mny,tpy);
	}
	return (mxx-mnx)+(mxy-mny);
}
int main(){
    cin>>n;
	for(int i=1;i<=n;i++){
		char op;
		scanf("%d%d %c",&x[i],&y[i],&op);
		if(op=='E') fid[i]=0;
		else if(op=='W') fid[i]=1;
		else if(op=='S') fid[i]=2;
		else fid[i]=3;
	}
	ll l=0,r=2e9;
	ll tpl,tpr;
	while(l<=r){
		tpl=l+(r-l)/3,tpr=r-(r-l)/3;
		if(check(tpl)<=check(tpr)) r=tpr-1;
		else l=tpl+1;
	} 
	printf("%lld",2*check(l));
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1968511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Java]基础语法

注释 注释就是程序中对代码进行解释说明的文字 生效范围: 注释不影响程序执行, 因为运行的字节码文件中不保留注释 字面量 数据在程序中的书写格式称为字面量 变量 在内存中开辟一块区域, 用来存储数据, 这块空间称为变量 定义变量 使用变量 变量的优势 便于数据的扩展和…

【LeetCode每日一题】搜索旋转排序数组

分析 二分 以4 5 6 7 0 1 2为例&#xff0c;发现将数组分割成两半后&#xff0c;总存在一边是有序 &#xff0c;有序的那一部分可以使用二分 4|5 6 7 0 1 2 4 5|6 7 0 1 2 4 5 6|7 0 1 2 4 5 6 7|0 1 2 4 5 6 7 0|1 2 4 5 6 7 0 1|2分为三种情况 因为没有重复元素&#xff0…

RAGflow:开源AI框架的创新与应用

在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为各行各业不可或缺的一部分。特别是在文档处理和数据分析领域&#xff0c;AI的应用更是无处不在。今天&#xff0c;我要向大家介绍一个开源的AI框架引擎——RAGflow。它能够在深度文档理解方面执…

情感推理在医疗领域的应用

关键词&#xff1a;情感推理、情感分类、多模态大模型、语音识别、思维链 医疗领域中人工智能&#xff08;AI&#xff09;的决策透明度至关重要&#xff0c;因为错误可能带来严重后果。这种透明度有助于建立AI与用户之间的信任。情感分析是自然语言处理&#xff08;NLP&am…

【通俗理解】马尔科夫毯:信息屏障与状态独立性的守护者

【通俗理解】马尔科夫毯&#xff1a;信息屏障与状态独立性的守护者 马尔科夫毯的通俗比喻 你可以把马尔科夫毯想象成一个“信息屏障”&#xff0c;它隔绝了系统内部与外部的信息交流。在这个屏障之内&#xff0c;系统的状态是独立的&#xff0c;不受外界影响。 马尔科夫毯的核心…

【Kylin使用心得的介绍】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 👻Kylin 👻Kylin是一款Linux发行版,由中国国内的开发者团队…

Web开发:小结Apache Echarts官网上常用的配置项(前端可视化图表)

目录 一、须知 二、Title 三、 Legend 四、Grid 一、须知 配置项官方文档&#xff1a;点此进入。 我总结了比较常用的功能&#xff0c;写进注释里面&#xff0c;附带链接分享和效果图展示。&#xff08;更新中....&#xff09; 二、Title option {title: {text: Weekl…

2-52 基于matlab局部信息的模糊C均值聚类算法(FLICM)

基于matlab局部信息的模糊C均值聚类算法&#xff08;FLICM&#xff09;&#xff0c;是在FCM聚类算法的基础上结合了图像的邻域信息&#xff0c;有更好的鲁棒性。程序已调通&#xff0c;可直接运行。 2-52 局部信息的模糊C均值聚类算法 - 小红书 (xiaohongshu.com)

【Canvas与艺术】七角大楼

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>七角大楼</title><style type"text/css">.cen…

【Python/PyCharm】卸载、安装、配置环境、及错误解决(保姆篇)

文章目录 卸载python安装python手动配置python环境变量安装pycharm创建一个工程错误解决 更多相关内容可查看 卸载python 卸载Python&#xff0c;建议去控制面板&#xff0c;找到Python.exe和python.launcher&#xff0c;右键卸载即可 安装python 点击windows官网下载链接选择…

AI模型离线测试指南:测试方法、评估指标与提升技巧

模型离线测试作为评估人工智能模型性能的重要手段&#xff0c;在人工智能系统测试技术中占据非常重要的位置。通过模型的离线测试&#xff0c;我们可以深入洞察模型的性能&#xff0c;为后续优化提供有效的数据支持。本文我们将从人工智能模型离线测试的概念入手&#xff0c;逐…

YOLO格式转Labelme | 标签信息 | 辅助标注 | txt转json

前言 本文分享将常规的YOLO检测信息&#xff0c;转为Labelme中的标签信息。 即&#xff1a;xxx.txt 转 xxx.json。YOLO版本支持YOLOv8、YOLOv5等。 通过模型预测的信息&#xff0c;有了大致的检测位置和类别信息&#xff0c;人工进行微调和审核即可&#xff0c;实现辅助标注…

手摸手教你撕碎西门子S7通讯协议17--【再爆肝】通讯库应用开发wpf版

1、先看颜值 这颜值是采用wpf渲染技术实现的&#xff0c;里面用到很多控件&#xff0c;有第三方控件&#xff0c;也有自定义控件&#xff0c;怎么样&#xff0c;比车模还漂亮吧&#xff0c;超过脸模。 2、实现思路 程序启动时&#xff0c;连接西门子PLC&#xff0c;然后主动读…

计算机基础(Windows 10+Office 2016)教程 —— 第5章 文档编辑软件Word 2016(下)

文档编辑软件Word 2016 5.4 Word 2016的表格应用5.4.1 创建表格5.4.2 编辑表格5.4.3 设置表格 5.5 Word 2016的图文混排5.5.1 文本框操作5.5.2 图片操作5.5.3 形状操作5.5.4 艺术字操作 5.6 Word 2016的页面格式设置5.6.1 设置纸张大小、页面方向和页边距5.6.2 设置页眉、页脚和…

【通俗理解】贝叶斯定理——证据如何更新信念

【通俗理解】贝叶斯定理——证据如何更新信念 信念更新的类比 你可以把贝叶斯定理比作一个“信念调节器”&#xff0c;它根据新的证据来调节我们对某一事件发生的信念强度。 贝叶斯定理的核心作用 组件/步骤描述先验概率在获得新证据之前&#xff0c;对某一事件发生的概率的估…

Mac电脑数据恢复软件 Disk Drill 企业版安装

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将拖入文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;运行软件&#xff0c;点击安装&#xff0c;软件页面打开表示安装成功 三、运行测试1、打开软件&#xff0c;恢复一个…

Jenkins自动化构建运行Springboot项目

通过在Jenkins中创建流水线任务&#xff0c;编写流水线脚本以实现自动化构建和部署SpringBoot项目 好处 自动化: 自动化整个部署流程&#xff0c;减少人工干预&#xff0c;降低出错率。 一致性: 确保每次部署都遵循相同的步骤和配置&#xff0c;提高部署的一致性。 快速反馈…

临沂厚朴里升腾的文旅“烟火气”为城市“夜”经济贡献新活力

“一街兴一城、一街促百业”的案例不胜枚举&#xff0c;一如北京王府井大街古今交融的馥郁人文、上海南京路万国风貌的时尚繁华、成都春熙路美食飘香的热辣滚烫…无不成为其所在城市的一张靓丽名片&#xff0c;吸引着大量的当地居民和外来游客&#xff0c;为城市的经济发展和人…

Matlab|考虑大规模电动汽车接入电网的双层优化调度策略

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《A bi-layer optimization based temporal and spatial scheduling for large-scale electric vehicles》&#xff0c;中文文献可对照《考虑大规模电动汽车接入电网的双层优化调度策略》&…

【C++】学习笔记——智能指针

文章目录 二十一、智能指针1. 内存泄漏2. 智能指针的使用及原理RAII智能指针的原理auto_ptrunique_ptrshared_ptrshared_ptr的循环引用weak_ptr删除器 未完待续 二十一、智能指针 1. 内存泄漏 在上一章的异常中&#xff0c;我们了解到如果出现了异常&#xff0c;会中断执行流…