2021.06.12【NOIP提高B组】模拟 总结
T1
题目大意:有 \(n\) 个点,到点 \(i\) 可以获得 \(A_i\) ,同时消耗 \(B_i\)
若当前价值小于 \(B_i\) 则不能到,问从 \(P\) 开始,任一点结束后的最大值。
最大值同时问最多访问点数。开始不用消耗
其实就是把所有 \(A_i\ge B_i\) 的点存下来,然后贪心
考试时脑抽忘记有消耗了。
T2
题意:一个平面上有两个圆心和 \(n\) 个点,每次给你两个圆的半径
问被任意一个圆覆盖的点的个数
考试时拼命想二分,然后憋一小时写了个 0 分
正解离线,知道后直接 WTF ,
设 \(d_1\) 为到点 \(A\) 的距离,\(d_2\) 为到点 \(B\) 的距离
询问按照 \(r_1\) 排序,点按照 \(d_1\) 排序
由于 \(r_1\) 递增,所以 \(r_{i+1}\) 和 \(r_i\) 有公共的答案,
可以均摊 \(O(1)\) 的时间求出点 \(A\) 包含的点,并把它们在树状数组中标记
于是 \(B\) 包含的不重复的点就是那些距离在 \(r_2\) 内且没被标记的点
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=200005,M=200000;
int n,m,tmp,ans[N],t[N],dy[N],l,r,mid,res;
LL ax,ay,bx,by,r1,r2,d2[N],d1[N];
struct qry { LL r1,r2; int id; }q[N];
inline LL sqr(LL x) { return x*x; }
inline bool cmp(qry a,qry b) { return a.r1<b.r1; }
inline void add(int p,int v) { for(;p<=M;p+=p&-p)t[p]+=v; }
inline int ask(int p) { register int s=0; for(;p;p-=p&-p)s+=t[p]; return s; }
void sor(int l,int r) {
register int i=l,j=r;
register LL mid=d1[(l+r)>>1];
while(i<=j) {
while(d1[i]<mid)i++;
while(d1[j]>mid)j--;
if(i<=j) {
swap(d1[i],d1[j]);
swap(d2[i],d2[j]);
i++,j--;
}
}
if(i<r)sor(i,r);
if(j>l)sor(l,j);
}
int main() {
scanf("%d%d",&n,&m);
scanf("%lld%lld%lld%lld",&ax,&ay,&bx,&by);
for(int i=1,x,y;i<=n;i++) {
scanf("%d%d",&x,&y);
d1[i]=ceil(sqrt(sqr(x-ax)+sqr(y-ay)));
d2[i]=ceil(sqrt(sqr(x-bx)+sqr(y-by)));
add(d2[i],1);
}
sor(1,n);
for(int i=1;i<=m;i++) {
scanf("%lld%lld",&q[i].r1,&q[i].r2);
q[i].id=i;
}
sort(q+1,q+m+1,cmp);
for(int i=1,j=1;i<=m;i++) {
for(;d1[j]<=q[i].r1;j++)
add(d2[j],-1);
ans[q[i].id]=j-1+ask(q[i].r2);
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
}
T3
题目大意:求 \(\sum_{i=m}^n i^k\) 模 \(p\) 意义下的值
对于 \(n-m\le 5000\) 的,直接暴力
然后剩下来的都是 \(k\le 2000\) 的数据
其实是恐怖如斯的自然数幂和,用第二类斯特林数
\(S_n^m=S_{n-1}^{m-1}+kS_{n-1}^m\)
定理:\(n^k=\sum_{i=0}^k S_k^i\times i!\times C_n^i\)
于是有
tmp &= \sum_{i=1}^n i^k \\
&= \sum_{a=1}^n\sum_{i=0}^k S_k^i\times i!\times C_a^i \\
&= \sum_{i=0}^k S_k^i\times i! \sum_{a=1}^n C_a^i \\
&= \sum_{i=0}^k S_k^i\times i! \times C_{n+1}^{i+1} \\
&= \sum_{i=0}^k S_k^i\times i! \times \dfrac{(n+1)!}{(i+1)!(n-i)!} \\
&= \sum_{i=0}^k S_k^i \times \dfrac{(n+1)!}{(i+1)(n-i)!} \\
&= \sum_{i=0}^k S_k^i \times \dfrac{\Pi_{j=n-i+1}^{n+1}}{i+1}
\end{aligned}
\]
其中 \(\sum_{a=1}^n C_a^i=C_{n+1}^{i+1}\) 可以由 \(C_n^m=C_{n-1}^{m-1}+C_{n-1}^m\) 展开
由于在区间 \([n-i+1,n+1]\) 中有且只有一个 \(i+1\) 的倍数,循环时找出即可
复杂度 \(O(n^2)\)
#include<bits/stdc++.h>
using namespace std;
typedef long double LD;
typedef long long LL;
typedef unsigned long long uLL;
LL K,n,m,P,ans,tmp,s[2005][2005];
inline LL Mul(uLL x,uLL y) {
return (x*y-(LL)((LD)x/P*y)*P+P)%P;
}
inline LL Pow(LL x,LL y) {
register LL res=1;
for(;y;y>>=1,x=Mul(x,x))
if(y&1)res=Mul(res,x);
return res;
}
inline LL Ans(LL n) {
ans=0;
for(int i=1;i<=K;i++) {
tmp=s[K][i];
for(LL j=n-i+1;j<=n+1;j++) {
if(j%(i+1))tmp=Mul(tmp,j);
else tmp=Mul(tmp,j/(i+1));
}
ans=(ans+tmp)%P;
}
return ans;
}
int main() {
scanf("%lld%lld%lld%lld",&K,&n,&m,&P);
if(n-m<=5000) {
for(;m<=n;m++)(ans+=Pow(m,K))%=P;
return printf("%lld",ans),0;
}
s[0][0]=1;
for(int i=1;i<=K;i++)
for(int j=1;j<=K;j++)
s[i][j]=(s[i-1][j-1]+j*s[i-1][j]%P)%P;
printf("%lld",(Ans(n)-Ans(m-1)+P)%P);
}
T4
题意:给你 \(n\) 个点,每个点会一直想着它的目标点移动,设运动时间无限长
一个点如果跟上它的目标点,就会跟着目标点一起移动
问一组不知道往哪移动的点。一个点不知道的如何移动,当且仅当它的移动方向只决定于它自己的移动方向
前方高能
题目很复杂,其实就是让你找环!
为什么?
因为这是一个 \(n\) 个点 \(n\) 条边的图,至少有一个环
而这个环上的点在移动时距离不断减少,最终都不知道往哪移动
所以,坐标根本没用!
随便从一点出发,找到环即可
#include<bits/stdc++.h>
using namespace std;
const int N=200005;
int n,st,to[N],vis[N],ans[N];
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&to[i]);
st=1;
while(!vis[st]) {
vis[st]=1;
st=to[st];
}
for(int i=to[st];i^st;i=to[i])
ans[++ans[0]]=i;
ans[++ans[0]]=st;
printf("%d\n",ans[0]);
for(int i=1;i<=ans[0];i++)
printf("%d ",ans[i]);
}
总结
T1:不要忘记条件
T2:在线难就离线
T3:自然数幂和
T4:阅读理解
2021.06.12【NOIP提高B组】模拟 总结的更多相关文章
- 5820. 【NOIP提高A组模拟2018.8.16】 非法输入(模拟,字符串)
5820. [NOIP提高A组模拟2018.8.16] 非法输入 (File IO): input:aplusb.in output:aplusb.out Time Limits: 1000 ms ...
- JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动
5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms ...
- JZOJ 5812. 【NOIP提高A组模拟2018.8.14】 区间
5812. [NOIP提高A组模拟2018.8.14] 区间 (File IO): input:range.in output:range.out Time Limits: 1000 ms Memo ...
- 2021.03.06【NOIP提高B组】模拟 总结
T1 看起来十分复杂,打表后发现答案是 \(n*m\mod p\) 具体的证明... 原式的物理意义,就是从坐标原点(0,0),用每一种合法的斜率, 穿过坐标[1 ~ n , 1 ~ m]的方阵中的整 ...
- [JZOJ5817] 【NOIP提高A组模拟2018.8.15】 抄代码
Description J 君是机房的红太阳,每次模拟她总是 AK 虐场.然而在 NOIP2117 中,居然出现了另一位 AK 的选手 C 君! 这引起了组委会的怀疑,组委会认为 C 君有抄袭 J 君 ...
- [JZOJ5818] 【NOIP提高A组模拟2018.8.15】 做运动
Description 一天,Y 君在测量体重的时候惊讶的发现,由于常年坐在电脑前认真学习,她的体重有了突 飞猛进的增长. 幸好 Y 君现在退役了,她有大量的时间来做运动,她决定每天从教学楼跑到食堂来 ...
- JZOJ5822 【NOIP提高A组模拟2018.8.16】 量子纠缠
这是一道很巧妙的题目. 今早,我调了好久,终于将它切掉了-- 题目 Description Input 第一行包含一个正整数 m,代表操作数. 接下来 m 行,每行可能有以下形式: 1 s 代表将数字 ...
- 【NOIP提高A组模拟2018.8.14】 区间
区间加:差分数组修改 O(n)扫描,负数位置单调不减 #include<iostream> #include<cstring> #include<cstdio> # ...
- [jzoj 5782]【NOIP提高A组模拟2018.8.8】 城市猎人 (并查集按秩合并+复杂度分析)
传送门 Description 有n个城市,标号为1到n,修建道路花费m天,第i天时,若gcd(a,b)=m-i+1,则标号为a的城市和标号为b的城市会建好一条直接相连的道路,有多次询问,每次询问某两 ...
- [jzoj 5781]【NOIP提高A组模拟2018.8.8】秘密通道 (最短路)
传送门 Description 有一副nm的地图,有nm块地,每块是下列四种中的一种: 墙:用#表示,墙有4个面,分别是前面,后面,左面,右面. 起点:用C表示,为主角的起点,是一片空地. 终点:用F ...
随机推荐
- css换算rem单位
地址:https://www.freetechs.cn/tool/rem2px.html
- k8s TLS bootstrap解析-k8s TLS bootstrap流程分析
当k8s集群开启了TLS认证后,每个节点的kubelet组件都要使用由kube-apiserver的CA签发的有效证书才能与kube-apiserver通信:当节点非常多的时候,为每个节点都单独签署证 ...
- 小程序 -- 去掉button默认样式
button { position:relative; display:block; margin-left:auto; margin-right:auto; padding-left:14px; p ...
- Java语言学习day01--6月28日
Java语言学习day01一:Java概述 1.Java语言发展史 任职于太阳微系统的 詹姆斯·高斯林 等人于1990年代初开发Java语言的雏形,最初被命名为 Oak ,目标设置在 家用电器等小型系 ...
- k8s入门之Deployment(五)
Deployment控制器通常用来部署无状态的应用,这样可以在任意的节点上扩容或者删除,而不用考虑数据的问题,它可以管理pod对象. 一.多副本 1.使用命令行方式创建Deployment 在dev名 ...
- 【vue】$attrs的作用和使用方法
之前一直不了解$attrs的作用和使用场景,然后自己翻阅了相关资料整理了下,如有不对的地方请大家指教 $attrs: $attrs是vue版本2.40以上新增的属性: 使用场景: vue项目里面,大家 ...
- 『现学现忘』Git基础 — 14、Git基础操作的总结与补充
目录 1.Git本地版本库结构 2.Git常用操作方法 3.补充:添加多个文件到暂存区 4.补充:提交操作未写备注 5.补充:从工作区直接提交到版本库 1.Git本地版本库结构 如下图所示: 工作区( ...
- ASP.NET视图视图表单验证
视图表单验证 初始化项目 新建一个ASP.NET MVC的项目 新建游戏用户类: public class StemUsers { public int id { get; set; } public ...
- 按照 Promise/A+ 规范逐行注释并实现 Promise
0. 前言 面试官:「你写个 Promise 吧.」 我:「对不起,打扰了,再见!」 现在前端越来越卷,不会手写 Promise 都不好意思面试了(手动狗头.jpg).虽然没多少人会在业务中用自己实现 ...
- JavaScript 数据结构与算法3(链表)
学习数据结构的 git 代码地址: https://gitee.com/zhangning187/js-data-structure-study 1.链表 本章学习如何实现和使用链表这种动态的数据结构 ...