SMU Summer 2023 Contest Round 3

A. Curriculum Vitae

题意就是要求\(1\)后面不能有\(0\)的情况下的子序列最长长度, 也就是求一个最长不下降子序列,不过由于这是个\(01\)序列,也可以分别做一个前缀和求出\(0\)的数量,后缀和求\(1\)的数量,最后跑一遍循环,找一个最大值即可,

这里我是\(dp\)写的一个最长不下降子序列

#include  <bits/stdc++.h>
#define endl '\n'
#define int long long using namespace std; int n,m;
void solve(){
cin >> n;
vector<int> s(n);
int one = 0;
for(auto &i : s){
cin >> i;
}
vector<int> dp(n);
int ans = 0;
for(int i = 0;i < n;i ++){
dp[i] = 1;
for(int j =0; j < i;j ++){
if(s[i] >= s[j]){
dp[i] = max(dp[j] + 1, dp[i]);
}
}
ans = max(ans, dp[i]);
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int Ke_scholar = 1;
// cin >> Ke_scholar;
while(Ke_scholar--)
solve();
return 0;
}
/*
*/

B. Math Show

这题由于数据范围很小,可以直接暴力贪心求解

#include  <bits/stdc++.h>
#define endl '\n'
#define int long long
#define all(a) (a).begin(),(a).end() using namespace std; int n,m;
int match[N];
void solve(){
int k,M;
cin >> n >> k >> M;
vector<int> a(k + 1);
int sum = 0;
for(int i = 1;i<= k;i++){
cin >> a[i];
sum += a[i];
}
sort(all(a)); int ans = 0;
for(int i = 0;i <= n;i ++){
int score = i * k + i, t = sum * i, r = n - i;
/*
score 是完成i个人时的初始分数,因为完成一个人要+1,所以这里是直接+i;
t是完成i个人所消耗的时间,当t大于M时就可以直接退出;
r是目前为止还有几个人任务未完成.
*/
if(t > M ) break;
for(int j = 1;j <= k;j ++){
if(t >= M) break;
for(int p = 1;p <= r;p ++){
t += a[j];
if(t > M) break;
score ++;
}
}
ans = max(ans, score);
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int Ke_scholar = 1;
// cin >> Ke_scholar;
while(Ke_scholar--)
solve();
return 0;
}
/*
*/

C. Four Segments

题意翻译过来就在一个序列里找到\(i,j,k\)三个分界点使得\(sum(0, i) - sum(i, j) + sum(j, k) - sum(k, n)\)的值最大,\(sum( i,j)\)就是\(j\)的前缀和减去\(i\)的前缀和,如果直接暴力三层循环的话,时间肯定是不够的,这里我们可以发现这个公式前半部分\(sum(0,i) - sum(i,j)\)与它的的后半部分\(sum(j,k) - sum(k,n)\)在\(j\)是一个确定的值时其实是互不影响的,所以我们单独循环\(j\),然后分别去循环\(i\)和\(k\),找到两个部分的最大值时的\(i,k\)的值即可.

#include  <bits/stdc++.h>
#define endl '\n'
#define int long long
#define all(a) (a).begin(),(a).end() using namespace std; int n,m;
void solve(){
cin >> n;
vector<int> a(n + 1), pre(n + 1);
for(int i = 1;i <= n;i ++){
cin >> pre[i];
pre[i] += pre[i - 1];
}
int ans = -LLONG_MAX; int ansi, ansk, ansj;
for(int j = 0;j <= n;j ++){
int sum1 = -inf, sum2 = -inf, sum;
int si,sk;
for(int i = 0;i <= j;i ++){
if(pre[i] - (pre[j] - pre[i]) > sum1){
sum1 = pre[i] - (pre[j] - pre[i]);
si = i;
}
} for(int k = j;k <= n;k ++){
if(pre[k] - pre[j] - (pre[n] - pre[k]) > sum2){
sum2 = pre[k] - pre[j] - (pre[n] - pre[k]);
sk = k;
}
} sum = sum1 + sum2;
if(sum > ans){
ans = sum ;
ansi = si, ansj = j, ansk = sk;
}
}
cout << ansi << ' ' << ansj << ' ' << ansk << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int Ke_scholar = 1;
// cin >> Ke_scholar;
while(Ke_scholar--)
solve();
return 0;
}
/*
*/

D. Monitor

题意就是给出\(q\)个坏掉的像素点坐标和坏掉的时间,当这些点构成一个\(k*k\)的正方形时,说明显示屏会坏掉,而我们要找到它坏掉时的最小时间,如果\(q\)个坐标都不能构成这个正方形,则说明没坏,输出\(-1\).

做法是二分+二维前缀和,即先对每个坏掉的像素点坏掉的时间排序,然后去对这\(q\)个像素点二分,每次去检查它是否能构成一个\(k*k\)的正方形,不能就往后寻找,最后\(l > q\)的话则说明\(q\)个像素点都不能构成此正方形.

#include  <bits/stdc++.h>
#define endl '\n'
#define int long long
#define all(a) (a).begin(),(a).end() using namespace std; int n,m;
struct Node{
int x,y,t;
};
vector<vector<int>> gg(501,vector<int> (501));
void solve(){
int k , q;
cin >> n >> m >> k >> q;
vector<Node> a(q + 1);
for(int i = 1;i <= q;i ++)
cin >> a[i].x >> a[i].y >> a[i].t; sort(a.begin() + 1,a.end(),[](Node a, Node b){return a.t < b.t;});
//这里如果你是从1开始输入的话,排序一定要从1开始排,因为它的t是可以等于0的 auto check = [&](){
for(int i = k;i <= n;i ++)
for(int j = k; j <= m;j ++)
if(gg[i][j] - gg[i - k][j] - gg[i][j - k] + gg[i - k][j - k] == k * k)
return true;
return false;
}; int l = 1, r = q;
while(l <= r){
int mid = (l + r) >> 1; vector<vector<int>> g(n + 1, vector<int> (m + 1, 0));
for(int i = 1;i <= mid;i ++)
g[a[i].x][a[i].y] = 1; for(int i = 1;i <= n;i ++)
for(int j = 1; j <= m;j ++)
gg[i][j] = gg[i - 1][j] + gg[i][j - 1] - gg[i - 1][j - 1] + g[i][j]; if(check())
r = mid - 1;
else
l = mid + 1;
} cout << (l > q ? -1 : a[l].t) << endl; }
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int Ke_scholar = 1;
// cin >> Ke_scholar;
while(Ke_scholar--)
solve();
return 0;
}
/*
*/

SMU Summer 2023 Contest Round 3的更多相关文章

  1. 2015 Astar Contest - Round 3 题解

    1001 数长方形 题目大意 平面内有N条平行于坐标轴的线段,且不会在端点处相交 问共形成多少个矩形 算法思路 枚举4条线段的全部组合.分别作为矩形四条边.推断是否合法 时间复杂度: O(N4) 代码 ...

  2. Contest Round #451 (Div. 2)F/Problemset 898F Restoring the Expression

    题意: 有一个a+b=c的等式,去掉两个符号,把三个数连在一起得到一个数 给出这个数,要求还原等式,length <= 1e6 三个数不能含有前导0,保证有解 解法: 铁头过题法,分类然后各种判 ...

  3. Codeforces Round #284 (Div. 2)A B C 模拟 数学

    A. Watching a movie time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. Sending messages to non-windowed applications -- AllocateHWnd, DeallocateHWnd

    http://delphi.about.com/od/windowsshellapi/l/aa093003a.htm Page 1: How Delphi dispatches messages in ...

  5. Codeforces 240 F. TorCoder

    F. TorCoder time limit per test 3 seconds memory limit per test 256 megabytes input input.txt output ...

  6. cf499B-Lecture 【map】

    http://codeforces.com/problemset/problem/499/B B. Lecture     You have a new professor of graph theo ...

  7. Codeforces 240F. TorCoder 线段树

    线段树统计和维护某一区间内的字母个数.. . . F. TorCoder time limit per test 3 seconds memory limit per test 256 megabyt ...

  8. 物联网学生科协第三届H-star现场编程比赛

    问题 A: 剪纸片 时间限制: 1 Sec 内存限制: 128 MB 题目描写叙述 这是一道简单的题目,假如你身边有一张纸.一把剪刀.在H-star的比赛现场,你会这么做: 1. 将这张纸剪成两片(平 ...

  9. [cf contest 893(edu round 33)] F - Subtree Minimum Query

    [cf contest 893(edu round 33)] F - Subtree Minimum Query time limit per test 6 seconds memory limit ...

  10. 水题 Codeforces Round #307 (Div. 2) A. GukiZ and Contest

    题目传送门 /* 水题:开个结构体,rk记录排名,相同的值有相同的排名 */ #include <cstdio> #include <cstring> #include < ...

随机推荐

  1. scab2

    package com.cmb.cox.utils;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;im ...

  2. 数据标注工具 doccano

    目录 安装 运行 doccano 使用 doccanno 上传数据 定义标签 添加成员 开始标注 导出数据 查看数据 统计 数据标注工具 Label-Studio 安装 打开命令行(cmd.termi ...

  3. Kubernetes(二)资源管理

    1. 资源管理介绍 在kubernetes中,所有内容都抽象为资源,用户需要操作资源来管理kubernetes. Kubernetes本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服 ...

  4. ZYNQ:加速 PetaLinux 工程编译、复制 PetaLinux 工程

    PetaLinux介绍 PetaLinux是Xilinx基于Yocto推出的Linux开发工具.Yocto是业界主流的Linux发行版的构建工具,它不仅可以从源代码编译Linux 内核,还可以编译Li ...

  5. uniapp+thinkphp5实现微信扫码支付(APP支付)

    前言 统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口.下面介绍的是其中APP的支付的配置与实现流程 配置 1.首先登录 ...

  6. power bi权限控制笔记

    power bi权限控制:power bi权限控制角色目前只能在desktop 客户端进行创建.报表进行权限控制后,用于行级别安全,需注意:a.对数据集做行级别安全性的角色分配 b.需要进行报表的共享 ...

  7. Unity 中使用Geomotry Shader(几何着色器)扩展点创建其他图形(并实现处理锯齿)

    问题背景: 我们开发中需要有"点"对象,可以是像素的(不具备透视效果),始终等大,还有就是3D场景下的矢量点(随相机距离透视变化的). 问题解决思路: 方案1:使用GS扩充顶点,并 ...

  8. 痞子衡嵌入式:浅聊恩智浦i.MXRT官方SDK里关于串行Flash相关的驱动与例程资源(上篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT官方SDK里关于串行Flash相关的驱动与例程资源. 经常有同事以及 i.MXRT 客户咨询痞子衡,咱们恩智浦官方 S ...

  9. python爬取网站图片保存到本地文件夹

    爬取的网站 https://wallpaperscraft.com/catalog/anime 爬取代码 # 导包 import os import requests import parsel fr ...

  10. Solo 开发者周刊 (第4期):什么样的新科技,能提高生活效率?

    这里会整合 Solo 社区每周推广内容.产品模块或活动投稿,每周五发布.在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解.本杂志开源,欢迎投稿. 好文推荐 AI生 ...