学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的。

所有试题如无特殊声明,开启-O2优化,时限1s,内存上限为128MB

T1(seq)小Z爱序列

题意简析

给出一个1~n的全排列,问有多少对\((i,j)\)满足\(a_{i}<max( a_{[i+1,j-1]} ) < a_{j}\)

数据范围及约定

\(1<=n<=10^6\)

解题思路

通过观察,我们可以发现,答案在从右向左更新时,在某处的贡献为其右侧大于其的数的数量,故考虑使用单调栈维护右侧数单调性,每次先入队再计算贡献即可。

总复杂度为\(O(n) / O(n)\)

#include <stdio.h>
#define MN 1000005
#define r register
#define getchar() (S==TT&&(TT=(S=BB)+fread(BB,1,1<<15,stdin),TT==S)?EOF:*S++)
char BB[1<<15],*S=BB,*TT=BB;
inline int in(){
r int x; r bool f; r char c;
for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
return f?-x:x;
}
int n,ma,x,pos=1,a[MN],t,que[MN];
long long ans;
int main(){
n=in();for (r int i=1; i<=n; ++i) a[i]=in();
for (r int i=n; i; --i){
while (a[i]>que[t]&&t) --t;
que[++t]=a[i];if (t>2) ans+=t-2ll;
}printf("%lld",ans);
}

T2(graph)小Z爱图论

题意简析

给定一张有向图,求有多少点对\((i,j)\)满足从\(i\)是可达\(j\)的.

数据范围及约定

\(1<=n<=2*10^3,1<=i,j<=n\)

解题思路

考虑使用floyd解决连通性问题,发现可以通过bitset优化效率,故可以通过此题.

总复杂度为$O(n^{3}/32) / O(n^2) $

#include <stdio.h>
#include <bitset>
#define MN 2005
#define r register
#define getchar() (S==TT&&(TT=(S=BB)+fread(BB,1,1<<15,stdin),S==TT)?EOF:*S++)
char BB[1<<15],*S=BB,*TT=BB;
using std::bitset;
inline int read(){
r int x; r bool f; r char c;
for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
return f?-x:x;
}
bitset<MN> b[MN];int n,ans;
int main(){
n=read();for (r int i=1; i<=n; ++i)
for (r int j=1; j<=n; ++j)
b[i][j]=(read()|(i==j));
for (r int k=1; k<=n; ++k)
for (r int i=1; i<=n; ++i)
if (b[i][k]) b[i]|=b[k];
for (r int i=1; i<=n; ++i) ans+=b[i].count();
printf("%d",ans);
}

T3(boat)小Z爱划水

题意简析

有\(n\)个人,每个人可以选择划水或学习,有\(m\)对朋友关系,每个人有自己想做的事。

有2种情况会使得整个朋友圈的不满意度+1

1.一个人选择了自己不想做的事

2.一对朋友做了不同的事

求最小不满意度。

数据范围及约定

\(1<=n<=3*10^2,1<=m<=n*(n+1)/2\)

解题思路

容易发现,这是一个经典的网络流模型,对于选择了划水的人,我们将其割至源点,对于选择了学习的人,我们将其割至汇点,显然题意就是求最小割。

具体建图方式如下:

1)喜欢划水的,向源点连一条容量为1的边;

2)喜欢学习的,向汇点连一条容量为1的边;

3)在朋友关系间,互连一条容量为1的边;

对上图求最小割即为本体正解。

总复杂度为$O(Maxflow(n,n^2)) / O(n^2) $

#include <stdio.h>
#include <string.h>
#define r register
#define S 0
#define T 301
#define MN 305
#define ME 100005
#define inf 0x3f3f3f3f
#define min(a,b) ((a)<(b)?(a):(b))
#define getchar() (SS==TT&&(TT=(SS=BB)+fread(BB,1,1<<15,stdin),TT==SS)?EOF:*SS++)
char BB[1<<15],*SS=BB,*TT=BB;
inline int in(){
r int x; r bool f; r char c;
for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
return f?-x:x;
}
struct node{int to,nxt,v;}edge[ME];
int head[MN],lev[MN],n,m,cnt=1,que[MN],iter[MN];
inline void ins(int x,int y,int f){edge[++cnt]=(node){y,head[x],f};head[x]=cnt;}
inline void insw(int x,int y,int f){ins(x,y,f);ins(y,x,0);}
inline bool bfs(){
memset(lev,-1,sizeof(lev));
r int h=0,t=1;que[1]=S;lev[S]=0;
while(h<t){
r int u=que[++h];
for (r int i=head[u]; i; i=edge[i].nxt)
if (lev[edge[i].to]==-1&&edge[i].v){
r int v=edge[i].to;lev[v]=lev[u]+1;
que[++t]=v;
}
}
memcpy(iter,head,sizeof(head));
return lev[T]!=-1;
}
int dfs(int u,int v,int f){
if (u==v) return f;
r int used=0;
for (r int &i=iter[u]; i; i=edge[i].nxt)
if (lev[edge[i].to]==lev[u]+1&&edge[i].v){
r int w=dfs(edge[i].to,v,min(f-used,edge[i].v));
used+=w;edge[i].v-=w;edge[i^1].v+=w;
if (used==f) return f;
}
if (!used) lev[u]=-1;return used;
}
int dinic(){
r int flow=0;
while(bfs()){
r int nf=dfs(S,T,inf);
while(nf) flow+=nf,nf=dfs(S,T,inf);
}return flow;
}
void init(){
n=in(),m=in();for (r int i=1; i<=n; ++i) in()?insw(S,i,1):insw(i,T,1);
for (r int i=1; i<=m; ++i){r int x=in(),y=in();ins(x,y,1);ins(y,x,1);}
}
int main(){init(); printf("%d",dinic()); return 0;}

T4(math)小Z爱数学

题意简析

定义函数\(f(n,k)\)表示\(n\)的所有因数\(p_{i}\)中满足\(n/p_{i}<=k\)的\(p_{i}\)的和。

求\(\Sigma_{i=1}^{n} f(i,k)\) 有多组询问。

数据范围及约定

\(询问数1<=m<=5*10^5,1<=n,k<=10^5\)

解题思路

显然,如果不考虑\(k\)的限制,对于一个正整数\(x\),\(x\)的贡献为全体\(x\)的倍数,并且我们容易发现\(f(n,k)\)在\(n\)一定时,随\(k\)单调递增,故考虑对询问按\(k\)排序。

接下来对于每次询问,统计所有在\(max(n)\)范围内的所有满足当前\(k\)限制的贡献后计算答案,显然使用线段树是可以较为方便的实现这一操作的。

考虑对\([1,n]\)开一棵线段树统计当前的\(f(i,k)\)然后维护即可。

根据调和级数,我们有$$1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n} \approx \ln {n}$$

故时间复杂度为\(O(n\ln n \log_{2} n +m\log_{2}nm)\)空间复杂度为\(O(m+n)\).

#include <stdio.h>
#include <algorithm>
#define r register
#define ll long long
#define MN 500005
#define M (1<<17)
#define getchar() (S==TT&&(TT=(S=BB)+fread(BB,1,1<<15,stdin),TT==S)?EOF:*S++)
char BB[1<<15],*S=BB,*TT=BB;
inline int in(){
r int x; r bool f; r char c;
for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
return f?-x:x;
}
struct node{
int n,k,id;
inline bool operator <(const node &b){
return k<b.k;
}
}q[MN];
ll T[M<<1],ans[MN];int n;
inline void A(int k,int v){for (k+=M; k; k>>=1) T[k]+=v;}
inline ll Q(int L,int R){
r ll res=0;
for (L+=M-1,R+=M+1; L^R^1; L>>=1,R>>=1){
if (~L&1) res+=T[L^1];
if (R&1) res+=T[R^1];
}return res;
}
inline void update(int k){for (r int i=M/k; i; --i) A(i*k,i);}
int main(){
n=in();
for (r int i=1; i<=n; ++i) q[i].n=in(),q[i].k=in(),q[i].id=i;
std::sort(q+1,q+n+1);for (r int i=1,j=0; i<=n; ++i){
while(j<q[i].k) update(++j);
ans[q[i].id]=Q(1,q[i].n);
}
for (r int i=1; i<=n; ++i) printf("%lld\n",ans[i]);
}

【20170521校内模拟赛】热爱生活的小Z的更多相关文章

  1. 【20170920校内模拟赛】小Z爱学习

    所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description ​ 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老 ...

  2. lcez校内模拟赛: 小R与苹果派——题解

    题目传送 首先对两个数组排序. 然后预处理出数组p[i]表示b[x]<a[i]的最大的x. 然后我们设f[i][k]表示对于前i个派,我单独选出来k组a[y]>b[y].(即此时有k组a& ...

  3. Java实现蓝桥杯第十一届校内模拟赛

    有不对的地方欢迎大佬们进行评论(ง •_•)ง 多交流才能进步,互相学习,互相进步 蓝桥杯交流群:99979568 欢迎加入 o( ̄▽ ̄)ブ 有一道题我没写,感觉没有必要写上去就是给你多少MB然后求计 ...

  4. 蓝桥杯校内模拟赛Python解答

    @ 目录 1. 15.125GB 2. 约数个数 3. 叶结点数 4. 数字9 5. 数位递增的数 6. 递增三元组 7. 音节判断 8. 长草 9. 序列计数 10. 晚会节目单 1. 15.125 ...

  5. 计蒜客NOIP模拟赛4 D1T3 小X的佛光

    小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水. 小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X ...

  6. 计蒜客NOIP模拟赛4 D1T2小X的密室

    小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条 ...

  7. 计蒜客NOIP模拟赛4 D1T1 小X的质数

    小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小 X 认为,质数是一切自然数起源的地方. 在小 X 的认知里,质数是除了本身和 1以外,没有其他因数的数字. 但由于小 X ...

  8. 校内模拟赛 虫洞(by NiroBC)

    题意: n个点m条边的有向图,每一天每条边存在的概率都是p,在最优策略下,询问从1到n的期望天数. 分析: dijkstra. 每次一定会优先选dp最小的后继走,如果这条边不存在,选次小的,以此类推. ...

  9. 校内模拟赛 旅行(by NiroBC)

    题意: n个点的无向图,Q次操作,每次操作可以连接增加一条边,询问两个点之间有多少条边是必经之路.如果不连通,输出-1. 分析: 首先并查集维护连通性,每次加入一条边后,如果这条边将会连接两个联通块, ...

随机推荐

  1. C语言博客作业--数组

    一.PTA实验作业 题目1.求整数序列中出现次数最多的数 1.本题PTA提交列表 2.设计思路 定义整形变量n,max,count分别表示整数个数,出现次数最大值,出现次数.定义循环变量i,j. 输入 ...

  2. Software Engineering-HW8 个人总结

    Software Engineering-HW8 个人总结 2017282110264 李世钰 一.请参考第一次作业,当初你对课程的承诺和期望都兑现了吗? 大致实现了.经过了最后的团队项目,基本了解一 ...

  3. 20162302 实验一《Java开发环境的熟悉》实验报告

    实 验 报 告 课程:程序设计与数据结构 姓名:杨京典 班级:1623 学号:20162302 实验名称:Java开发环境的熟悉 实验器材:装有Ubuntu的联想拯救者80RQ 实验目的与要求:1.使 ...

  4. C语言--第三周作业

    一.PTA作业中4个题目 1.7-9 A乘以B 要求:输入的两个整数:A是你学号前两位数字,B是你学号后两位数字 a.代码 #include <stdio.h> int main () { ...

  5. javascript抛物投栏(抛物线实践)

    平面内,到定点与定直线的距离相等的点的轨迹叫做抛物线.水平抛物线就是水平匀速,垂直加速的运动. 抛物线的性质:面内与一个定点F和一条定直线l 的距离相等的点的轨迹叫做抛物线. 定点F叫做抛物线的焦点. ...

  6. Windows Server2012 故障转移集群之动态仲裁(Dynamic Quorum)

    本篇文章主要介绍Windows2012的故障转移集群一个新功能“动态仲裁”,默认该功能是开启的: 动态仲裁能在当前群集投票出现分歧的情况下取消某些节点的投票权限,比如偶数个节点的群集环境.仲裁见证和动 ...

  7. 10-TypeScript中的接口

    接口是一种规约的约定,从接口继承的类必须实现接口的约定.在高级开发中,通常接口是用于实现各种设计模式的基础,没有接口,设计模式无从谈起. 定义接口: interface ILog{ recordlog ...

  8. 剑指offer-链表中环的入口节点

    题目描述 一个链表中包含环,请找出该链表的环的入口结点. 解题思路 解决这个问题的第一步是如何确定一个链表中包含环.可以定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个一次走两步.如果 ...

  9. 开发技巧(3-1)Eclipse查找关键字

    1.选择资源目录->选择search-file菜单 2.在弹出的对话框中, 输入要[搜索的字符串],选择[selected resources],点击[search]按钮 3.搜索结果

  10. CentOS7从U盘中拷贝文件

    1. 要想从U盘中拷贝文件,必须要将U盘挂载到一个目录中,所以必须新建一个目录,一般建在/mnt下.我们执行:mkdir /mnt/usb来新建一个目录. 2. 查看U盘是否已经被识别.执行:df - ...