【补题】The 2022 SDUT Summer Trials
比赛链接
A. Ginger's number
样例恶臭(恼)
签到题
简单分解因数就会发现要求的就是\(gcd\),直接算即可,时间复杂度\(\Theta(Tlog(max(x,y)))\)
代码
点击查看代码
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int gcd(int x,int y){
if(x<y) swap(x,y);
if(!y) return x;
return gcd(y,x%y);
}
int main(){
int i,j,n,m,x,y,T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&x,&y);
printf("%d\n",gcd(x,y));
}
// system("pause");
return 0;
}
B. Ginger's game
简单题
很经典,用个单调栈维护每个数在哪段区间里是最小值即可。
代码
点击查看代码
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define ll long long
#define maxn 200010
using namespace std;
ll a[maxn];
ll dp[maxn];
int st[maxn],top=0;
int main(){
int i,j,n;
ll ans=0;
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%lld",&a[i]);
for(i=1;i<=n;++i){
while(top>0&&a[st[top]]>=a[i]) --top;
dp[i]=dp[st[top]]+a[i]*(i-st[top]);
st[++top]=i;
}
for(i=1;i<=n;++i) ans=max(ans,dp[i]);
printf("%lld",ans);
// system("pause");
return 0;
}
C. Ginger's sequence
简单题
(但是我傻逼了)
不会真有人不会抽屉原理吧,不会吧不会吧_(但是我是傻逼睡前才发现,乐)
题目就是要求选取两个不同的非空子集,使得他们元素和相等\((模k意义下)\)。
那么\(n\)个元素,能组成的不同子集和共有\(2^n-1\)个(不包括空集),所以根据抽屉原理,大概只要有\(log_2(k)\)量级的\(n\)就能使得有两个子集和相同。
所以\(2^n-1>=k\)时我们直接输出"YES"。
\(2^n-1<k\)时暴力枚举子集即可,时间复杂度\(\Theta(k)\)。
代码
点击查看代码
#include<cstdio>
#include<cstdlib>
#define maxn 100010
using namespace std;
int a[maxn],dp[maxn];
int solve(){
int n,k,i,j,m;
scanf("%d%d",&n,&k);
for(i=0;i<n;++i) scanf("%d",&a[i]),a[i]%=k;
for(m=0;(1<<m)<=k;++m);
if(n>=m) return 1;
for(i=1;i<(1<<n);++i){
int sum=0;
for(j=0;j<n;++j){
if(i&(1<<j)) sum=(sum+a[j])%k;
}
dp[sum]++;
}
for(i=0;i<k;++i){
if(dp[i]>1) return 1;
}
return 0;
}
int main(){
int flag=solve();
if(flag) printf("YES");
else printf("NO");
// system("pause");
return 0;
}
D. Ginger's line
签到题
暴力判斜率是否相同即可。
代码
点击查看代码
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define maxn 5010
using namespace std;
int a[maxn],b[maxn];
int main(){
int i,j,n,m,x,y,T;
int ans=0;
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d%d",&a[i],&b[i]);
}
for(i=1;i<=n;++i){
for(j=i+1;j<=n;++j)
ans+=(a[i]!=a[j]);
}
printf("%d",ans);
// system("pause");
return 0;
}
E. Ginger's coloring
签到题
沿着约束关系走就可以变成一个一个环(经典排列和置换套路),每个环的方案互相独立,计算相乘即可。
只有黑白两种颜色,更简单了,奇环\(0\),偶环\(2\)。(颜色多点还有点意思来着)
代码
点击查看代码
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define ll long long
#define mod 998244353
#define maxn 200010
using namespace std;
int p[maxn],book[maxn];
int c[maxn],tot=0;
ll f(int x){
return 2*((x^1)&1);
}
int main(){
int i,j,n;
ll ans=1;
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%d",&p[i]);
for(i=1;i<=n;++i){
if(book[i]) continue;
int cnt=1;
book[i]=1;
for(j=p[i];j!=i;j=p[j]) cnt++,book[j]=1;
c[++tot]=cnt;
}
for(i=1;i<=tot;++i){
ans=(ans*f(c[i]))%mod;
}
printf("%lld",ans);
// system("pause");
return 0;
}
G. Ginger's password
简单题
由于要求字典序不降,所以不难发现结果只和各个字符个数有关,是个组合问题。
已经给出了长为\(n\)的子序列,还要凑\(k-n\)个,每个字符有个数上限。
用生成函数卷一卷求系数就好了(貌似背包也能做?)
数据太小懒得写\(FFT\)了,暴力卷积得了qwq。
代码
点击查看代码
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define ll long long
#define mod 998244353
using namespace std;
int d[26],n,k;
char s[2010];
ll a[100010],b[100010],c[100010];
void multi(int &n1,int n2){
int i,j;
memset(c,0,sizeof(c));
for(i=0;i<n1;++i){
for(j=0;j<n2&&i+j<=k;++j)
c[i+j]=(c[i+j]+a[i]*b[j]%mod)%mod;
}
n1=min(k+1,n1+n2-1);
for(i=0;i<n1;++i) a[i]=c[i];
}
ll solve(){
int i,j,m;
ll ans=1;
scanf("%d%d",&n,&k);
if(n>k) return -1;
for(i=0;i<26;++i){
scanf("%d",&d[i]);
}
scanf("%s",s);
for(i=1;i<n;++i) if(s[i]<s[i-1]) return -1;
for(i=0;i<n;++i) d[s[i]-'a']--;
k-=n;
for(i=0;i<26;++i){
if(d[i]<0){
return -1;
}
d[i]=min(d[i],k);
}
a[0]=1;m=1;
for(i=0;i<26;++i){
for(j=0;j<=d[i];++j) b[j]=1;
multi(m,d[i]+1);
// for(j=0;j<m;++j) printf("%lld ",a[j]);
// printf("\n");
}
return a[k];
}
int main(){
ll ans;
ans=solve();
if(ans<0) printf("NO SOLUTION!");
else printf("%lld",ans);
// system("pause");
return 0;
}
H. Ginger's clone
签到题
模拟即可。
代码
点击查看代码
#include<cstdio>
#include<cstdlib>
using namespace std;
int a[210][210],book[210][210];
int t1=0,t2=0;
int b1[40001],b2[40001];
int n;
struct dir{
int dx,dy;
dir(){}
dir(int t1,int t2){dx=t1,dy=t2;}
void turn(){
int t=-dy;
dy=dx;
dx=t;
}
} dir1,dir2;
int nxt(int &x,int &y,dir &d){
while(x+d.dx>n||x+d.dx<1||y+d.dy>n||y+d.dy<1||book[x+d.dx][y+d.dy]) d.turn();
x=x+d.dx;y=y+d.dy;
book[x][y]=1;
return a[x][y];
}
int main(){
int i,j;
int x1,y1,x2,y2;
scanf("%d",&n);
x1=0,y1=1;x2=n+1,y2=n;
dir1=dir(1,0),dir2=dir(-1,0);
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
scanf("%d",&a[i][j]);
for(i=1;i<=n*n;++i){
if(i&1) b1[++t1]=nxt(x1,y1,dir1);
else b2[++t2]=nxt(x2,y2,dir2);
}
for(i=1;i<=t1;++i) printf("%d ",b1[i]);
printf("\n");
for(i=1;i<=t2;++i) printf("%d ",b2[i]);
// system("pause");
return 0;
}
I. Ginger's balance
简单题
做过小学智力题的应该都知道要尽量均分三份吧(
递归解比较方便。
代码
点击查看代码
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int f(int n,int m){
if(m==1) return 0;
if(m==2) return 1;
int t;
if((m+1)/3<=n) t=(m+1)/3;
else t=n;
return f(n,max(t,m-2*t))+1;
}
int main(){
int i,j,n,m;
scanf("%d%d",&n,&m);
printf("%d",f(n,m));
// system("pause");
return 0;
}
J. Ginger's cow
简单题
裸的二分图最大匹配,跑匈牙利即可。
代码
点击查看代码
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define ll long long
#define maxn 200010
using namespace std;
char name[101][50];
int c=0;
int old[101];
int fst[101],nxt[1001],to[1001],cnt=0,visited[101];
int match[101];
int fd(char *p){
for(int i=1;i<=c;++i){
if(strcmp(p,name[i])==0) return i;
}
return 0;
}
void add(int x,int y){
to[++cnt]=y;
nxt[cnt]=fst[x];
fst[x]=cnt;
}
int dfs(int x){
visited[x]=1;
for(int i=fst[x];i;i=nxt[i]){
if(visited[match[to[i]]]) continue;
if(!match[to[i]]||dfs(match[to[i]])){
match[to[i]]=x;
return 1;
}
}
return 0;
}
int main(){
int i,j,n,m,q;
int ans=0,idx,idy;
char x[50],y[50];
scanf("%d%d%d",&m,&n,&q);
for(i=1;i<=q;++i){
scanf("%s",x);
idx=fd(x);
if(!idx) strcpy(name[idx=++c],x);
old[idx]=1;
scanf("%s",y);
idy=fd(y);
if(!idy) strcpy(name[idy=++c],y);
add(idx,idy);
}
for(i=1;i<=n;++i){
if(!old[i]) continue;
for(j=1;j<=n;++j) visited[j]=0;
ans+=dfs(i);
}
printf("%d",ans);
// system("pause");
return 0;
}
L. Ginger's function
简单题
模拟多项式乘法即可(甚至不需要\(FFT\))
代码
点击查看代码
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<algorithm>
using namespace std;
struct item{
int a,p;
item(){}
item(int x,int y){a=x,p=y;}
bool operator <(item t){
return p<t.p;
}
};
vector<item> a,b,c,d;
int f[20];
void multi(){
int i,j;
c.clear();
d.clear();
for(i=0;i<a.size();++i){
for(j=0;j<b.size();++j){
c.push_back(item(a[i].a*b[j].a,a[i].p+b[j].p));
}
}
sort(c.begin(),c.end());
int sum=0;
for(i=0;i<c.size();++i){
if(i>0&&c[i].p>c[i-1].p&&sum){
d.push_back(item(sum,c[i-1].p));
sum=c[i].a;
}
else sum+=c[i].a;
}
if(sum) d.push_back(item(sum,c[c.size()-1].p));
a.clear();
for(i=0;i<d.size();++i){
a.push_back(d[i]);
}
}
int main(){
int i,j,n,q,x;
scanf("%d%d",&n,&q);
for(i=1;i<=n;++i) scanf("%d",&f[i]);
a.push_back(item(1,0));
for(i=1;i<=n;++i){
b.clear();
b.push_back(item(1,0));
b.push_back(item(-1,f[i]/2));
b.push_back(item(-1,f[i]));
multi();
}
sort(a.begin(),a.end());
for(i=1;i<=q;++i){
scanf("%d",&x);
int pos=lower_bound(a.begin(),a.end(),item(1,x))-a.begin();
printf("%d\n",a[pos].p==x?a[pos].a:0);
}
// system("pause");
return 0;
}
总结
手速场,剩下几题还没写,之后如果能写出来再更吧(咕咕咕)
比区域赛坐牢舒服多了(bushi
【补题】The 2022 SDUT Summer Trials的更多相关文章
- hdu5017:补题系列之西安网络赛1011
补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...
- 2017河工大校赛补题CGH and 赛后小结
网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- [数]补题ver.
上次补题好像把两次训练混在一起了,总之先按时间顺序补完这一次|ू・ω・` ) HDU-6301 不会的东西不能逃避.jpg 红小豆非常讨厌构造题,因为非常不会,并且非常逃避学习这类题,因为总也搞不清楚 ...
- 4.30-5.1cf补题
//yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...
- ICPC南京补题
由于缺的题目比较多,竟然高达3题,所以再写一篇补题的博客 Lpl and Energy-saving Lamps During tea-drinking, princess, amongst othe ...
- 2018 CCPC 桂林站(upc复现赛)补题
2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...
- 【cf补题记录】Codeforces Round #608 (Div. 2)
比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...
- 【cf补题记录】Codeforces Round #607 (Div. 2)
比赛传送门 这里推荐一位dalao的博客-- https://www.cnblogs.com/KisekiPurin2019/ A:字符串 B:贪心 A // https://codeforces.c ...
随机推荐
- 注意看,她叫小美,在地址栏输入URL地址后发生了什么?
注意看,这个用户叫小美,他在地址栏输入了一串URL地址,然后竟然发生了不可思议的事情! 01.输入URL发生了什么? 从输入URL开始,到页面呈现出来,简单来说分为四个步骤: ① 建立连接:建立与服务 ...
- 手写Pinia存储的数据持久化插件
Pinia和Vuex的通病 Pinia和vuex的通病就是,页面刷新会导致数据丢失 解决通病 一.新建store import { defineStore } from 'pinia' //单独存放S ...
- 有关WCH的CH42x以及CH45x选型,常见问题处理方法
南京沁恒微电子的CH45x系列为数码管.按键驱动芯片. CH42x系列为IO扩展芯片.CH422和CH423除了支持的OC数量有一些区别,在单片机的驱动上,并没有任何区别,驱动CH423的代码是可以套 ...
- 8. 字符串转整数 (atoi)
题目 代码 class Solution { public: int myAtoi(string str) { int res=0,sign=1; int i=str.find_first_not_o ...
- 双目测距+点云——使用MiddleBurry数据集的图片
效果 输入: 左图 右图 输出: 视差图 深度图 实现了鼠标点击图片中的位置,显示其深度. 点云 其他例子点云: bicycle motorcycle 使用自己的双目摄像头拍摄的图片: bottle ...
- 解决angular11打包报错Type 'Event' is missing the following properties from type 'any[]': ...Type 'Event' is not assignable to type 'string'
出现这种情况,需要检查一下以下事项 1.ts类型声明和html里写的是否一致 1.1举例如下,子组件代码需要注意事项,子组件调用父组件方法,点击传参给父组件,在父组件触发一些时间,当前this指向是父 ...
- Python TensorFlow深度学习回归代码:DNNRegressor
本文介绍基于Python语言中TensorFlow的tf.estimator接口,实现深度学习神经网络回归的具体方法. 目录 1 写在前面 2 代码分解介绍 2.1 准备工作 2.2 参数配置 2 ...
- 【学习笔记】XR872 GUI Littlevgl 8.0 移植(文件系统)
不得不提 在移植的过程中,发现 LVGL 的文件操作接口并不十分完善,在我看来, LVGL 的文件操作接口,应该更多的是为了 LVGL 内部接口方便读取资源文件而设立的,例如读取图像文件,加载字库文件 ...
- immutable.js学习笔记(六)----- OrderedSet
一.OrderedSet 二.普通Set 与 OrderedSet 注意:普通Set并不是严格的一定是升序的 三.takeWhile 四.升序 sort valueA - valueB 五.降序 va ...
- LeetCode_387. 字符串中的第一个唯一字符
写在前面 原文地址:https://leetcode.cn/problems/first-unique-character-in-a-string/ 难度:简单 题目 给定一个字符串 s ,找到 它的 ...