YACS 2023年9月月赛 甲组 题解
榜单终于公布了,这应该是第二长的榜单公布吧。(最长的一次是去年八月,拖到九月开始后才公布)
T1 是傻逼数据结构不说了吧,对于每个点枚举以他为角的
看这个题目编号是
T2 是我认为比较好的一道题,虽然一眼看出诈骗。
先分析题目类型,显然是 DP,
这点时间够什么?可以够预处理
这点东西能有什么用?我们发现,两个数的位数相等,如果一个数的第一位大于另一个数的第一位,那么这个数后面就算全是
从高到低逐位确定,先从
#include <bits/stdc++.h> #define For(i, a, b) for (int i = (a); i <= (b); i ++) #define foR(i, a, b) for (int i = (a); i >= (b); i --) using namespace std; int m; int f[2005][2005], pre[2005]; char s[2005]; int main () { scanf ("%s%d", s + 1, &m); int len = strlen (s + 1); pre[0] = 1; For (i, 1, 2000) pre[i] = pre[i - 1] * 10 % m; f[len + 1][0] = 1; foR (i, len + 1, 2) { if (s[i - 1] == '?') { For (k, 0, 9) For (j, 0, m - 1) f[i - 1][(j + pre[len + 1 - i] * k % m) % m] |= f[i][j]; } else { For (j, 0, m - 1) f[i - 1][(j + pre[len + 1 - i] * (s[i - 1] - '0') ) % m] |= f[i][j]; } } if (!f[1][0]) { cout << "Impossible"; return 0; } int cur = 0; For (i, 1, len) { if (s[i] == '?') { foR (j, 9, 0) { if (f[i + 1][(cur - pre[len - i] * j % m + m) % m]) { cout << j; cur = (cur - pre[len - i] * j % m + m) % m; break; } } } else { cout << s[i]; cur = (cur - pre[len - i] * (s[i] - '0') % m + m) % m; } } return 0; }
T3 居然是原!二话没说直接贺!讲下大概思路吧。如果有任意两幅画是包含关系,那么只取大的就行了,这样以后按长升序排序必然有宽单调下降。
设
#include <cstdio> #include <cmath> #include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <vector> #include <map> #include <unordered_map> #define ll long long #define reg register #define fo(a,b,c) for(reg ll a=b;a<=c;a++) #define re(a,b,c) for(reg ll a=b;a>=c;a--) #define pii pair<ll,ll> #define fi first #define pb push_back #define se second #define mod 1000000007 #define inf mod using namespace std; inline ll gi() { ll x = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { x = (x<<1) + (x<<3) + (ch^48); ch = getchar(); } return x * f; } ll _=1; const int N=300005; ll ans[N],f[N]; struct IO { ll x,y; }p[N],pp[N]; pii q[N]; bool co(IO a,IO b) { if(a.x!=b.x) return a.x<b.x; else return a.y>b.y; } ll X(ll a,ll b) { return a-b; } ll Y(ll a,ll b) { return a-b; } ll stk[N]; void sol() { ll n=gi(),h=1,t=1; fo(i,1,n) { pp[i].x=gi(),pp[i].y=gi(); } ll top=0; sort(pp+1,pp+1+n,co); fo(i,1,n) { while(top&&pp[i].y>pp[stk[top]].y) { top--; } top++; stk[top]=i; } fo(i,1,top) { p[i]=pp[stk[i]]; } n=top; /* cout<<'\n'; fo(i,1,n) { cout<<p[i].x<<" "<<p[i].y<<'\n'; }*/ q[1].fi=-p[1].y; ll la=0; fo(i,1,n) { while(h<t&&X(q[h+1].fi,q[h].fi)*p[i].x>=Y(q[h+1].se,q[h].se)) { h++; } /* fo(j,h,t) { cout<<"TEST "<<i<<" "<<j<<" "<<q[j].fi<<" "<<q[j].se<<'\n'; }*/ // cout<<q[h].fi<<" "<<q[h].se<<'\n'; f[i]=q[h].se-q[h].fi*p[i].x; ll x=-p[i+1].y,y=f[i]; while(h<t&&Y(y,q[t].se)*X(q[t].fi,q[t-1].fi)<=Y(q[t].se,q[t-1].se)*X(x,q[t].fi)) { t--; } t++; q[t].fi=x; q[t].se=y; } /* fo(i,1,n) { cout<<f[i]<<" "; }*/ cout<<f[n]; } int main() { // _=gi(); while(_--) { sol(); // printf("\n"); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)