Moscow International Workshops 2017. Day 4. Lviv NU Contest, GP of Ukraine

news/2025/10/6 17:57:59/文章来源:https://www.cnblogs.com/cjjsb/p/19127781

Preface

国庆本以为空的一批结果忙的飞起,好不容易抽时间凑到三个人,结果被 Div2 小登们按在地上摩擦。


B. Card Game

签到,暴力枚举约数即可

#include<cstdio>
#include<iostream>
#include<map>
#define RI register int
#define CI const int&
using namespace std;
int n,m;
int main()
{scanf("%d%d",&n,&m);int mxn=0,mxc=0;map <int,int> cnt;for (RI i=1;i<=m;++i){int x; scanf("%d",&x);mxn=max(mxn,x);mxc=max(mxc,++cnt[x]);}int ways=0;for (RI s=1;s*s<=n;++s){auto check=[&](CI s){if (s>=mxn&&n/s>=mxc) ++ways;};if (n%s!=0) continue;check(s);if (s*s!=n) check(n/s);}return puts(ways==1?"YES":"NO"),0;
}

C. The Most Expensive Gift

队友写的,好像是说根据观察最后可能的周期串长度不会很大,因此可以直接暴枚周期串然后跑序列自动机

#include <bits/stdc++.h>int n;
std::string s;
int nxt[10000][3];std::vector<std::pair<int, int>> try_move(const std::vector<std::pair<int, int>> &cur,int ch
) {std::vector<std::pair<int, int>> res;int p = 0, r = -1, l = cur.size();while(p < l) {// std::cerr << "FUCK: " << cur[p].second << ", " << ch << ", " << nxt[cur[p].second][ch] << char(10);int nx = nxt[cur[p].second][ch];if(nx >= n) break;res.emplace_back(cur[p].first, nx);do p += 1;while(p < l && cur[p].first <= nx);}return res;
}int ans;void dfs(const std::vector<std::pair<int, int>> &cur,int depth
) {if(cur.empty()) return ;ans = std::max(ans, (int)(depth * cur.size() * cur.size()));// std::cerr << "debug cur(" << (int)(depth * cur.size() * cur.size()) << ") = ";// for(auto [l, r]: cur) {//     std::cerr << " [" << l << ", " << r << "]";// }// std::cerr << "\n";if(depth >= 10 && (n / (depth + 1)) * (n / (depth + 1)) * (depth + 1) <= ans) return ;for(int ch = 0; ch < 3; ++ch) dfs(try_move(cur, ch), depth + 1);
}int main(void) {std::ios::sync_with_stdio(false);std::cin >> n;std::cin >> s;int ss[3] = {n, n, n};for(int i = n - 1; i >= 0; --i) {memcpy(nxt[i], ss, sizeof(ss));ss[s[i] - 'a'] = i;}int cnt[3] = {0, 0, 0};for(int i = 0; i < n; ++i) cnt[s[i] - 'a'] += 1;ans = *std::max_element(cnt, cnt + 3);ans = ans * ans;for(int ch = 0; ch < 3; ++ch) {std::vector<std::pair<int, int>> init;for(int i = ss[ch]; i < n; i = nxt[i][ch])init.emplace_back(i, i);dfs(init, 1);}std::cout << ans << char(10);return 0;
}

D. Cut the Cake

队友开局写的签,我题意都没看

#include<bits/stdc++.h>
using namespace std;const int N = 205;string str[N];
int n, m, k;
int col[N], row[N], S[N][N];
vector<int> ansr, ansc;bool solve() {cin >> n >> m >> k;for (int i=1; i<=n; ++i) {cin >> str[i];str[i] = '$' + str[i];for (int j=1; j<=m; ++j) {int a = str[i][j]-'0';col[j] += a, row[i] += a;S[i][j] = S[i-1][j] + S[i][j-1] - S[i-1][j-1] + a;}}for (int j=1; j<=m; ++j) col[j] += col[j-1]; for (int i=1; i<=n; ++i) row[i] += row[i-1];// printf("row:"); for (int i=1; i<=n; ++i) printf("%d ", row[i]); puts("");ansr.push_back(0); ansc.push_back(0);int lst = 0;for (int i=1; i<=n; ++i) {if (row[i] - row[lst] == k) {ansr.push_back(i);lst = i;}}lst = 0;for (int i=1; i<=m; ++i) {if (col[i] - col[lst] == k) {ansc.push_back(i);lst = i;}}// printf("r=%d c=%d\n", ansr.size(), ansc.size());if (ansr.size() != k+1 || ansc.size() != k+1) return false;// puts("11111");for (int i=1; i<=k; ++i) for (int j=1; j<=k; ++j) {int r=ansr[i], c=ansc[j], nr=ansr[i-1], nc=ansc[j-1];if (S[r][c]-S[nr][c]-S[r][nc]+S[nr][nc] != 1) return false;}return true;
}signed main() {ios::sync_with_stdio(0); cin.tie(0);bool ok = solve();if (!ok) cout << "NO\n";else {cout << "YES\n";for (int i=1; i<k; ++i) cout << ansr[i] << (i==k-1 ? '\n' : ' ');for (int i=1; i<k; ++i) cout << ansc[i] << (i==k-1 ? '\n' : ' ');}return 0;
}

F. Bad Word

首先如果串本身不是回文答案就是 \(1\)

可以证明,若串是 aaaaa,aabaa,ababa 等形式则一定无解,否则一定可以两次操作删空

#include<bits/stdc++.h>
using namespace std;int n;
string str;bool all_same(string str) {int len = str.length();for (int i=1; i<len; ++i) if (str[i] != str[0]) return false;return true;
}bool is_pan(string str) {int len = str.length();for (int i=0; i<len; ++i) if (str[i] != str[len-1-i]) return false;return true;
}bool is_ab(string str) {int len = str.length();if (len <= 2) return false;for (int i=2; i<len; ++i) if (str[i] != str[i%2]) return false;return true;
}int solve() {string str;cin >> n;cin >> str;if (!is_pan(str)) return 1;// cout << str << '\n';if (all_same(str)) return -1;if (n%2==0) return 2;if (is_ab(str)) return -1;if (all_same(str.substr(0, n/2)) && all_same(str.substr((n+1)/2, n/2))) return -1;return 2;    
}signed main() {ios::sync_with_stdio(0); cin.tie(0);cout << solve() << '\n';return 0;
}

G. Zenyk, Marichka and Interesting Game

首先根据经典的模仿策略,我们可以将每堆石子个数模 \(a+b\),同时 \(a=b\) 的情况很好处理

此时每堆石子都满足一个人取了后另一个人不能取,直观上考虑会堆数奇偶性有关

不妨假设 \(a<b\),此时发现如果存在一堆石子个数 \(x\) 满足 \(a\le x<b\)\(2a\le x\),则先手一定可以调整拿去次数的奇偶性从而必胜

对于 \(a>b\) 的情形,枚举先手拿哪一堆后就自动变为上述情况,简单判断即可

#include<cstdio>
#include<iostream>
#define RI register int
#define CI const int&
using namespace std;
const int N=100005;
int n,A,B,a[N];
int main()
{scanf("%d%d%d",&n,&A,&B);for (RI i=1;i<=n;++i)scanf("%d",&a[i]),a[i]%=(A+B);if (A==B){int cnt=0;for (RI i=1;i<=n;++i)cnt+=a[i]/A;puts(cnt%2==1?"Zenyk":"Marichka");return 0;}int x=min(A,B),y=max(A,B),num[3]={0,0,0};for (RI i=1;i<=n;++i){if (x<=a[i]&&a[i]<y) ++num[0];if (a[i]>=2*x) ++num[1];if (a[i]>=x) ++num[2];}if (A<B){if (num[0]||num[1]) puts("Zenyk");else puts(num[2]%2==1?"Zenyk":"Marichka");return 0;}for (RI i=1;i<=n;++i){if (a[i]<A) continue;if (x<=a[i]&&a[i]<y) --num[0];if (a[i]>=2*x) --num[1];if (a[i]>=x) --num[2];a[i]-=A;if (x<=a[i]&&a[i]<y) ++num[0];if (a[i]>=2*x) ++num[1];if (a[i]>=x) ++num[2];if (num[0]==0&&num[1]==0&&num[2]%2==0){puts("Zenyk"); return 0;}if (x<=a[i]&&a[i]<y) --num[0];if (a[i]>=2*x) --num[1];if (a[i]>=x) --num[2];a[i]+=A;if (x<=a[i]&&a[i]<y) ++num[0];if (a[i]>=2*x) ++num[1];if (a[i]>=x) ++num[2];}return puts("Marichka"),0;
}

H. Frog Jumping

首先检查相邻石子间是否有间距大于 \(D\) 的,若有则让 \(c_i\) 最小的青蛙把石子全跳了,剩下的青蛙直接 \(1\to n\) 大跳

否则考虑二分有 \(s\) 只青蛙可以不进行大跳,检验的话就是把石子隔 \(s\) 个分个某个青蛙然后检查一遍距离即可

注意特判 \(1\to n\) 可以不消耗代价的情况

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<assert.h>
#define RI register int
#define CI const int&
using namespace std;
const int N=100005;
int n,m,k,d,c[N],a[N];
int main()
{scanf("%d%d%d%d",&n,&m,&k,&d);for (RI i=1;i<=m;++i) scanf("%d",&c[i]);sort(c+1,c+m+1);for (RI i=1;i<=k;++i) scanf("%d",&a[i]);sort(a+1,a+k+1); a[0]=1; a[k+1]=n;if (n-1<=d) return puts("0"),0;bool flag=0;for (RI i=0;i+1<=k+1;++i)if (a[i+1]-a[i]>d) { flag=1; break; }long long ans=0;if (flag){for (RI i=0;i+1<=k+1;++i)if (a[i+1]-a[i]>d) ans+=c[1];for (RI i=2;i<=m;++i) ans+=c[i];return printf("%lld",ans),0;}int l=1,r=min(k,m),res=0;while (l<=r){int mid=l+r>>1;auto check=[&](CI s){for (RI i=1;i<=k;++i){int pre=max(0,i-s);if (a[i]-a[pre]>d) return 0;int nxt=min(k+1,i+s);if (a[nxt]-a[i]>d) return 0;}return 1;};if (check(mid)) res=mid,l=mid+1; else r=mid-1;}assert(res!=0);for (RI i=1;i<=m-res;++i) ans+=c[i];return printf("%lld",ans),0;
}

I. Slot Machine

首先不难发现最优策略只会选择至多两种箱子进行取球

选一种箱子的情况根据鸽笼原理,求出其颜色数 \(col\) 后,若该箱子存在个数大于 \(1\) 的球,则用 \(col+1\) 更新答案

选两种箱子的话考虑对第一次取的箱子中每种颜色赋一个权值,表示抽出这种颜色后去其它箱子抽该颜色需要的最小次数

不难发现这个权值就是除了这个箱子外,有该颜色出现的箱子中的颜色数量(这里还是要用鸽笼原理分析一波)

求出权值后考虑最坏情况,即权值大的球总是被先抽出来,把权值降序排序更新答案即可

#include<cstdio>
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#define RI register int
#define CI const int&
using namespace std;
const int N=100005,INF=1e9;
int n,mn[N],smn[N],col[N]; map <int,int> box[N];
int main()
{int ans=INF;for (RI i=1;i<=100000;++i)mn[i]=smn[i]=INF;scanf("%d",&n);for (RI i=1;i<=n;++i){int L; scanf("%d",&L);for (RI j=1;j<=L;++j){int x; scanf("%d",&x);box[i][x]+=1;}col[i]=(int)box[i].size();for (auto [c,num]:box[i]){if (num>=2) ans=min(ans,col[i]+1);if (col[i]<mn[c]) smn[c]=mn[c],mn[c]=col[i];else if (col[i]<smn[c]) smn[c]=col[i];}}for (RI i=1;i<=n;++i){vector <int> val;for (auto [c,num]:box[i]){int tmp=(mn[c]!=col[i]?mn[c]:smn[c]);val.push_back(tmp);}sort(val.begin(),val.end(),greater <int>());// printf("box %d: ",i);// for (auto x:val) printf("%d ",x); putchar('\n');for (RI i=0;i<(int)val.size();++i)ans=min(ans,val[i]+i+1);}return printf("%d",ans),0;
}

J. Half is Good

7 年后的评测机直接暴力秒了此题,如何呢

#include<bits/stdc++.h>
using namespace std;
#define uint unsigned long longconst int N = 1e7+5;
int n, m;
struct Edge{uint w; int u, v;
}e[N];int id[N],fa[N];
unsigned s;
int gf(int x) {return x==fa[x] ? x : fa[x]=gf(fa[x]);}
bitset <N> ans;uint getNext() {s = (s ^ (s << 13));s = (s ^ (s >> 17));s = (s ^ (s << 5));return s;
}signed main() {ios::sync_with_stdio(0); cin.tie(0);cin >> n >> m >> s;for (int i = 0; i < m; ++i) {e[i].u = getNext() % n;e[i].v = getNext() % n;e[i].w = getNext() / 4;e[i].w = e[i].w * getNext(); // watch out for integer overflowid[i] = i;// there is an undirected edge between u and v with weight w// cout << e[i].u << ' ' << e[i].v << ' ' << e[i].w << '\n';}auto cmp = [&] (const int& x,const int& y) {return e[x].w < e[y].w;};sort(id, id+m, cmp);int cnt = 0;for (int i=0; i<n; ++i) fa[i] = i;for (int i=0; i<m; ++i) {int idx = id[i];if (gf(e[idx].u) != gf(e[idx].v)) {fa[gf(e[idx].u)] = gf(e[idx].v);++cnt;ans[idx] = true;if (2*cnt>=n-1) break;}}uint res = 0;for (int i=0; i<m; ++i) {int j = i/32;if (j != (i-1)/32) {cout << res << ' ';res = 0;}if (ans[i]) res += (1LL << (i%32));}cout << res << '\n';return 0;
}

L. Impress Her

直接暴力,根据经典结论枚举每种数对应的矩形内部的所有点复杂度是 \(O(n^3)\) 的,打个时间戳即可快速统计

#include<cstdio>
#include<iostream>
#define RI register int
#define CI const int&
using namespace std;
const int N=505,M=1e6+5,INF=1e9;
int n,m,a[N][N],vis[M],xl[M],xr[M],yl[M],yr[M];
int main()
{scanf("%d%d",&n,&m);for (RI i=1;i<=1000000;++i)xl[i]=yl[i]=INF,xr[i]=yr[i]=-INF;for (RI i=1;i<=n;++i)for (RI j=1;j<=m;++j){int s; scanf("%d",&s); a[i][j]=s;xl[s]=min(xl[s],i); xr[s]=max(xr[s],i);yl[s]=min(yl[s],j); yr[s]=max(yr[s],j);}int ans=0;for (RI i=1;i<=1000000;++i){if (xl[i]==INF) continue;for (RI x=xl[i];x<=xr[i];++x)for (RI y=yl[i];y<=yr[i];++y){int j=a[x][y];if (j==i) continue;if (vis[j]==i) continue;if (xl[i]<=xl[j]&&xr[j]<=xr[i]&&yl[i]<=yl[j]&&yr[j]<=yr[i]){vis[j]=i; ++ans;}}}return printf("%d",ans),0;
}

Postscript

比赛临近还是一点不训啊,不会真要成旅游队了吧

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

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

相关文章

网站开发有哪些技术wordpress新建音乐界面

转载自 ClassLoader 详解及用途 ClassLoader主要对类的请求提供服务&#xff0c;当JVM需要某类时&#xff0c;它根据名称向ClassLoader要求这个类&#xff0c;然后由ClassLoader返回这个类的class对象。 1.1 几个相关概念ClassLoader负责载入系统的所有Resources&#xff08;…

提供手机自适应网站土木工程网官网登录

Hadoop 1、 Hadoop的介绍 Hadoop最早起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎&#xff0c;包括网页抓取、索引、查询等功能&#xff0c;但随着抓取网页数量的增加&#xff0c;遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。2003年、20…

云原生架构的演进与落地:重塑企业 IT 的核心能力 - 实践

云原生架构的演进与落地:重塑企业 IT 的核心能力 - 实践2025-10-06 17:49 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important;…

小代码使用npm包的方法

小代码使用npm包的方法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &quo…

用手机域名做网站有多少张家口网站建设工作室

以下是电力行业中分布式能源管理(Distributed Energy Management System, DEMS)的实现方案,涵盖系统架构、关键技术、核心功能及实施路径,结合典型场景与代码示例: 一、系统架构设计 采用云-边-端三层架构,实现分布式能源的高效协同管理: 1. 终端层(感知层) 设备组…

网站做支付宝接口网页设计基础试题

Java Learning Path&#xff08;三&#xff09;过程篇   每个人的学习方法是不同的&#xff0c;一个人的方法不见得适合另一个人&#xff0c;我只能是谈自己的学习方法。因为我学习Java是完全自学的&#xff0c;从来没有问过别人&#xff0c;所以学习的过程基本上完全是自己…

张家港做网站优化排名新乡网站设计公司

摘要&#xff1a;当前,多核技术的不断发展和日渐成熟,使得处理器的性能得到巨大提升.但是对于存储设备来说,无论是速度还是容量都无法跟上这种步伐.随着处理器和其它子系统发展差距的日益加大,超级计算机的效率问题逐渐成为人们讨论和研究的热点,大部分的实际应用在超级计算机上…

day18 课程(模块 )

day18 课程(模块 &)课程: 18.1 了解模块------------------------------------------------ 执行后18.2 导入模块之方法一------------------------------------------------ 执行后18.3 导入模块之方法二-----…

Kubernetes(K8s)核心架构解析与实用命令大全 - 教程

Kubernetes(K8s)核心架构解析与实用命令大全 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

mzoj 2025/10/6

T1 考试时写的 \(O(n^4)\) 的,差点四了( 可以直接用 Floyd 找哪些可以由其他路径拼起来,剩下的是必须的。 rep(k,1,n) rep(i,1,n) rep(j,1,n)if(mp[i][j]==mp[i][k]+mp[k][j]&&mp[i][j]&&mp[i][k]&…

在 Windows 系统下配置 VSCode + CMake + Ninja 进行 C++ 或 Qt 创建

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

全源最短路 Johnson算法

洛谷p5905 #include<bits/stdc++.h> using namespace std; #define endl \n typedef long long LL; typedef pair<int,int> PII; const int N=3e3+10,INF=1e9; vector<PII> edges[N]; int dist[N],n…

UNION 与 UNION ALL 的区别 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

大学生做爰网站弄一个关于作文的网站怎么做

每日总结 20240221 花自飘零水自流。一种相思&#xff0c;两处闲愁。 —— 李清照「一剪梅红藕香残玉簟秋」 1. stat 在Linux中&#xff0c;stat 是一个用于显示文件或文件系统状态的命令行工具。它提供了关于文件的详细信息&#xff0c;包括文件类型、权限、大小、所有者、修…

网站开发教程视频百度云资源dede怎么做视频网站

目录 输入方法 Scanner类的9大输入方法 输出方法 print println printf 例题实战 题目进阶 输入方法 最常见的输入输出方法 输入Scanner类 Scanner是Java5的新特征&#xff0c;在java.util包里&#xff0c;可以完成用户输入&#xff1a; 导入java.util包 构造Scanner对象&…

《对象创建的秘密:Java 内存布局、逃逸分析与 TLAB 优化详解》 - 实践

《对象创建的秘密:Java 内存布局、逃逸分析与 TLAB 优化详解》 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

go get net/http connections count, using middleware

go, get net/http connection countvar activeConnections int32func handler(w http.ResponseWriter, r *http.Request) {atomic.AddInt32(&activeConnections, 1)defer atomic.AddInt32(&activeConnections,…

win11开机后卡死,磁盘c盘占用100%,解决方案

我的电脑忘记从什么时候开始,打开时有概率卡死,具体表现为点开任何软件都无法加载。 电脑卡死最显著的特征是,打开任务管理器,显示磁盘C盘占用100%。 有概率等一段时间后,磁盘占用率下降,电脑可正常使用。 磁盘卡…

美橙云建站网站改版是什么

文章目录 一、概述1.官方文档2.Docker Compose 生成器3.创建 docker-compose 文件 二、安装准备1. 克隆服务器2.安装 Docker3.安装 docker-compose 三、非安全模式部署1.docker-comepse2.启动 EdgeX Foundry3.访问 UI3.1. consul3.2. EdgeX Console EdgeX Foundry # EdgeX Fou…