2022.7.12 模拟赛
2022.7.12 模拟赛#
比赛 link#
牛半仙的妹子数#
题意:
给你 组数据,每组数据给你 个数 ,你需要进行 次操作
假定 ,则每次:
- 若 ,则
- 否则
求出 次操作后 的值
思路:
容易发现在这两种操作下 值恒定
第一种操作
第二种操作
最后
快速幂求解
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
int mod;
inline int qpow(int x,int idx){
if(!idx) return 1;
int t=qpow(x,idx>>1);
if(idx&1) return t*t%mod*x%mod;
return t*t%mod;
}
inline void solve(){
int a=read(),b=read(),c=read(),k=read();
mod=a+b+c;
cout<<qpow(2,k)*c%mod<<endl;
}
signed main(){
int T=read();
while(T--){
solve();
}
}
真 人类智慧题,考场上想了一个小时最后写了暴力
(所以我没有智慧)
牛半仙的妹子图#
题意:
给你一个 个点 条边的无向图以及图中的起始点 ,每条边 有一个权值 ,每个点有一个颜色
每次你会从 出发,走向所有能走到的点,若这次最大承受值是 ,则你经过的所有边的边权必须小于等于
你每次出发获得的价值是你到的所有点总共的不同颜色数
给你 次询问,每次给你两个数
你需要求出 从 出发最大承受值为 的价值
本题强制在线
思路:
容易有一个想法就是求出到达每一个点的最短路,从而求出遍历到每个颜色的最大承受值最小是多少
这个可以跑一个
由于强制在线, 不能用莫队
由于 ,可以考虑枚举每一个颜色最小的最大承受值,然后统计每个颜色对 有多少贡献
这样的期望时间复杂度是 ,其中 是 的常数
code:
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
const int C=505;
const int inf=1e9+5;
#define pb push_back
#define int long long
#define re register
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
struct node{
int a,b;
};
struct pt{
int c,x;
inline bool operator < (const pt X) const{
return x<X.x;
}
}a[N];
vector <node> G[N];
vector <int> p;
int n,m,rt,op,mod,cnt;
int c[N],d[605];
int dis[N],vis[N];
inline void spfa(){
for(int i=1;i<=n;++i) dis[i]=inf;
vis[rt]=1;
dis[rt]=0;
queue <int> q;
q.push(rt);
while(!q.empty()){
re int x=q.front();
q.pop();
vis[x]=0;
for(auto y:G[x]){
if(dis[y.a]>max(dis[x],y.b)){
dis[y.a]=max(dis[x],y.b);
if(!vis[y.a]) q.push(y.a),vis[y.a]=1;
}
}
}
for(int i=1;i<=n;++i){
a[i].c=c[i],a[i].x=dis[i];
}
sort(a+1,a+n+1);
for(int i=1;i<=n;++i){
if(a[i].x!=inf){
if(!d[a[i].c])
d[a[i].c]=1,p.push_back(a[i].x);
}
}
sort(p.begin(),p.end());
}
int q;
signed main(){
n=read(),m=read(),q=read(),rt=read(),op=read();
if(op==1) mod=read();
for(int i=1;i<=n;++i) c[i]=read();
for(int i=1;i<=m;++i){
int x=read(),y=read(),z=read();
G[x].pb({y,z});
G[y].pb({x,z});
}
spfa();
int last=0;
while(q--){
//cout<<"qwq"<<endl;
re int l=read(),r=read();
if(op) l=(l^last)%mod+1;
if(op) r=(r^last)%mod+1;
if(l>r) swap(l,r);
re int ans=0ll;
for(re int i=0;i<(int)p.size();++i){
//cout<<p[i]<<endl;
if(p[i]>r) break;
ans+=(r-max(p[i],l)+1);
//cout<<ans<<endl;
}
last=ans;
printf("%lld\n",ans);
}
}
考试的时候 写出来了,但转移的时候还是下意识的写了 ,实际上应该是
关键是考场上没写对拍,而且在我的玄学改法下过了样例
然后 ,我好恨啊
牛半仙的妹子 Tree#
题意:
给你一个 个点 条边的树以及一个数
每个点 有一个点权 ,初始均为
接下来有 次操作,每次给你两个数 和
每个操作一秒钟
- 若 则将 改为 ,并扩散
- 若 则将所有点点权改为
- 若 则询问这一秒结束 是否为
注意,扩散是指:当一个点点权在第 秒被改为 后会在第 秒将所有与其相邻的点点权改为
思路:
考虑若是没有操作 这题可以直接一个 解决
因此考虑根据每一个 操作将此问题分成多段
分情况考虑此问题,类似于一个分块的思想
若是第 次 操作到第 次 操作之间的操作数 小于等于 ,则跑 的暴力
否则可以跑 ,时间复杂度是 的
这样算下来总的复杂度是 的,可以跑过此题
这题的 可以依据写的暴力的速度而定,我这个暴力就跑得很快
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int inf=1e9+5;
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
int n,m;
int f[N][20],dep[N];
int d[N];
struct node{
int x,t;
inline bool operator < (const node X) const{
return t<X.t;
}
};
vector <node> p;
set <node> s;
vector <int> G[N];
inline void bfs(){
for(int i=1;i<=n;++i) d[i]=inf;
queue <int> q;
for(auto x:s){
if(d[x.x]==inf) d[x.x]=x.t;
q.push(x.x);
}
while(!q.empty()){
int x=q.front();q.pop();
for(auto y:G[x]){
if(d[y]>d[x]+1){
q.push(y);
d[y]=d[x]+1;
}
}
}
for(auto y:p){
if(y.t>=d[y.x]){puts("wrxcsd");}
else{puts("orzFsYo");}
}
}
inline int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=17;i>=0;--i)
if(dep[f[x][i]]>=dep[y])
x=f[x][i];
if(x==y) return x;
for(int i=17;i>=0;--i)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][0];
}
inline void dfs(int x,int fa){
f[x][0]=fa;
dep[x]=dep[fa]+1;
for(int i=1;i<=17;++i)
f[x][i]=f[f[x][i-1]][i-1];
for(auto y:G[x]){
if(y==fa) continue;
dfs(y,x);
}
}
inline void brute_force(){
for(auto x:p){
bool flag=0;
for(auto y:s){
int a=x.x,b=y.x;
if(dep[a]+dep[b]-2*dep[lca(a,b)]<=x.t-y.t){
flag=1;
puts("wrxcsd");
break;
}
}
if(!flag) puts("orzFsYo");
}
}
signed main(){
n=read(),m=read();
for(int i=1;i<n;++i){
int x=read(),y=read();
G[x].push_back(y);
G[y].push_back(x);
}
int pre=0;
dfs(1,0);
for(int T=1;T<=m;++T){
int op=read(),x=read();
if(op==1){
s.insert({x,T});
}
if(op==2){
if(T-pre<=3000) brute_force();
else bfs();
pre=T;
s.clear(),p.clear();
}
if(op==3){
p.push_back({x,T});
}
if(T==m&&op!=2){
if(T-pre<=3000) brute_force();
else bfs();
}
}
}
woc解法好暴力
不过考场上没有想到
牛半仙的魔塔(增强版)#
这题在图上跑贪心?没有理解
所以不写了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现