NOIP模拟测试「简单的区间·简单的玄学·简单的填数·简单的序列」

简单的区间

$update$

终于$AC$了

找到$(sum[r]+sum[l](sum表示以中间点为基准的sum)-mx)\%k==0$的点

注意这里$sum$表示是以$mid$为基准点,(即$sum[l]$为后缀和,$sum[r]$为前缀和)

回忆$(sum[r]-sum[l])\%k==0$这个经典问题做法(入阵曲简化版),开桶,桶里维护$sum[l]\%k$,那么$r$贡献就是桶里$sum[r]\%k$个数

于是这个题开桶维护$sum$,问题转化为求$max$即可

记录$max$位置是否$>mid$,区别对待

设$f[i][0]$表示$max$在$mid$右面,$f[i][1]$表示$max$在$mid$左面

$f[i][0]$存下右面$sum[r]-mx$,找桶里是否存在左面$sum[l]$
$f[i][1]$存下右面$sum[r]$ 找到左面是否存在$mx-sum[l]$
完了

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define A 1010101
ll f[A][2],a[A],pos[A],mx[A],sum[A];
ll cnt,n,k,ans;
void solve(ll l,ll r){if(l==r) return ;ll mid=(l+r)>>1;cnt=sum[mid]=mx[0]=0;for(ll i=mid+1;i<=r;i++){if(a[i]>a[mx[cnt]]) mx[++cnt]=i;sum[i]=(sum[i-1]+a[i])%k;f[(sum[i]-a[mx[cnt]]%k+k)%k][0]++;pos[i]=mx[cnt];
//        printf("f[%lld]=%lld  sum=%lld cnt=%lld\n",(sum[i]-a[mx[cnt]]%k+k)%k,f[(sum[i]-a[mx[cnt]]%k+k)%k][0],sum[i],cnt);
    }mx[cnt+1]=r+1;ll suml=0,rnow=mid+1,mxl=0,p=1;for(ll i=mid;i>=l;i--){suml=(suml+a[i])%k;mxl=max(mxl,a[i]);while(p<=cnt&&a[mx[p]]<=mxl) p++;while(rnow<mx[p]) {f[(sum[rnow]-a[pos[rnow]]%k+k)%k][0]--;f[sum[rnow]%k][1]++;rnow++;}
//        printf("ans=%lld f[%lld][1]=%lld p=%lld rnow=%lld mx[%lld]=%lldsum[%lld]=%lld\n",ans,(k+mxl%k-suml)%k,f[(k+mxl%k-suml)%k][1],p,rnow,p,mx[p],rnow,sum[rnow]);ans+=f[(mxl-suml+k)%k][1];if(p<=cnt) ans+=f[(k-suml)%k][0];
//        printf("ans=%lld f[%lld][0]=%lld\n",ans,k-suml,f[(k-suml)%k][0]);
    }for(ll i=mid+1;i<rnow;i++)f[sum[i]][1]--;for(ll i=rnow;i<=r;i++)f[(sum[i]-a[pos[i]]%k+k)%k][0]--;solve(l,mid);solve(mid+1,r);
}
int main(){scanf("%lld%lld",&n,&k);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);solve(1,n);printf("%lld",ans);
}
View Code

 

简单的玄学

题解

题目中说至少两个相同那么答案就所有方案-全不相同

所有方案${(2^n)}^m=2^{n*m}$,

互不相同,首先第一个随便选剩下避开已经选过就行$2^n*2^{n-1}......2^{n-m+1}$

那么题目很傻逼的让你取模并且约分,你需要先约分再取模(取模再约分的话这个题就太水了,所以是先约分再取模)

思考怎么约分

下面全是$2$多少次方,于是我们看上面多少个二就行了

$2^n*(2^{n}-1)......({2^n}-m+1)$很恶心,思考转化

性质:$2^n-x$中二个数$=$$x$中二的个数

证明:假设$x$可以表示为$j*(2^w)$(j可以是分数),乘法分配率$2^w*(2^{n-w}-j)$后面这个里面没有别的$2$因子了,原式$=$$2^w$,又$j$中没有$2$因子故相乘因子数不变,得证

那么原式就变成求$(m-1)!$里$2$因子数

可以简单求

    for(ll i=1;(1ll<<i)<=m-1;i++){(ercnt+=(m-1)/(1ll<<i));}

例如$1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$这个序列

分别有$(2^1)*2$,$(2^2)*1$,$(2^3)*1$那么就是$8/8+8/4+8/2$

可以看作$/2$时给所有有$2$因子填上一个二(即$2$,$4$,$6$,$8$中填一个2),此时$4$还剩$1$个没填$8$还剩$2$个没填

$/4$给$4$,$8$里填此时$8$还剩$1$个没填

最后$/8$,全部填满

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e6+3;
const ll phi=1e6+2;
ll x,y,n,m;
ll meng(ll x,ll k){ll ans=1;for(;k;k>>=1,x=x*x%mod)if(k&1)ans=ans*x%mod;return ans;
}
ll gcd(ll x,ll y){if(y==0) return x;return gcd(y,x%y);
}
int main(){
//    freopen("sd.txt","w",stdout);scanf("%lld%lld",&n,&m);
/*    if(log(m)>n){printf("1 1\n");return 0;}
*/    ll maxn=meng(2,n%phi);y=meng(maxn,m%phi);x=1;ll ercnt=n;    for(ll i=0;i<m;i++){
//        printf("maxn-i=%lld i=%lld m=%lld x=%lld\n",maxn-i,i,m,x);x=x*(maxn-i)%mod;if(!x) break;}//2逆元500002for(ll i=1;(1ll<<i)<=m-1;i++){(ercnt+=(m-1)/(1ll<<i));printf("ercnt=%lld 1<<=%lld\n",ercnt-n,1ll<<i);}y=y*meng(500002,ercnt)%mod;x=x*meng(500002,ercnt)%mod;printf("%lld %lld\n",(y-x+mod)%mod,y);
}
View Code

简单的填数

题解

一个$up$代表填的上界,$down$代表填的下界

先不考虑已经填了的

$up$两位一进,$down$五位一进

考虑已经填的

先考虑上界

若$a[i]>up$比上界大肯定不合法

若$a[i]=up$取$min(2,up)$

若$a[i]<up$则将$up$调整到$a[i]$次数变为$2$

下界类似

若$a[i]<down$比下界小不合法

若$a[i]>down$将$down$调整到$a[i]$

统计答案时反着扫

序列为什么不是$up$呢

7
0 0 0 2 0 2 0 
正解
2
1 1 2 2 2 2 2 
用up:
2
1 1 2 2 3 2 2 

代码

/*
7
0 0 0 2 0 2 0 
hack
2
1 1 2 2 2 2 2 
up:
2
1 1 2 2 3 2 2 
10f
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 1010101
struct node {ll cnt,x;
}up[A],down[A];
ll n;
ll a[A],tong[A];
int main(){
//    freopen("da.in","r",stdin); freopen("ans.bf","w",stdout);scanf("%lld",&n);for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);}if(a[1]!=1&&a[1]!=0){printf("-1\n");return 0;}up[1].cnt=1,up[1].x=1;down[1].cnt=1,down[1].x=1;for(ll i=2;i<=n;i++){up[i]=up[i-1],down[i]=down[i-1];if(++up[i].cnt>2) up[i].cnt=1,up[i].x++;if(++down[i].cnt>5) down[i].cnt=1,down[i].x++;if(a[i]){if(up[i].x>a[i]){up[i].x=a[i];up[i].cnt=2;}else if(up[i].x==a[i]){up[i].cnt=min(up[i].cnt,2ll);}if(down[i].x<a[i])down[i].x=a[i],down[i].cnt=1;if(up[i].x<a[i]||down[i].x>a[i]){printf("-1\n");return 0;}}}if(up[n].cnt==1){up[n].x=up[n-1].x;}if(up[n].x<down[n].x){printf("-1\n");return 0;}printf("%lld\n",up[n].x);tong[up[n].x]=1;a[n]=up[n].x;for(ll i=n-1;i>=1;i--){if(!a[i]){ll t=min(a[i+1],up[i].x);if(tong[t]==5) t--;a[i]=t;}tong[a[i]]++;}for(ll i=1;i<=n;i++){printf("%lld ",a[i]);}
}
View Code

 

简单的序列

这是一个简单$dp$,但我觉得很棒在此写下题解

真的非常简单,

有一个长度$n$括号序列(只有$"()"$ ),给定其中长度为$m$一段,求满足括号匹配方案数

$n,m<=1e6$ $n-m<=4000$

题解

 

性质:我们发现一个合法匹配序列左扩号时刻比右括号多(显然),最后左扩号数量等于右括号数量

设$f[i][j]$表示长度为$i$序列,左扩号比右括号多$j$个方案数

那么类似的设$g[i][j]$为右括号比左扩号多$j$的方案数

(其实$f$和$g$值完全一样)

 

转移非常简单

当前括号可能是$($则贡献$f[i][j]=f[i-1][j-1]$为$)$则$f[i][j]=f[i-1][j+1]$

总贡献$f[i][j]=f[i-1][j-1]+f[i-1][j+1]$

类似的$g[i][j]=g[i-1][j-1]+g[i-1][j+1]$

那么思考统计答案

其实也非常简单

枚举第一段长度$i$,第一段左扩号比右括号多$j$,设给定序列左扩号比右括号多$j$

$ans=\sum\limits_{i=1}^{i<=n-m} \sum\limits_{j=0}^{j<=i} f[i][j]*g[(n-m)-i][j+tot]$

注意判是否合法

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 4040
const ll mod=1e9+7;
char c[2020202];
ll f[A][A];
ll tot,mint,n,m,ans;
int main(){
//    freopen("da.in","r",stdin); freopen("ans.bf","w",stdout);scanf("%lld%lld",&n,&m);scanf("%s",c+1);for(ll i=1;i<=m;i++){if(c[i]=='(')tot++;else tot--;if(i==1) mint=tot;else mint=min(mint,tot);}f[0][0]=1;for(ll i=1;i<=n-m;i++){for(ll j=0;j<=i;j++){if(j==0) f[i][j]=f[i-1][j+1];else f[i][j]=(f[i-1][j+1]+f[i-1][j-1])%mod;}}for(ll i=0;i<=n-m;i++){for(ll j=0;j<=i;j++){if(j+mint>=0&&j+tot<=n-m)ans=(ans+f[i][j]*f[(n-m)-i][j+tot]%mod)%mod;}}printf("%lld\n",ans);
}
View Code

我没数据,也没法提交,和$std$对拍了一下

下面是我的数据生成及对拍

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     system("g++ bf.cpp -o bf");
 5     system("g++ sol.cpp -o sol");
 6     system("g++ da.cpp -o da");
 7     int rp=0;
 8     while(++rp){
 9         cout<<rp<<" ";
10         system("./da");
11         system("./sol");
12         system("./bf");
13         if(system("diff -B -b ans.sol ans.bf")){
14             puts("WA");
15             while(1);
16         }
17         puts("AC");
18     }
19 }
对拍
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     freopen("da.in","w",stdout);
 5     srand(time(NULL));
 6     
 7     int m=rand()%10000+300;
 8     int c=rand()%m+1;
 9     while(m-c>2000){
10         c=rand()%m+1;
11     }
12     cout<<m<<" "<<c<<endl;
13     for(int i=1;i<=c;i++){
14         if(rand()%2){
15             printf("(");
16         }
17         else printf(")");
18     }
19     cout<<endl;
20 }
数据生成

 

 

转载于:https://www.cnblogs.com/znsbc-13/p/11474038.html

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

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

相关文章

苹果手机变卡了怎么解决_iOS 变卡怎么解决?一招搞定!无需刷机

iOSiOS 因为其优秀的底层交互逻辑&#xff0c;能让一部 iPhone 在不跨版本更新系统的前提下&#xff0c;至少保证 2 年内如新机般流畅。两年之后呢&#xff1f;你是否为手中的老将渐衰而苦恼过&#xff1f;本人对手机的流畅度十分敏感&#xff0c;可以说到了极致。付款时&#…

NOIP模拟测试38「金·斯诺·赤」

金 辗转相减见祖宗 高精 #include<bits/stdc.h> using namespace std; #define A 2000 #define P 1 #define N 10 #define ll long long ll n,T; char sjdfj[A]; struct bignum {ll n[A],l;bignum(){l1,memset(n,0,sizeof(n));}void clear(){while(l>1&&!n[l-…

什么是JSON处理(JSON-P API)?

Java EE中的JSON-P简介 JSON处理1.0&#xff08; JSR 353 &#xff09;的Java API是一个低级&#xff0c;轻量级的JSON解析器和生成器&#xff0c;它提供了在属性和值级别上操作JSON数据的能力。 JSR 353提供了两种JSON处理模型&#xff1a; 对象模型和流模型。 两种模型都可以…

电视机原理图_电工电气,如何看电气原理图和接线图,如何设计图纸?

电气图纸一般可分为两大类&#xff0c;一类为电力电气图&#xff0c;它主要是表述电能的传输、分配和转换&#xff0c;如电网电气图、电厂电气控制图等。另一类为电子电气图&#xff0c;它主要表述电子信息的传递、处理&#xff1b;如电视机电气原理图。本文主要谈电力电气图的…

NOIP模拟测试39,思维禁锢专场「工业题·玄学题·卡常题」

工业题 题解 抱歉,题解没时间写了 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define A 6666666 #define mod 998244353 ll jie[A],ni[A],acnt[A],bcnt[A]; ll fheng[A],fshu[A]; ll n,m,a,b; ll meng(ll x,ll k){ll ans1;for(;k;k>>…

ubuntu 如何登录远程服务器_VSCode远程登录云服务器、树莓派实现在线调试代码...

在PyCon2019大会上&#xff0c;微软发布了VSCode Remote&#xff0c;开启了远程开发的新时代&#xff01;Remote可以帮助开发者在容器、物理机器或虚拟机&#xff0c;以及WSL上实现无缝的远程开发。通过安装Remote Development Extension Pack&#xff0c;开发者可以快速上手远…

macosx jdk_MacOSX环境上的多个Java JDK

macosx jdk同样&#xff0c;这是在Mac&#xff08;OSX 10.8.x &#xff09;上配置Java开发环境的一个小技巧。 如果您现在真的开始&#xff0c;我建议您阅读我以前的文章之一 &#xff0c;这是一种快速干净的方法&#xff08;我想&#xff09;来设置环境变量并开始Java编码。 今…

屏幕方向读取与锁定:Screen Orientation API(转)

什么是 Screen Orientation API Screen Orientation API 为 Web 应用提供了读取设备当前屏幕方向、旋转角度、锁定旋转方向、获取方向改变事件的能力。使得特定应用在屏幕方向方面增强用户体验&#xff0c;如视频和游戏。该标准目前处于工作组草案状态&#xff0c;最近一个修改…

scenebuilder各控件属性介绍_Flutter 全栈式——基础控件

在Flutter中&#xff0c;UI小控件有两种设计风格&#xff0c;一种是Material设计&#xff0c;这是安卓的官方设计风格&#xff0c;另一种则是Cupertino风格&#xff0c;是iOS的官方设计风格。因此&#xff0c;当遇到带有这两个单词开头的控件时&#xff0c;我们应该明确他们表达…

正义联盟的Spring靴

正义联盟的黑暗时代已经来临&#xff0c;强大的Darkseid即将征服人类。 蝙蝠侠在《神力女超人》的帮助下&#xff0c;努力使联盟与一个关键方面失联。 适当的正义联盟成员管理系统。 由于时间不在他们身边&#xff0c;他们不想经历繁琐的过程&#xff0c;从头开始用他们需要的所…

Fetch

fetch是一种HTTP数据请求的方式&#xff0c;是XMLHttpRequest的一种替代方案。fetch不是ajax的进一步封装&#xff0c;而是原生js。Fetch函数就是原生js&#xff0c;没有使用XMLHttpRequest对象。 ajax 使用步骤1.创建XmlHttpRequest对象2.调用open方法设置基本请求信息3.设置发…

boost安装_Centos安装MySQL

安装MySQLMySQL 各版本介绍视频观看:https://www.bilibili.com/video/BV1ap4y1i75jMySQL 官网:https://www.mysql.com/cn/MySQL Community Server社区版本&#xff0c;开源免费&#xff0c;但不提供官方技术支持。MySQL Enterprise Edition 企业版本&#xff0c;需付费&#xf…

选择Java加密算法第3部分–公钥/私钥非对称加密

抽象 这是涵盖Java加密算法的三部分博客系列的第3部分。 本系列介绍如何实现以下目标&#xff1a; 使用SHA–512散列 使用AES–256的单密钥对称加密 RSA–4096 这第三篇文章详细介绍了如何实现非对称的RSA-4096公/私钥加密。 让我们开始吧。 免责声明 这篇文章仅供参考。 …

Error: Cannot find module '@babel/core'

官方默认babel-loader需要搭配最新版本babel 更新到最高版本: npm install -D babel-loader babel/core babel/preset-env webpack 转载于:https://www.cnblogs.com/nocry/p/11493363.html

javabeans_膨胀的JavaBeans –不要在您的API中添加“ Getters”

javabeans我已经最近在博客的想法的JavaBeans™如何可以扩展以减少在Java世界中&#xff0c;这被广泛接受的公约设立的膨胀。 该文章在DZone上重新发布&#xff0c;并在这里获得了颇具争议的反馈&#xff08;例如&#xff0c;大多数试图将一些新想法带入Java世界的想法&#xf…

uniapp 子组件 props拿不到数据_来吧!一文彻底搞定Vue组件!

点击蓝色 “达达前端小酒馆” 关注我哦!加个 “星标” &#xff0c;每天一篇文章&#xff0c;一起学编程作者 | Jeskson来源 | 达达前端小酒馆Vue组件的概述组件是什么呢&#xff0c;了解组件对象的分析&#xff0c;Vue组件中的data属性&#xff0c;props传递数据的原理到底是…

csp-s模拟测试41「夜莺与玫瑰·玫瑰花精·影子」

夜莺与玫瑰 题解 联赛$T1$莫比乌斯$\%\%\%$ $dead$ $line$是直线 首先横竖就是$nm$这比较显然 枚举方向向量 首先我们枚举方向向量时只枚举右下方向,显然贡献$*2$就是所有斜着的直线 $i,j$表示当自己向右$i$个单位长度,向下$j$单位长度 我们相同斜率下只算最短的线贡献,(因为其…

春天重试,因为冬天来了

好的&#xff0c;这实际上与冬天无关&#xff0c;众所周知&#xff0c;冬天已经到了 。 它是关于Spring Retry的&#xff0c;Spring是一个小的Spring框架库&#xff0c;它使我们可以将重试功能添加到应可重试的任何任务中。 这里有一个很好的教程 &#xff0c;解释了如何设置简…

python做些什么项目_Python 的练手项目有哪些值得推荐

1 Web方向的练手项目 这个其实是肯定不用多少的了。Python的练手项目就是可以做一个网站了。我们可以做一个属于自己的博客。在做博客的时候&#xff0c;我们可以巩固的知识点是 HtmlCSSJS的基础知识&#xff0c;以及熟练的运用Python的Web开发框架&#xff08;例如Django或者F…

删除某个时间段之前的文件

/* * 删除文件夹下$n分钟前创建的文件 * param $dir 要处理的目录&#xff0c;物理路径&#xff0c;结尾不加\ * param $n 过期时间&#xff0c;单位为分钟 * return void */function z_del_file_by_ctime($dir,$n){ if(is_dir($dir)){ if($dhopendir($dir)){ …