11.11比赛总结

(出这么难是要打坤我嘛)

Minimax

1.构造题?思维题?根据特殊性质可知,一共有两种情况:

[1].只有一种字符,直接输出原字符串即可(10分)。

[2].有多种字符:

(1)存在一种字符出现次数为1:显然把这个字符放在最前面,其他字符排序后接在后面即可。

(2)所有字符出现次数大于等于2:不妨设最小的字符为 a,其出现次数为 cnt。最后的答案为 1。由于要保证字典序最小,我们尽可能多地把 a 放在最前。不难发现最前面最多有连续两个 a。

        如果最前面可以放连续两个 a:考虑除这两个 a 以外的 a,由于这些 a 不能连续出现,所以这些 a 每个后要么接一个非 a 的字符,要么放在字符串尾。所以,字符串最前面可以放连续两个 a,当且仅当 cnt−1≤len−cnt+1 。显然把所有非 a 的字符排序,在相邻两个字符间依次插入 a 直至 a 用完。如果 a 没有用完则一定还剩 1 个 a,放在串最后即可。

        如果最前面不能放连续两个 a:那么,最前面只能放一个 a。在其之后一定会接第二小的字符,不妨设为 b。那么,后面不能再出现形如 ab 这样的串了。若字符种类 ≤2,所有的 a 应放在所有的 b 之后。否则可以在最前面的 b 后接所有的 a,再接一个第三小的字符(设为 c ),然后剩下的字符放置的位置没有限制,直接从小到大排序即可。

2.代码实现:

#include<bits/stdc++.h>
using namespace std;
int t,a[30];
string s;
int main(){cin>>t;while(t--){cin>>s;memset(a,0,sizeof(a));int cnt=0;for(int i=0;i<s.size();i++){if(a[s[i]-'a'+1]==0)cnt++;a[s[i]-'a'+1]++;}if(cnt==1){cout<<s<<endl;continue;}bool flag=0;for(int i=1;i<=26;i++)if(a[i]==1){cout<<(char)(i+'a'-1);a[i]--;for(int i=1;i<=26;i++)for(int j=1;j<=a[i];j++)cout<<(char)(i+'a'-1);cout<<endl;flag=1;break;}if(flag) continue;int x=1;while(a[x]==0)x++;int y=x+1;while(a[y]==0)y++;if(2*a[x]<=s.size()+2){cout<<(char)(x+'a'-1)<<(char)(x+'a'-1);a[x]-=2;for(int i=1;i<=a[x];i++){while(a[y]==0)y++;cout<<(char)(y+'a'-1);cout<<(char)(x+'a'-1);a[y]--;}a[x]=0;for(int i=1;i<=26;i++)for(int j=1;j<=a[i];j++)cout<<(char)(i+'a'-1);cout<<endl;continue;}if(cnt==2){for(int i=1;i<=26;i++)if(a[i]>0){cout<<(char)(i+'a'-1);a[i]--;for(int j=i+1;j<=26;j++)for(int k=1;k<=a[j];k++)cout<<(char)(j+'a'-1);for(int k=1;k<=a[i];k++)cout<<(char)(i+'a'-1);cout<<endl;break;}continue;}cout<<(char)(x+'a'-1)<<(char)(y+'a'-1);a[x]--;a[y]--;for(int i=1;i<=a[x];i++)cout<<(char)(x+'a'-1);a[x]=0;y++;while(a[y]==0)y++;cout<<(char)(y+'a'-1);a[y]--;for(int i=1;i<=26;i++)for(int j=1;j<=a[i];j++)cout<<(char)(i+'a'-1);cout<<endl;}return 0; 
}

Bear and Cavalry

1.打着打着暴力突然想到了匈牙利算法(关于给士兵和奶龙牵线搭桥这回事)

暴力代码(模拟就能发现其实有不少漏洞):

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,q;
long long ans;
struct army{int w,id,vis;
}a[N];
struct kl{int h,id,vis;
}k[N];
bool cmp1(army x,army y){return x.w>y.w;
}
bool cmp2(kl x,kl y){return x.h>y.h;
}
int main(){cin>>n>>q;for(int i=1;i<=n;i++){cin>>a[i].w;a[i].id=i;a[i].vis=0;}for(int i=1;i<=n;i++){cin>>k[i].h;k[i].id=i;k[i].vis=0;}sort(a+1,a+1+n,cmp1);while(q--){int x,y;cin>>x>>y;ans=0;swap(k[x].id,k[y].id);sort(k+1,k+1+n,cmp2);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(a[i].id!=k[j].id&&a[i].vis==0&&k[j].vis==0){ans+=a[i].w*k[j].h;a[i].vis=1;k[i].vis=1;break;}}}for(int i=1;i<=n;i++) k[i].vis=0,a[i].vis=0;cout<<ans<<endl;}return 0;
}

2.设 bani​ 表示 i 不能匹配的马。则有结论:把 w,h 排序后,每个人 i 匹配的马必定在 [i−2,i+2] 中。(证明不会)。考虑一组匹配 (i,i+3)。此时,左下比右下多了三个点,所以至少有三组匹配跨越了 (i,i+3)。红线中可能有一匹马为 bani​,无法交换它和 (i,i+3);有一个人 j 的 ban 为 i+3,也无法交换它和 (i,i+3)。但这样总会剩下一组可以交换。交换后,逆序对数变少了,显然权值更大。所以不会存在 (i,i+3) 的匹配。(i,i−3) 同理。同时,我们也可以通过交换的过程得到一条性质:如果前 ii 个人和前 ii 匹马匹配完成,那么存在k≤3,使得 [i,i+k] 中的人和马匹配。可以用反证法,得到必然存在一种交换方式。设 fi​ 表示前 i 个人和前 i 匹马匹配完成的最大权值,只从 fi−3​,fi−2​,fi−1​ 转移。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e4+10;
const ll inf=1e18;
int n,q,pos[N];
struct node{ll v;int id;
}a[N],b[N];
struct mar{ll A[3][3];
}B;
struct tree{int l,r;mar s;
}tr[N<<2];
inline mar operator*(mar a,mar b){mar c;c.A[0][0]=max(a.A[0][0]+b.A[0][0],max(a.A[0][1]+b.A[1][0],a.A[0][2]+b.A[2][0]));c.A[0][1]=max(a.A[0][0]+b.A[0][1],max(a.A[0][1]+b.A[1][1],a.A[0][2]+b.A[2][1]));c.A[0][2]=max(a.A[0][0]+b.A[0][2],max(a.A[0][1]+b.A[1][2],a.A[0][2]+b.A[2][2]));c.A[1][0]=max(a.A[1][0]+b.A[0][0],max(a.A[1][1]+b.A[1][0],a.A[1][2]+b.A[2][0]));c.A[1][1]=max(a.A[1][0]+b.A[0][1],max(a.A[1][1]+b.A[1][1],a.A[1][2]+b.A[2][1]));c.A[1][2]=max(a.A[1][0]+b.A[0][2],max(a.A[1][1]+b.A[1][2],a.A[1][2]+b.A[2][2]));c.A[2][0]=max(a.A[2][0]+b.A[0][0],max(a.A[2][1]+b.A[1][0],a.A[2][2]+b.A[2][0]));c.A[2][1]=max(a.A[2][0]+b.A[0][1],max(a.A[2][1]+b.A[1][1],a.A[2][2]+b.A[2][1]));c.A[2][2]=max(a.A[2][0]+b.A[0][2],max(a.A[2][1]+b.A[1][2],a.A[2][2]+b.A[2][2]));return c;
}
inline bool cmp(node x,node y){return x.v<y.v;
}
inline ll ask(int t,int x,int y,int z){return a[t].id==b[t-x].id||a[t-1].id==b[t-y].id||a[t-2].id==b[t-z].id?-inf:a[t].v*b[t-x].v+a[t-1].v*b[t-y].v+a[t-2].v*b[t-z].v;
}
inline mar get(int x){mar res=B;res.A[1][0]=res.A[2][1]=0;res.A[0][0]=(a[x].id==b[x].id?-inf:a[x].v*b[x].v);if(x>1) res.A[0][1]=max(a[x].id==b[x].id||a[x-1].id==b[x-1].id?-inf:a[x].v*b[x].v+a[x-1].v*b[x-1].v,a[x].id==b[x-1].id||a[x-1].id==b[x].id?-inf:a[x].v*b[x-1].v+a[x-1].v*b[x].v);if(x>2) res.A[0][2]=max(ask(x,0,1,2),max(ask(x,0,2,1),max(ask(x,1,0,2),max(ask(x,1,2,0),max(ask(x,2,0,1),ask(x,2,1,0))))));return res;
}
inline void pushup(int u){tr[u].s=tr[u<<1|1].s*tr[u<<1].s;
}
inline void build(int u,int l,int r){tr[u]={l,r};if(l==r){tr[u].s=get(l);return ;}int mid=l+r>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);pushup(u);
}
inline void mdf(int u,int x){if(x>n) return ;if(tr[u].l==tr[u].r){tr[u].s=get(x);return ;}int mid=tr[u].l+tr[u].r>>1;if(x<=mid) mdf(u<<1,x);else mdf(u<<1|1,x);pushup(u);
}
int main(){for(int i=0;i<3;++i){for(int j=0;j<3;++j){B.A[i][j]=-inf;}}scanf("%d%d",&n,&q);for(int i=1;i<=n;++i){scanf("%lld",&a[i].v);a[i].id=i;}sort(a+1,a+1+n,cmp);for(int i=1;i<=n;++i){scanf("%lld",&b[i].v);b[i].id=i;}sort(b+1,b+1+n,cmp);for(int i=1;i<=n;++i) pos[b[i].id]=i;build(1,1,n);while(q--){int x,y;scanf("%d%d",&x,&y);swap(b[pos[x]].id,b[pos[y]].id);swap(pos[x],pos[y]);mdf(1,pos[x]),mdf(1,pos[x]+1),mdf(1,pos[x]+2);mdf(1,pos[y]),mdf(1,pos[y]+1),mdf(1,pos[y]+2);printf("%lld\n",max(tr[1].s.A[0][0],max(tr[1].s.A[0][1],tr[1].s.A[0][2])));}return 0;
}

Shortest Path 

1.不会正解。(直接输出0有10分)

2.40分:暴力求最短路

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 150010; 
int h[N], e[N], ne[N], idx;
int w[N];
int dist[N];
bool st[N];
int n, m;
void add(int x, int y, int c){w[idx] = c;e[idx] = y;ne[idx] = h[x]; h[x] = idx++;
}
//堆优化适合稀疏图
/*
1. 一号点的距离初始化为零,其他点初始化成无穷大。
2. 将一号点放入堆中。
3. 不断循环,直到堆空。每一次循环中执行的操作为:弹出堆顶(与朴素版diijkstra找到S外距离最短的点相同,并标记该点的最短路径已经确定)。用该点更新临界点的距离,若更新成功就加入到堆中。
*/
int dijkstra(){memset(dist, 0x3f, sizeof(dist));dist[1] = 0;priority_queue<PII, vector<PII>, greater<PII>> heap;heap.push({ 0, 1 }); while(heap.size()){PII k = heap.top();heap.pop();int ver = k.second, distance = k.first;if(st[ver]) continue;st[ver] = true;for(int i = h[ver]; i != -1; i = ne[i]){int j = e[i];if(dist[j] > distance + w[i]){dist[j] = distance + w[i];heap.push({ dist[j], j });}}}if(dist[n] == 0x3f3f3f3f) return -1;else return dist[n];
}
//求1节点到n节点的最短距离
int main(){memset(h, -1, sizeof(h));scanf("%d%d", &n, &m);while (m--){int x, y, c;scanf("%d%d%d", &x, &y, &c);add(x, y, c);}cout << dijkstra() << endl;return 0;
}

哞了个哞

1.子任务1:爆搜

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=1e5+5;
const int mod=1e9+7;
int n,k;
int a[N];
ll ans;
map<pii,int> mp;
int cnt;
ll qmi(ll a,int b){ll res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
int mods(ll a,ll b){return a*qmi(b,mod-2)%mod;
}
int jie(int x){int res=1;for(int i=2;i<=n;i++){res=res*i%mod;}return res;
}
int main(){freopen("cxk.out","w",stdout);scanf("%d%d",&n,&k);	for(int i=1;i<=n;i++){a[i]=i;}do{for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(a[i]<a[j]){mp[{i,j}]++;ans=(ans+qmi(j,k)-qmi(i,k))%mod;}}}}while(next_permutation(a+1,a+n+1));for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){cout<<i<<" "<<j<<": ";cout<<mp[{i,j}]<<endl;}}cout<<cnt<<endl;printf("%d\n",mods(ans,jie(n)));return 0;
}

2.关于后续:一大堆推式子+拉格朗日插值+快速阶乘(the end...)

All in all

难(虽然有的倒是可以拿部分分)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3入门介绍及快速上手

vue3 文章目录 vue31、概况2、快速入门3、常用指令3.1、v-for3.2、v-bind3.3、 v-if & v-show3.4、v-model3.5、 v-on 4 生命周期5、 工程化5.1、环境准备5.2、Vue项目-创建5.3、Vue项目开发流程5.4、组合式API5.5、reactive和ref函数5.6、watch5.7、父子组件通信 6、Vue路…

【ARM Coresight OpenOCD 系列 5 -- arp_examine 使用介绍】

文章目录 OpenOCD arp_examine 使用 OpenOCD arp_examine 使用 因为我们很多时候运行 Openocd 的时候有些 core 还没有启动, 所以最好在配置脚本中添加 -defer-examine这个参数, 如下&#xff1a; #cortex-m33 target create ${_CHIPNAME}.m33 cortex_m -dap ${_CHIPNAME}.da…

【大数据学习 | kafka高级部分】kafka的kraft集群

首先我们分析一下zookeeper在kafka中的作用 zookeeper可以实现controller的选举&#xff0c;并且记录topic和partition的元数据信息&#xff0c;帮助多个broker同步数据信息。 在新版本中的kraft模式中可以这个管理和选举可以用kafka自己完成&#xff0c;而不再依赖zookeeper。…

用户裂变数据分析

用户增长是一个工作和找工作的时候都不可避免的话题&#xff0c;那么用户增长&#xff0c;该怎么做数据分析&#xff1f;本文从两个方面分享了大部分企业做用户增长的方法&#xff0c;希望对你有所帮助。 01 用户增长的基本办法 1. 买量 在互联网公司中&#xff0c;买量是占…

论文分享:DiskANN查询算法

详细总结了三篇有关DiskANN最邻近查询图算法的论文 欢迎大家来点赞&#xff0c;更欢迎感兴趣的友友来探讨&#xff01; DiskANN的提出(NurIPS’19)文献分享: Vamana图算法以及面向SSD的DiskANN文章浏览阅读797次&#xff0c;点赞21次&#xff0c;收藏8次。NurIPS‘19_vamana图…

第16章 SELECT 底层执行原理

一、SELECT查询的完整结构 1.1 方式一&#xff08;SQL 92语法&#xff09; SELECT ..., ..., ... FROM ..., ..., ... WHERE 多表的连接条件 AND 不包含组函数的过滤条件 GROUP BY ..., ... HAVING 包含组函数的过滤条件 ORDER BY ... ASC/DESC LIMIT ..., ... 1.2 方式二&a…

【设计模式】结构型模式(四):组合模式、享元模式

《设计模式之结构型模式》系列&#xff0c;共包含以下文章&#xff1a; 结构型模式&#xff08;一&#xff09;&#xff1a;适配器模式、装饰器模式结构型模式&#xff08;二&#xff09;&#xff1a;代理模式结构型模式&#xff08;三&#xff09;&#xff1a;桥接模式、外观…

移门缓冲支架的作用与优势

1. 吸收冲击力&#xff0c;保护门体和墙体移门缓冲支架的主要功能之一是吸收门关闭时的冲击力。当门快速关闭时&#xff0c;如果没有缓冲装置&#xff0c;门会猛烈撞击门框或墙体&#xff0c;可能导致门体、轨道和墙体的损坏。缓冲支架通过吸收这部分冲击力&#xff0c;减少门对…

「IDE」集成开发环境专栏目录大纲

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「IDE」集成开发环境&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定…

协程3 --- golang的协程调度

文章目录 单进程时代多进程/线程时代协程时代内核级线程模型&#xff08;1&#xff1a;1&#xff09;用户级线程模型&#xff08;N&#xff1a;1&#xff09;两级线程模型CMP&#xff08;M&#xff1a;N&#xff09;GM模型 GMP模型 单进程时代 描述&#xff1a;每一个程序就是一…

鸿蒙华为商城APP案例

模拟器运行效果如下&#xff1a; 鸿蒙版APP-华为商城-演示视频

vue+Leaflet.PM插件实现创建和编辑几何图形(点、线、面、圆等)

场景 VueLeaflet实现加载OSM显示地图&#xff1a;https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122317394在上面加载显示OSM的基础上&#xff0c;使用Leaflet.pm插件实现在页面上绘制、编辑、剪切、移动几何元素。Leaflet.pm插件 用于创建和编辑几何图层的插件可…

手动实现h5移动端点击全屏按钮横屏展示图片,左右滑动切换,处理页面会随着手指滑动问题

页面提供全屏按钮,全屏展示的容器 <div class"container"><button click"openSwiper">点击全屏查看</button><!-- 大图 --><divclass"full"v-if"showSwiper"touchstart"handleTouchStart"touch…

Vue2+3 —— Day3/4

Day3 Vue生命周期 和 生命周期的四个阶段 Vue生命周期的四个阶段&#xff1a; 从创建到销毁的整个阶段中&#xff0c;Vue提供好了一系列函数&#xff08;8个&#xff09;&#xff1b; 并且在经历生命周期的对应阶段时&#xff0c;会自动帮你调用这些函数 这8个函数称为生命…

Redis集群模式之Redis Sentinel vs. Redis Cluster

在分布式系统环境中&#xff0c;Redis以其高性能、低延迟和丰富的数据结构而广受青睐。随着数据量的增长和访问需求的增加&#xff0c;单一Redis实例往往难以满足高可用性和扩展性的要求。为此&#xff0c;Redis提供了两种主要的集群模式&#xff1a;Redis Sentinel和Redis Clu…

机器学习———特征工程

1 特征工程概念 特征工程就是对特征进行相关的处理&#xff0c;一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程&#xff0c;特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征&#xff0c;比如:字典特征提取(特征离散化)、文本特征提取…

服务器数据恢复—分区结构被破坏的reiserfs文件系统数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器中有一组由4块SAS硬盘组建的RAID5阵列&#xff0c;上层安装linux操作系统统。分区结构&#xff1a;boot分区LVM卷swap分区&#xff08;按照顺序&#xff09;&#xff0c;LVM卷中划分了一个reiserfs文件系统作为根分区。 服务器故障…

vue3+vite搭建脚手架项目本地运行electron桌面应用

1.搭建脚手架项目 搭建Vue3ViteTs脚手架-CSDN博客 2.创建完项目后&#xff0c;安装所需依赖包 npm i vite-plugin-electron electron26.1.0 3.根目录下创建electron/main.ts electron/main.ts /** electron/main.ts */import { app, BrowserWindow } from "electron&qu…

C++ | Leetcode C++题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; class Solution { public:int nextGreaterElement(int n) {int x n, cnt 1;for (; x > 10 && x / 10 % 10 > x % 10; x / 10) {cnt;}x / 10;if (x 0) {return -1;}int targetDigit x % 10;int x2 n, cnt2 0;for (; x2 …

大数据技术之Hadoop :我是恁爹

就如上图中的技术分类&#xff0c;大数据技术主要解决的就是海量数据的存储和计算问题。 这两个问题的解决方案最先被 Google 被提出&#xff0c;用于解决 Google 搜索引擎海量的网页存储和索引的构建。对应的技术就是日后被人所熟知的 HDFS 和 MapReduce。 不关注大数据的可…