【比赛】CSP提高组模拟1

news/2024/9/19 15:40:21/文章来源:https://www.cnblogs.com/LBTL/p/18301087

和初三学长们一起打的比赛,被人家爆杀了。

T1 最短路 20Pts

原题 Cow Toll Paths G。

正解是按点权排序后跑一遍 Floyd,歪解是多迭代几遍。

赛时没开 long long \(80 \to 20\)

点击查看代码
#include<bits/stdc++.h>
#define int ll 
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=305;
pii a[N][N];
int n,m,v[N],x,y,q,s,t,w;
main(){freopen("path.in","r",stdin);freopen("path.out","w",stdout); cin>>n>>m>>q;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j)a[i][j]={0,0};else a[i][j]={0x3f3f3f3f3f3f3f3f,0};}}for(int i=1;i<=n;i++)cin>>v[i];for(int i=1;i<=m;i++){cin>>x>>y>>w;w=min(w,a[x][y].first);a[x][y].first=a[y][x].first=w;a[x][y].second=a[y][x].second=max(v[x],v[y]);}int T=3;while(T--)for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){if(i==k)continue;for(int j=1;j<=n;j++){if(j==k||i==j)continue;if(a[i][j].first+a[i][j].second>a[i][k].first+a[k][j].first+max(a[i][k].second,a[k][j].second)){a[i][j].first=a[i][k].first+a[k][j].first;a[i][j].second=max(a[i][k].second,a[k][j].second);}}}}while(q--){cin>>x>>y;if(a[x][y].first==0x3f3f3f3f3f3f3f3f)cout<<"-1\n";else cout<<a[x][y].first+a[x][y].second<<"\n";}return 0;
}

T2 方格取数 40Pts

原题 KUP-Plot purchase。

首先判掉在 \([k,2k]\)(直接输出) 和 \((2k,+\infty)\)(一定不选)的数,剩下的数就都在 \((1,k-1)\) 之间了;
此时如果我们能找出一个总和大于 \(2k\) 的矩阵,那么一定有解,因为其一定包括了一个总和在 \([k,2k]\) 之间的矩阵。
所以我们先找出一个总和大于 \(2k\) 的极大矩阵,然后每次删去一行,如果这一行的和大于 \(k\) 就在这一行中一个一个删,否则继续在大矩阵中进行。
单调栈找最大矩阵即可。

赛时想到了单调栈,但是没打出来,随机化 40。

点击查看代码
#include<bits/stdc++.h>
#define int ll
using namespace std;
typedef long long ll;
const int N=2005;
int n,k,a[N][N],sum[N][N],l[N][N],r[N][N],s[N][N],mp[N][N];
int get(int x,int y,int xx,int yy){return sum[xx][yy]-sum[x-1][yy]-sum[xx][y-1]+sum[x-1][y-1];
}
main(){freopen("matrix.in","r",stdin);freopen("matrix.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>k;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];if(a[i][j]>=k&&a[i][j]<=k*2){cout<<i<<" "<<j<<" "<<i<<" "<<j;return 0;}else mp[i][j]=(a[i][j]<k);sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(mp[i][j])s[i][j]=s[i-1][j]+1;else s[i][j]=0;}}for(int i=1;i<=n;i++){stack<int> ss;for(int j=1;j<=n+1;j++){while(!ss.empty()&&s[i][j]<s[i][ss.top()]){r[i][ss.top()]=j-1;ss.pop();}ss.push(j);}while(!ss.empty())ss.pop();for(int j=n;j>=0;j--){while(!ss.empty()&&s[i][j]<s[i][ss.top()]){l[i][ss.top()]=j+1;ss.pop();}ss.push(j);}for(int j=1;j<=n;j++){int now=get(i-s[i][j]+1,l[i][j],i,r[i][j]);if(now>=k){if(now<=k*2){cout<<i-s[i][j]+1<<" "<<l[i][j]<<" "<<i<<" "<<r[i][j];return 0;}else{for(int h=l[i][j]+1;h<=r[i][j];h++){int noww=sum[i][h]-sum[i][l[i][j]-1];if(noww>=k&&noww<=2*k){cout<<i<<" "<<l[i][j]<<" "<<i<<" "<<h;return 0;}}}}}}cout<<-1;return 0;
}

T3 数组 0Pts

原题 Please, another Queries on Array?。

对于欧拉函数,有式子 \(\varphi(x)=x \ \cdot \ \prod_{i=1}^n\limits (\frac{p_i-1}{p_i})\),其中 \(p_i\)\(x\) 的所有质因数。

区间积可以用线段树维护,难点在于质因子的维护。

通过一些技术手段,我们发现,在 300 以内只有 62 个质因子,刚好可以用一个 long long 来状压。
同样丢到线段树里即可。

赛时因为 1<<62 爆零了。

1<<62 \(\to\) 1ll<<62 \(0 \to 100\)

点击查看代码
#include<bits/stdc++.h>
#define int ll
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=4e5+5;
int n,a[N],l,r,x,q;
string op;
int prim[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293};
inline int qp(int a,int b,int mod=mod){int ans=1;while(b){if(b&1)ans=ans*a%mod;b>>=1;a=a*a%mod;}return ans;
}
inline int getp(int x){int p=0;for(int i=0;i<62;i++){if(x%prim[i]==0)p|=(1ll<<i);}return p;
}
struct tree{int l,r,mul,lzm;int p,lzp;int len(){return r-l+1;}
}t[N<<2];
void pushup(int k){t[k].mul=t[k<<1].mul*t[k<<1|1].mul%mod;t[k].p=t[k<<1].p|t[k<<1|1].p;
}
void build(int k,int l,int r){t[k]={l,r,a[l],1};if(l==r){int p=getp(a[l]);t[k].p=p;t[k].lzp=0;return;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);pushup(k);
}
void pushdown(int k){if(t[k].lzm!=1){t[k<<1].mul=t[k<<1].mul*qp(t[k].lzm,t[k<<1].len())%mod;t[k<<1].lzm=t[k<<1].lzm*t[k].lzm%mod;t[k<<1|1].mul=t[k<<1|1].mul*qp(t[k].lzm,t[k<<1|1].len())%mod;t[k<<1|1].lzm=t[k<<1|1].lzm*t[k].lzm%mod;t[k].lzm=1;}if(t[k].lzp!=0){t[k<<1].p|=t[k].lzp;t[k<<1].lzp|=t[k].lzp;t[k<<1|1].p|=t[k].lzp;t[k<<1|1].lzp|=t[k].lzp;t[k].lzp=0;}
}
void update(int k,int l,int r,int val,int p){if(l<=t[k].l&&t[k].r<=r){t[k].mul=t[k].mul*qp(val,t[k].len())%mod;t[k].lzm=t[k].lzm*val%mod;t[k].p|=p;t[k].lzp|=p;return;}pushdown(k);int mid=(t[k].l+t[k].r)>>1;if(l<=mid)update(k<<1,l,r,val,p);if(r>mid)update(k<<1|1,l,r,val,p);pushup(k);
}
pii query(int k,int l,int r){if(l<=t[k].l&&t[k].r<=r){return {t[k].mul,t[k].p};}pushdown(k);int mid=(t[k].l+t[k].r)>>1;pii ans={1,0};if(l<=mid){pii L=query(k<<1,l,r);ans.first=ans.first*L.first%mod;ans.second|=L.second;}if(r>mid){pii R=query(k<<1|1,l,r);ans.first=ans.first*R.first%mod;ans.second|=R.second;}return ans;
}
int inv[500];
main(){freopen("array.in","r",stdin);freopen("array.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);for(int i=1;i<=400;i++)inv[i]=qp(i,mod-2);cin>>n>>q;for(int i=1;i<=n;i++)cin>>a[i];build(1,1,n);while(q--){cin>>op;if(op=="1"){cin>>l>>r>>x;int p=getp(x);update(1,l,r,x,p);}else{cin>>l>>r;pii tmp=query(1,l,r);int ans=tmp.first,p=tmp.second;for(int i=0;i<62;i++){if((p>>i)&1){ans=ans*(prim[i]-1)%mod*inv[prim[i]]%mod;}}cout<<ans<<"\n";}}return 0;
}

T4 树 30Pts

原题 ODW。

根号分治。
设块长为 \(T\)
预处理出步长为 \([1,\sqrt T]\) 时每个点向上跳到根的点权和以及每个点的 \(1 \backsim \sqrt T\)
大于 \(T\) 则暴力跳,否则树上差分。

这题数据很水,暴力有 70,能过除了链以外的所有点;加个对链的暴力就过了。
但赛时树剖 LCA 打锅了导致 \(100 \to 30\)

后记

还是学到了很多的,也确实是技不如人。

之后要注意代码细节问题,尽量不要在不该挂的地方挂分。

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

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

相关文章

トヨタ自動車プログラミングコンテスト2024#7(ABC 362)

非常好名次,使我的 \(1\) 旋转 四发罚时应该是这次比赛最唐的东西了,没有就进前一千了 A.Buy a Pen 特判秒了,懒得打三种 ans=,所以就把不能选的那个赋值成无穷大了 #include<bits/stdc++.h> using namespace std; #define speed ios::sync_with_stdio(false); #defi…

领域驱动设计:CQRS 和事件源的强大功能

CQRS/ES 如何重新定义构建可扩展系统。 在过去的 15 年里,我一直在深入研究领域驱动设计 (DDD),每一步都在学习和改进。我一直很好奇,尤其是当你深入挖掘时,简单的客户请求会变得更加复杂。我特别感谢EventStorming这样的工具,它帮助揭示看似简单需求背后的真实流程和事件…

k8s简介

一、K8S 概览 1)K8S 是什么? K8S 是Kubernetes的全称,源于希腊语,意为“舵手”或“飞行员”,官方称其是:用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。翻译成大白话就是:“K8S 是负责自动化运维管理多个跨机器 Docker 程序的集群”。 2) K…

flutter Error: unable to locate asset entry in pubspec.yaml: assets/fonts/Lato-Regular.ttf

在pubspec.yaml中添加font的时候出现这个问题 发现是因为我放的文件夹不对,需要放在根目录下(但是我不知道为什么android studio里没有显示一些文件夹) 本来放在这里 一直不对后来在文件夹找了一下放到lib里 新建了assets文件夹

详解工单系统

工单系统在人类早期的行为活动中就一直存在的理念,是人类关于工作流程的管理和记录。随着计算机软件的不断发展,工单系统由线下转为线上,提升了问题传达的准确性、处理效率以及数据的长久留痕可追溯等,应用领域也日渐广泛。本文将着重介绍工单的概念、不同领域工单系统简介…

Vue 3 后端错误消息处理范例

前端如何存储处理后端返回的错误信息,并按不同来源绑定到页面,例如显示在不同输入框的周围。这样即可实现清晰的错误显示。1. 错误消息格式 前后端消息传递时,我们可以通过 json 的 errors 字段传递错误信息,一个比较好的格式范例为: {errors: {global: ["网络错误&q…

OpenDiary 24.7

致敬传奇耐拖王现在是,7 月 13 日。距离上一次写日记过去了 58 天 致敬传奇耐拖王 xiwon那么,在鼠鼠肘赢牢大之前的这段时间,what happened, on earth?五月下旬,前去了西安邀请赛,打的一坨。回来之后写了一点游记,但是居然还没有写完 那么到底为什么没有写完呢?这要从很…

我用cpca 截取地址中的省市区,突然就乱了,这是什么原因

大家好,我是Python进阶者。 一、前言 前几天在Python钻石交流群【逆光】问了一个Python数据处理的问题,问题如下:请问一下 我用cpca 截取地址中的省市区,突然就乱了,这是什么原因? 二、实现过程 这里【瑜亮老师】给了个思路如下:看着好像是行弄乱了。 【不上班能干啥!】…

k8s字段选择器

目录一、概述二、基本语法三、支持的字段1、错误示例2、支持的字段列表四、支持的操作符1、示例五、跨多种资源类型使用字段选择器 一、概述 在Kubernetes中,字段选择器(Field Selectors)和标签选择器(Label Selectors)是两种不同的查询机制,用于过滤和选择特定的资源。字…

three.js+vue污水处理厂数字孪生平台智慧城市web3d

案例效果截图如下: 主场景三维逻辑代码如下:<template><div class="whole"><!-- threejs画布 --><div id="threejs" ref="threejs"></div><!-- 污水厂模型加载进度条 --><a-progress:stroke-color=&quo…