20210712考试-2021noip11
这篇总结比我写的好多了建议直接去看
T1 简单的序列
考场:
愣了一会,想到以最大值分治。每次枚举最大值两侧更小的区间,st表预处理前缀和和最大值,用桶统计答案.
注意分治时要去掉最大值。
const int N = 3e5+5, X = 1e6+5;
int n,k,a[N]; int m,s[N],head[N],nxt[N*36],val[N*36],op[N*36],cnt[X];
LL ans; namespace st {
int lg[N],pw[19],f[19][N],p[19][N];
void init() {
lg[1] = 0;
For(i,2,n) lg[i] = lg[i>>1]+1;
pw[0] = 1;
For(i,1,18) pw[i] = pw[i-1]<<1;
For(i,1,n) f[0][i] = a[i], p[0][i] = i;
For(j,1,18) for(int i = 1; i+pw[j]-1 <= n; ++i) {
int mid = i+pw[j-1];
if( f[j-1][i] > f[j-1][mid] )
f[j][i] = f[j-1][i], p[j][i] = p[j-1][i];
else f[j][i] = f[j-1][mid], p[j][i] = p[j-1][mid];
}
}
int maxx(int l,int r) {
int k = lg[r-l+1], mid = r-pw[k]+1;
return f[k][l]>f[k][mid] ? p[k][l] : p[k][mid];
}
} void add(int x,int l,int r) {
x %= k;
if( x < 0 ) x += k;
// printf(">%d %d %d\n",x,l,r);
if( l ) val[++m] = x, op[m] = -1, nxt[m] = head[l-1], head[l-1] = m;
val[++m] = x, op[m] = 1, nxt[m] = head[r], head[r] = m;
}
void solve(int l,int r) {
if( l >= r ) { ans += l==r; return; }
int p = st::maxx(l,r);
// printf(">%d %d %d\n",l,p,r);
if( p-l < r-p ) For(i,l,p) add(s[i-1]+a[p],p,r);
else For(i,p,r) add(s[i]-a[p],l-1,p-1);
solve(l,p-1), solve(p+1,r);
} signed main() {
read(n,k);
For(i,1,n) read(a[i]), s[i] = (s[i-1] + a[i]) %k;
st::init();
solve(1,n);
For(i,0,n) {
++cnt[s[i]];
for(int j = head[i]; j; j = nxt[j]) ans += op[j] * cnt[val[j]];
}
printf("%lld",ans-n);
return 0;
}
上界 $O(n\log(n))$
或者传统的以 $mid$ ,严格 $O(n\log(n))$
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=300010,M=1100000;
int t[M][2],a[N],s[N],mx[N],pos[N],n,k,H;
long long ans;
inline void read(int &e)
{
e=0;int w=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)){e=e*10+ch-'0';ch=getchar();}
e*=w;return;
}
inline void fenzhi(int l,int r)
{
if(l==r)
return;
int mid=(l+r)>>1;
s[mid]=H=mx[0]=0;
for(int i=mid+1;i<=r;i++)
{
if(a[i]>a[mx[H]])
mx[++H]=i;
s[i]=((s[i-1]+a[i])%k+k)%k;
t[((s[i]-a[mx[H]])%k+k)%k][0]++;
pos[i]=mx[H];
}
mx[H+1]=r+1;
int p = 1,z = 0,p1 = mid + 1,mx1 = 0;
for(int i=mid;i>=l;i--)
{
z=(z+a[i])%k,mx1=max(mx1,a[i]);
while(p<=H&&a[mx[p]]<=mx1)
++p;
while(p1<mx[p])
{
t[(s[p1]-a[pos[p1]]%k+k)%k][0]--;
t[s[p1]][1]++;
p1++;
}
ans+=t[(k+mx1%k-z)%k][1];
if(p<=H)ans+=t[(k-z)%k][0];
}
for(int i=mid+1;i<p1;++i)
t[s[i]][1]--;
for(int i=p1;i<=r;++i)
t[(s[i]-a[pos[i]]%k+k)%k][0]--;
fenzhi(l,mid);
fenzhi(mid + 1,r);
}
int main ()
{
read(n);read(k);
for(int i = 1;i <= n; ++i)
{
read(a[i]);
}
fenzhi(1,n);
printf("%lld\n",ans);
return 0;
}
T2 简单的玄学
显然有:
$\begin{align}ans=\frac{\prod_{i=n-m+1}^{n-1}2^n-i}{2^{n(m-1)}}\\\end{align}$
考场:不难发现连乘部分是两端阶乘之商,而 $m$ 范围较大,阶乘中极易“经过”模数 $1000003$ 的倍数,那么只需要预处理至模数的阶乘就可以,对作为除数的阶乘求逆元。
但如果作为阶乘取模变为0,但是两者仍然要约分怎么办,可以先取模再约分吗?如果先约分再取模是不是太难了,应该是先取模再约分,举了个例子没有发现问题。
于是炸了。
题解:先取模再约分的话就太水了,所以先约分再取模。
显然有 $2^n-i$ 中2的个数等于 $i$ 中2的个数。
故对上面的式子分母两次快速幂 $\begin{align}a^{b} \bmod s=a^{b \bmod (s-1)} \bmod s\end{align}$ ,之后统计分子中2的因数个数,相当于统计 $(m-1)!$ 阶乘中2的因数个数:核心代码:
long long ercnt=n;
for(long long i=1;(1LL<<i)<m;i++)
{
ercnt+=(m-1)/(1LL<<i);
}
约分后取模,可以取模后分子分母同乘2的逆元的因数个数幂。切记不要想当然除gcd。
#include<bits/stdc++.h>
using namespace std;
const int mod=1e6+3,phi=1e6+2;
long long jc[mod+100],a,b,n,m,ercnt;
long long quick_pow(long long x,long long y)
{
long long rec=1;
while(y)
{
if(y&1)
{
rec=rec*x%mod;
}
y>>=1;
x=x*x%mod;
}
return rec;
}
int main()
{
scanf("%lld%lld",&n,&m);
long long ercnt=n;
for(long long i=1;(1LL<<i)<m;i++)
{
ercnt+=(m-1)/(1LL<<i);
}
long long maxn=quick_pow(2,n%phi);
b=quick_pow(maxn,m%phi);
a=1;
for(long long i=0;i<m;i++)
{
a=a*(maxn-i)%mod;
if(!a)
break;
}
b=b*quick_pow(500002,ercnt)%mod;//2逆元500002
a=a*quick_pow(500002,ercnt)%mod;
printf("%lld %lld\n",(b-a+mod)%mod,b);
return 0;
}
T3 简单的填充
考场:没看
DP,维护 $up$ 和 $down$,分别表示当前格子最大可能能放的数字以及这个数字是第几次重复,和当前格子最小可能能放的数字以及这个数字是第几次重复。遍历时两者都继承上一个格子,上限每重复两次就更新,下限则是五次。如果当前格子有值就用它纠正二者,矛盾则impossible。为满足题意,最后剩下的格子(与 $n$ 点间没有确定的数)尽量多放大数。
#include<bits/stdc++.h>
using namespace std;
const int N=1100000;
int upc[N],upx[N],a[N],n,downc[N],downx[N],tong[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
if(a[1]!=1&&a[1]!=0)
{
puts("-1");
return 0;
}
upc[1]=1;upx[1]=1;
downc[1]=1;downx[1]=1;
for(int i=2;i<=n;i++)
{
upc[i]=upc[i-1];upx[i]=upx[i-1];
downc[i]=downc[i-1];downx[i]=downx[i-1];
if(++upc[i]>2)
upc[i]=1,upx[i]++;
if(++downc[i]>5)
downc[i]=1,downx[i]++;
if(a[i])
{
if(upx[i]>a[i])
{
upx[i]=a[i];
upc[i]=2;
}
else if(upx[i]==a[i])
{
upc[i]=min(upc[i],2);
}
if(downx[i]<a[i])
{
downx[i]=a[i];
downc[i]=1;
}
if(upx[i]<a[i]||downx[i]>a[i])
{
puts("-1");
return 0;
}
}
}
if(upc[n]==1)
{
upx[n]=upx[n-1];
}
if(upx[n]<downx[n])
{
puts("-1");
return 0;
}
printf("%d\n",upx[n]);
tong[upx[n]]++;
a[n]=upx[n];
for(int i=n-1;i>=1;i--)
{
if(!a[i])
{
int tmp=min(a[i+1],upx[i]);
if(tong[tmp]==5)
tmp--;
a[i]=tmp;
}
tong[a[i]]++;
}
for(int i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
T1&T2都几乎正解思路但是打成不如暴力分QWQ
20210712考试-2021noip11的更多相关文章
- 全网独家MongoDB Certified DBA Associate考试认证视频
该视频意在让所有学员一次通过考试,避免重复考试而承担的巨额考试费用! 目前MongDB发展迅猛,有赶超mysql,和oracle看齐的苗头.在这个时候MongoDB也适时的推出了官方的认证考试&quo ...
- 记lrd的高二上学期第五次调研考试
河北某某中学的调研考试其实是很好玩的经历呢.可惜没有太多机会了. 背景: NOIP2016回来之后没有好好学文化课-.自习能翘就翘了,衡中特产学案自助没有好好写(说来我好像从来没被老师查到过,上课写学 ...
- 1009: [HNOI2008]GT考试
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...
- mysql练习题-查询同时参加计算机和英语考试的学生的信息-遁地龙卷风
(-1)写在前面 文章参考http://blog.sina.com.cn/willcaty. 针对其中的一道练习题想出两种其他的答案,希望网友给出更多回答. (0) 基础数据 student表 +-- ...
- js封装用户选项传递给Servlet之考试系统二
<%@ page language="java" import="java.util.*" contentType="text/html; ch ...
- js动态生成选项之考试系统(一)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- 分享一个LiteDB做的简单考试系统辅助工具
凌晨,被安排在公司值班,因为台风“灿鸿”即将登陆,风力太大,办公楼,车间等重要部分需要关注.所以无聊,那就分享一下,今天给朋友临时做的一个小的考试系统辅助工具吧.其实非常小,需求也很简单,但是可以根据 ...
- CCF考试
第八次CCF考试记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四题的代码 第 ...
- PAT 1041. 考试座位号(15)
每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...
随机推荐
- 图解 HTTP 连接管理
熟悉我的小伙伴都知道,我之前肝了本<HTTP 核心总结>的 PDF,这本 PDF 是取自我 HTTP 系列文章的汇总,然而我写的 HTTP 相关内容都是一年前了,我回头看了一下这本 PDF ...
- 洛谷P2504题解
题目 瓶颈生成树的裸题.可以查看这个来获取更多信息. 他问的是能够在所有树上自由穿梭的猴子个数,那我只需要算出这张图上最小生成树中权值最大的边,和每个猴子的最大跳跃长度进行比较即可. 因为我用的是 \ ...
- Vue3学习第一例:Vue3架构入门
入门 Vue3的教程很少,官方网站实例不好整,另外由于Python的Django也掌握了,学习这个有些让人眼乱.Vue项目创建后,在public目录下面自动生成了一个index.htm,里面有个div ...
- Jetpack Compose学习(1)——从登录页开始入门
原文地址:Jetpack Compose学习(1)--从登录页开始入门 | Stars-One的杂货小窝 Jetpack Compose UI在前几天出了1.0正式版,之前一直还在观望,终于是出了正式 ...
- 还有更惨的吗?字节面经,美团,网易,招银,360全部在HR前一面挂了
最近一朋友向我吐槽去年的秋招,字节面经,美团,网易,招银,360全部在HR前一面挂了,实在是有点惨.我把他语无伦次的话做了一个整理: 最近真的很暴躁,控制不住自己陷入情绪低落胡思乱想,每天都是在希望失 ...
- gRPC学习之二:GO的gRPC开发环境准备
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos gRPC学习系列文章链接 在CentOS7部署和设置G ...
- Spring boot无法显示jsp页面问题汇总
问题1: o.s.w.s.r.ResourceHttpRequestHandler:Path with "WEB-INF" or "META-INF": [WE ...
- 『Java』接口的使用方法
以下三个文件存在于同一个包下: 定义接口Dome_Interface.java: package cn.xxmmqg.Interface; // 接口不能直接使用,必须有一个"实现类&quo ...
- Nginx中location匹配及rewrite重写
目录 一.常用的Nginx正则表达式 二.location 2.1.location三类匹配类型 2.2.常用的匹配规则 2.3.location优先级 2.3.1.举例说明 2.4.实际网站使用中, ...
- STM32—位带操作
STM32中的位带操作: 名字为位带操作,实际上是对位的操作,位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见. 51 单片机中通过关键字 sbit 来实现位定义, STM32 ...