这篇总结比我写的好多了建议直接去看


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的更多相关文章

  1. 全网独家MongoDB Certified DBA Associate考试认证视频

    该视频意在让所有学员一次通过考试,避免重复考试而承担的巨额考试费用! 目前MongDB发展迅猛,有赶超mysql,和oracle看齐的苗头.在这个时候MongoDB也适时的推出了官方的认证考试&quo ...

  2. 记lrd的高二上学期第五次调研考试

    河北某某中学的调研考试其实是很好玩的经历呢.可惜没有太多机会了. 背景: NOIP2016回来之后没有好好学文化课-.自习能翘就翘了,衡中特产学案自助没有好好写(说来我好像从来没被老师查到过,上课写学 ...

  3. 1009: [HNOI2008]GT考试

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...

  4. mysql练习题-查询同时参加计算机和英语考试的学生的信息-遁地龙卷风

    (-1)写在前面 文章参考http://blog.sina.com.cn/willcaty. 针对其中的一道练习题想出两种其他的答案,希望网友给出更多回答. (0) 基础数据 student表 +-- ...

  5. js封装用户选项传递给Servlet之考试系统二

    <%@ page language="java" import="java.util.*" contentType="text/html; ch ...

  6. js动态生成选项之考试系统(一)

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  7. 分享一个LiteDB做的简单考试系统辅助工具

    凌晨,被安排在公司值班,因为台风“灿鸿”即将登陆,风力太大,办公楼,车间等重要部分需要关注.所以无聊,那就分享一下,今天给朋友临时做的一个小的考试系统辅助工具吧.其实非常小,需求也很简单,但是可以根据 ...

  8. CCF考试

    第八次CCF考试记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四题的代码 第 ...

  9. PAT 1041. 考试座位号(15)

    每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...

随机推荐

  1. couchdb(5984)未授权访问

    启动环境 测试 poc地址 https://github.com/vulhub/vulhub/blob/master/couchdb/CVE-2017-12636/exp.py map -p 5984 ...

  2. 🔥 LeetCode 热题 HOT 100(71-80)

    253. 会议室 II(NO) 279. 完全平方数 class Solution { public int numSquares(int n) { // dp[i] : 组成和为 i 的最少完全平方 ...

  3. Python小白的数学建模课-15.图论基本概念

    图论中所说的图,不是图形图像或地图,而是指由顶点和边所构成的图形结构. 图论不仅与拓扑学.计算机数据结构和算法密切相关,而且正在成为机器学习的关键技术. 本系列结合数学建模的应用需求,来介绍 Netw ...

  4. Mysql读写锁保姆级图文教程

    摘要:读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞. 本文分享自华为云社区<Mysql保姆级读写锁图文教程丨[绽放吧!数据库]>,作者:Code皮皮虾 . 准备 创建mylock表 ...

  5. js hook

    //cookie hook (function () { 'use strict'; var cookie_cache = document.cookie; Object.defineProperty ...

  6. LeetCode入门指南 之 链表

    83. 删除排序链表中的重复元素 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 .返回同样按升序排列的结果链表. class Soluti ...

  7. 造轮子系列之RPC 1:如何从零开始开发RPC框架

    前言 RPC 框架是后端攻城狮永远都绕不开的知识点,目前业界比较知名有 Dubbo.Spring Cloud 等.很多人都停留在了只会用的阶段,作为程序猿,拥有好奇心深入学习,才能有效提高自己的竞争力 ...

  8. Subversion Backup and Restore

    Backup Specified Revision Backup specified revision (here is 20): $ cd /opt/svnRepo $ svnadmin dump ...

  9. WPF自定义控件一:StackPanel 控件轮播

    实现效果 带定时器的轮播图 using引用 using System.Windows; using System.Windows.Controls; using System.Windows.Mark ...

  10. 终极蛇皮上帝视角之铁头娃之鲁迅之暑假闲的慌之bilibili看尚学堂网课的非洲酋长java小复习

    转自https://www.sxt.cn/Java_jQuery_in_action/eight-cache-problem.html 第一个点 自动装箱与拆箱的功能是所谓的"编译器蜜糖(C ...