CSP2024 前集训:多校A层冲刺NOIP2024模拟赛03

news/2024/12/24 8:59:56/文章来源:https://www.cnblogs.com/Charlieljk/p/18450461

前言

image

T1 没想到正难则反,脑瘫了没敢用 bitset(复杂度擦边但卡常能过),T2 空间开大了挂了 \(100pts\)\(T3\) 是原。

T1 五彩斑斓

  • 部分分 \(20pts\)\(O(n^4)\) 暴力。

  • 部分分 \(20+?pts\):进行一些优化,极限数据下仍是 \(O(n^4)\)

  • 部分分 \(60\sim 100pts\):bitset 优化一下,\(O(\frac{n^4}{w})\)

  • 正解:

    正难则反,求四个角都相同的个数再用总数减。

    枚举行 \(i\) 和行 \(j\),若 \(a_{i,k}=a_{j,k}\) 则答案加上 \(\sum\limits_{h=1}^{k}[a_{i,k}=a_{j,k}]\),可以开桶处理,清空的时候循环 \(k\) 进行清空即可。

    点击查看代码
    #include<bits/stdc++.h>
    #define ll long long 
    #define endl '\n'
    #define sort stable_sort
    using namespace std;
    const int N=410,M=1e6+10;
    template<typename Tp> inline void read(Tp&x)
    {x=0;register bool z=true;register char c=getchar_unlocked();for(;!isdigit(c);c=getchar_unlocked()) if(c=='-') z=0;for(;isdigit(c);c=getchar_unlocked()) x=(x<<1)+(x<<3)+(c^48);x=(z?x:~x+1);
    }
    template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
    template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
    template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
    template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
    int n,m,a[N][N],cnt[M]; ll ans;
    signed main()
    {freopen("colorful.in","r",stdin),freopen("colorful.out","w",stdout);read(n,m);for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) read(a[i][j]);for(int i=1;i<=n;i++) for(int j=i;j<=n;j++){for(int k=1;k<=m;k++) if(a[i][k]==a[j][k]) ans+=(++cnt[a[i][k]]);for(int k=1;k<=m;k++) if(a[i][k]==a[j][k]) cnt[a[i][k]]=0;}write(1ll*n*(n+1)*1ll*m*(m+1)/4-ans);
    }
    

T2 错峰旅行

  • 部分分 \(20pts\)\(O(t-s)\) 暴力。

  • 部分分 \(80pts\):发现只关心每个时间点有多少个城市可以去,发现 \([s,t]\) 可以划分成至多 \(2m+1\) 个区间,每个区间内的情况是完全一致的,所以动态开点线段树维护即可,复杂度 \(O(m\log(v))\)\(v=10^9\),但是空间开不下,开大了就会爆零。

  • 正解:

    发现离散化一下就可以直接差分做了,复杂度 \(O(m\log(m))\),瓶颈在于离散化。

    点击查看代码
    #include<bits/stdc++.h>
    #define ll long long 
    #define endl '\n'
    #define sort stable_sort
    using namespace std;
    const int N=2e6+10,P=1e9+7;
    template<typename Tp> inline void read(Tp&x)
    {x=0;register bool z=true;register char c=getchar_unlocked();for(;!isdigit(c);c=getchar_unlocked()) if(c=='-') z=0;for(;isdigit(c);c=getchar_unlocked()) x=(x<<1)+(x<<3)+(c^48);x=(z?x:~x+1);
    }
    template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
    template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
    template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
    template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
    int n,m,s,t,tot,ans,a[N],b[N],c[N],l[N],r[N];
    int qpow(int a,int b)
    {int res=1; for(;b;b>>=1,a=1ll*a*a%P) if(b&1) res=1ll*res*a%P; return res;}
    signed main()
    {freopen("travel.in","r",stdin),freopen("travel.out","w",stdout);read(n,m,s,t),b[++tot]=s,b[++tot]=s+1,b[++tot]=t+1;for(int i=1,x;i<=m;i++) read(x,l[i],r[i]),b[++tot]=l[i],b[++tot]=r[i]+1;sort(b+1,b+1+tot),tot=unique(b+1,b+1+tot)-(b+1);for(int i=1;i<=m;i++){c[lower_bound(b+1,b+1+tot,l[i])-b]++;c[lower_bound(b+1,b+1+tot,r[i]+1)-b]--;}for(int i=1;i<=tot;i++) a[i]=a[i-1]+c[i]; ans=n-a[1];for(int i=3;i<=tot;i++) ans=1ll*ans*qpow(n-a[i-1],b[i]-b[i-1])%P;write(ans);
    }
    

T3 线段树

详见 NOIP2024模拟2。

T4 量子隧穿问题

发现是一棵基环树森林,只关心节点 \(n\) 所在的连通块。

对于树上的情况直接处理即可,有定义 \(p_i\) 表示点 \(i\) 有猫的概率,对于边 \((x,y)\),有 \(p_x'=p_x\times p_y,p_y'=p_y+p_x\times(1-p_y)\)

考虑如何处理环,发现环上编号最小的边的状态存在后效性,遂钦定该条边连接两点的状态,然后按照树上处理,最后乘上这种状态的概率即可。

点击查看代码
#include<bits/stdc++.h>
#define ll long long 
#define endl '\n'
#define sort stable_sort
using namespace std;
const int N=5010,P=1e9+7,inv2=500000004;
template<typename Tp> inline void read(Tp&x)
{x=0;register bool z=true;register char c=getchar_unlocked();for(;!isdigit(c);c=getchar_unlocked()) if(c=='-') z=0;for(;isdigit(c);c=getchar_unlocked()) x=(x<<1)+(x<<3)+(c^48);x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int T,n,ans,pos,p[N],to[N]; char s[N];
struct dsu
{int f[N];void init(int n) {for(int i=1;i<=n;i++) f[i]=i;}int find(int x) {return x==f[x]?x:f[x]=find(f[x]);}bool same(int x,int y) {return find(x)==find(y);}bool merge(int x,int y) {return (x=find(x))==(y=find(y))?1:!(f[y]=x);}
}t1,t2;
signed main()
{freopen("experiment.in","r",stdin),freopen("experiment.out","w",stdout);for(read(T);T;T--){read(n),scanf("%s",s+1); ans=0,t1.init(n),t2.init(n); for(int i=1;i<=n;i++) read(to[i]),t1.merge(i,to[i]);for(int i=n;i>=1;i--) if(t1.same(i,n)&&t2.merge(i,to[i])) pos=i;for(int s1=0;s1<=1;s1++) for(int s2=0;s2<=1;s2++){for(int i=1;i<=n;i++) p[i]=s[i]=='C'?1:(s[i]=='?'?inv2:0);int q=1; for(int i=1,x,y;i<=n;i++){if(i==pos) {q=1ll*(s1?p[pos]:1-p[pos]+P)*(s2?p[to[pos]]:1-p[to[pos]]+P)%P;if(!q) break; p[i]=s1,p[to[i]]=s2;}p[i]=1ll*(x=p[i])*(y=p[to[i]])%P,p[to[i]]=(1ll*x*(1-y+P)%P+y)%P;}(ans+=1ll*q*p[n]%P)%=P;}for(int i=1;i<=n;i++) if(s[i]=='?') (ans*=2)%=P;write(ans),puts("");}
}

总结

  • 注意正难则反。
  • 擦边的复杂度也要打,肯定比纯暴力分高。
  • 这个破 OJ 空间开多大算多大,开大直接爆零。
  • 静态可差分问题完全可以不用线段树。

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

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

相关文章

在C#中使用适配器Adapter模式和扩展方法解决面向的对象设计问题

之前有阵子在业余时间拓展自己的一个游戏框架,结果在实现的过程中发现一个设计问题。这个游戏框架基于MonoGame实现,在MonoGame中,所有的材质渲染(Texture Rendering)都是通过SpriteBatch类来完成的。举个例子,假如希望在屏幕的某个地方显示一个图片材质(imageTexture)…

React Fiber 原理

React Fiber 在 React 16 之前的版本对比更新 VirtualDOM 的过程是采用 Stack 架构实现的,也就是循环加递归,这种方式的问题是一旦任务开始进行就无法被中断。 如果应用中的组件数量庞大, Virtual DOM 的层级比较深,主线程被长期占用,知道整颗 Virtual DOM 树比对更新完成…

视野修炼-技术周刊第104期 | 下一代 JavaScript 工具链

① 🐙 尤大创办公司 VoidZero ② Tauri 2.0 稳定版发布 ③ Vite 时髦的新主页 ④ qrframe - 漂亮二维码生成 ⑤ HTTP QUERY 方法提案 ⑥ TinyJS - 轻量级的创建DOM元素 ⑦ 9月 Web 平台的新功能 ⑧ ESLint 现在正式支持 Linting JSON 和 Markdown欢迎来到第 104 期的【视野修…

雅礼国庆集训 day1 T2 折射

题面 题面下载 算法 转化题意 说白了就是给了你一堆点,让你数这种折线有多少个 (严格向下走,并且横坐标之间的差越来越小)看着像一种在 y 轴方向排序的 dp 但是由于是折线, 所以需要加一维来判断转向 dp 设计 状态设计 \(dp_{i, 0/1}\) 表示第 i 个点, 是向左下还是右上 状态…

React 中的 diff 算法

React diff为什么使用虚拟 DOM ? 浏览器在处理 DOM 的时候会很慢,处理 JavaScript 会很快,页面复杂的时候,频繁操作 DOM 会有很大的性能开销(每次数据变化都会引起整个 DOM 树的重绘和重排)。 为了避免频繁操作 DOM,React 会维护两个虚拟 DOM,如果有数据更新,会借此计…

20222315 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 1.掌握反汇编与十六进制编程器 2.能正确修改机器指令改变程序执行流程 3.能正确构造payload进行bof攻击 2.实验过程 1.直接修改程序机器指令,改变程序执行流程 将pwn1文件下载至kali中并将pwn1文件改名为pwn20222315,并将其内容复制到pwn2反汇编文件objdump -d…

多校A层冲刺NOIP2024模拟赛03

多校A层冲刺NOIP2024模拟赛03\(T1\) A. 五彩斑斓(colorful) \(90/100pts\)部分分\(20pts\) :枚举左上 \((k,h)\) 、右下端点 \((i,j)\) ,时间复杂度为 \(O(n^{2}m^{2})\) 。 \(90/100pts\) :当 \(a_{i,j} \ne a_{k,j}\) 时任意的 \(h \in [1,j]\) 都符合题意、不妨钦定 \(…

Word中 Endnote 引用标蓝色

1. 打开word中的endnote加载项。如图所示,勾选这两个设置。 确认后会自动变为超链接,显示蓝色以及下划线。 2. 在样式设置中,将超链接的下划线取消。之后就会只显示蓝色引用。 结果显示:

中国大学生程序设计竞赛(秦皇岛)正式赛东北大学秦皇岛分校(SMU Autumn 2024 Team Round 1)

中国大学生程序设计竞赛(秦皇岛)正式赛东北大学秦皇岛分校(SMU Autumn 2024 Team Round 1) Problem A. 贵校是构造王国吗 I 思路 官方题解很清晰明了。代码 #include <bits/stdc++.h> using namespace std; #define int long long #define endl \n #define PII pair&…

多校 A 层冲刺 NOIP2024 模拟赛 03

多校 A 层冲刺 NOIP2024 模拟赛 03 T1 五彩斑斓(colorful) 签到题 直接暴力枚举是 \(O(n^4)\) ,考虑使用 \(bitset\) 优化,对每个点开个 \(bitset\),预处理它所在一行它及它之前相同颜色的位置,这样就只用枚举另一个点所在列,时间复杂度为 \(O(n^3+\frac{n^4}{w})\)。 T…

在浏览器上访问媒体资源配置【文件上传】

1.根urls.py文件中 from django.contrib import admin from django.urls import path, include, re_path from django.views.static import serve from django.conf import settingsurlpatterns = [# path(admin/, admin.site.urls),path(api/shipper/, include(apps.shipper.u…