0+0+0=0。还是太菜,看不出题型。

Masodik

你要从 (0,0) 点走到 (n,m),每次只能往 x 轴或者 y 轴正方向移动一个单位距离。从 (i,j) 移动到 (i,j+1) 的代价为 ri,从 (i,j) 移动到 (i+1,j) 的代价为 cj

求最小代价。

对于 100%的数据,n,m ≤ 105

题解

凸包的运用……我看不出来还算正常。

考虑从 \((x_1,y_1)\) 走到 \((x_2,y_2)\),只能先走行再走列或者先走列再走行。

  1. 先走行再走列,代价为

    \[r_{x_1}(y_2-y_1)+c_{y_2}(x_2-x_1)
    \]

  2. 先走列再走行,代价为

    \[c_{y_1}(x_2-x_1)+r_{x_2}(y_2-y_1)
    \]

对这两种走法进行套路化比较

\[r_{x_1}(y_2-y_1)+c_{y_2}(x_2-x_1)<c_{y_1}(x_2-x_1)+r_{x_2}(y_2-y_1)\\
\Rightarrow~\frac{r_{x_2}-r_{x_1}}{x_2-x_1}>\frac{c_{y_2}-c_{y_1}}{y_2-y_1}
\]

所以对行列分别维护凸包,双指针扫描,每次走斜率大的。

时间复杂度 \(O(n+m)\)。

#include<bits/stdc++.h>
using namespace std;
template<class T> T read(){
T x=0,w=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-') w=-w;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*w;
}
template<class T> T read(T&x){
return x=read<T>();
}
#define co const
#define il inline
typedef long long LL; co int N=100000+10;
int r[N],c[N];
int sr[N],tr,sc[N],tc; void convex(int a[],int st[],int&top,int n){
for(int i=0;i<=n;++i){
while(top>=2&& (LL)(a[i]-a[st[top]])*(st[top]-st[top-1])<=(LL)(a[st[top]]-a[st[top-1]])*(i-st[top]) ) --top;
st[++top]=i;
}
}
int main(){
freopen("masodik.in","r",stdin),freopen("masodik.out","w",stdout);
int n=read<int>(),m=read<int>();
for(int i=0;i<=n;++i) read(r[i]);
for(int i=0;i<=m;++i) read(c[i]);
convex(r,sr,tr,n),convex(c,sc,tc,m);
LL ans=0;
int i=1,j=1;
while(i<tr&&j<tc){
if( (LL)(r[sr[i+1]]-r[sr[i]])*(sc[j+1]-sc[j])>=(LL)(c[sc[j+1]]-c[sc[j]])*(sr[i+1]-sr[i]) )
ans+=(LL)r[sr[i]]*(sc[j+1]-sc[j]),++j;
else ans+=(LL)c[sc[j]]*(sr[i+1]-sr[i]),++i;
}
if(i==tr) ans+=(LL)r[n]*(m-sc[j]);
else ans+=(LL)c[m]*(n-sr[i]);
printf("%lld\n",ans);
return 0;
}

Query on a sequence

给定一个长度为 n 的数列 P,满足 |Pi| ≤ 109

求有多少对 (a,b,c,d),满足下列约束:

  1. 1 ≤ a ≤ b < c ≤ d ≤ n
  2. b-a=d-c
  3. c-b-1 等于恰好等于给定的 F,且 F>0
  4. Pa+i=Pc+i 对于所有 i(0≤i≤b-a) 均成立

只要 (a,b,c,d) 中有任意一个参数不同,我们就认为是不同的。

n ≤ 105

CH#15 秘密武器

被题目名字骗了,我竟然没有看出来这是字符串匹配……我该更新自己对字符集的认识。

枚举两段的长度 len 和第一段的起点 i,我们定义 L 为第一段与第二段的最长公共后缀,当 L>=len 的时候答案+1,而起点为 i+1 时 L 的大小仅仅取决于起点为 i 时 L 大小和 a[i+len] 与 a[i+2*len+F] 的相等关系:

  • L[i+1] = L[i] + 1 (a[i+len]=a[i+2*len+F])
  • L[i+1] = 0 (a[i+len]!=a[i+2*len+F])

这样相当于把原串右移 len+F 后得到的新串与原串的匹配

朴素地枚举 len 后扫描整个序列是 N2 的,我们考虑优化这个算法。

首先枚举两段的长度 len,然后我们在递推的时候可以发现,在长度为 len 时,我们没有必要一格一格的递推,而可以每次向右递推 len 格。这是因为我们把原串按照 len 分段,出现下面这种红色匹配是无意义的

我们不妨设第一段的末尾位置为 i,第二段的末尾位置为 j,设 frontL 表示 a[i+1]„a[i+len] 与 a[j+1]„a[j+len] 的最长公共前缀,设 backL 表示 a[i+1]„a[i+len] 与 a[j+1]„a[j+len] 的最长公共后缀,令 L 表示当前的最长公共后缀。

下面分两种情况考虑对于答案的贡献:

  1. 如果 L>=len-1,ans+=frontL。
  2. 反之,ans+=max{0,L+frontL-(len-1)}。

下面分两种情况考虑递推后的最长公共后缀 nL:

  1. 如果 a[i+1]„a[i+len]与 a[j+1]„a[j+len]整段相同,nL=L+len。
  2. 反之,nL=backL。

这样对于每个长度 len,需要递推 N/len 次,每次采用 hash+二分的方法 O(logN) 的计算最长公共前/后缀,总的复杂度为 O(N lnN logN)。

#include<bits/stdc++.h>
#include<tr1/unordered_map>
using namespace std;
template<class T> T read(){
T x=0,w=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-') w=-w;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*w;
}
template<class T> T read(T&x){
return x=read<T>();
}
#define co const
#define il inline
typedef unsigned long long ULL; co int N=100000+10;
co ULL B=131;
int n,a[N];
ULL hash[N],pb[N]; il ULL calc(int l,int r){ // hash[l,r]
return hash[r]-hash[l-1]*pb[r-l+1];
}
int lcp(int x,int y){ // longest common prefix
int l=0,r=min(n-x+1,n-y+1);
while(l<r){
int mid=(l+r+1)>>1;
if(calc(x,x+mid-1)==calc(y,y+mid-1)) l=mid;
else r=mid-1;
}
return l;
}
int lcs(int x,int y){ // longest common suffix
int l=0,r=min(x,y);
while(l<r){
int mid=(l+r+1)>>1;
if(calc(x-mid+1,x)==calc(y-mid+1,y)) l=mid;
else r=mid-1;
}
return l;
} int main(){
freopen("count.in","r",stdin),freopen("count.out","w",stdout);
read(n);int F=read<int>();
pb[0]=1;
for(int i=1;i<=n;++i) pb[i]=pb[i-1]*B;
tr1::unordered_map<int,int> val;
int idx=0;
for(int i=1;i<=n;++i){
if(!val.count(read(a[i]))) val[a[i]]=++idx;
a[i]=val[a[i]],hash[i]=hash[i-1]*B+a[i];
}
ULL ans=0;
for(int len=1;2*len+F<=n;++len){
int L=0;
for(int i=1;;){
int lim=min(len,n-(i+len+F-1));
if(!lim) break;
int frontL=lcp(i,i+len+F),backL=lcs(i+lim-1,i+len+F+lim-1);
frontL=min(frontL,lim),backL=min(backL,lim);
if(L>=len-1) ans+=frontL;
else ans+=max(0,L+frontL-(len-1));
if(frontL==lim) L+=lim;
else L=backL;
i+=lim;
}
}
printf("%llu\n",ans);
return 0;
}

Number Theory

对于给定的 \(x,m,p\)(\(p\) 是质数),求一个可行的正整数 \(n\),满足

\[n^{2n}+n^{m} \equiv x \mod p
\]

由于解不唯一,所以这题设有 Special Judge,支持检验高精度的 \(n\)。

\(p \leq 10^9+7\),可以认为这些质数都很大且随机生成。

题解

原根的运用……我一 NOIP 考生不会往这边想啊。

这是不是一种新的做二次剩余的方法?

#include<bits/stdc++.h>
#include<tr1/unordered_map>
using namespace std;
template<class T> T read(){
T x=0,w=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-') w=-w;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*w;
}
template<class T> T read(T&x){
return x=read<T>();
}
#define co const
#define il inline
#define int long long #define gcd __gcd
void exgcd(int a,int b,int&x,int&y){
if(!b) x=1,y=0;
else exgcd(b,a%b,y,x),y-=a/b*x;
}
il int inv(int a,int mod){
int x,y;
exgcd(a,mod,x,y);
return x<0?x+mod:x;
}
il int mul(int a,int b,int mod){
int ans=0;
for(;b;b>>=1,a=(a+a)%mod)
if(b&1) ans=(ans+a)%mod;
return ans;
}
il int pow(int a,int b,int mod){
int ans=1;
for(;b;b>>=1,a=a*a%mod)
if(b&1) ans=ans*a%mod;
return ans;
}
int bsgs(int a,int b,int mod){
tr1::unordered_map<int,int> H;
int blo=ceil(sqrt(mod));
for(int i=1;i<=blo;++i) H[pow(a,i,mod)*b%mod]=i;
a=pow(a,blo,mod);
for(int i=1,c=a;i<=(mod+blo-1)/blo;++i,c=c*a%mod)
if(H[c]) return i*blo-H[c];
return -1;
}
signed main(){
freopen("theory.in","r",stdin),freopen("theory.out","w",stdout);
int sum=read<int>(),m=read<int>(),p=read<int>();
for(int g=2;;++g){ // enumerate the primitive root
int k=bsgs(g,(sum+p-pow(g,m,p))%p,p); // g^k=sum-g^m (mod p)
if(k==-1||k&1) continue;
int M=p*(p-1);
printf("%lld\n",mul(g*(p-1),inv(p-1,p),M)+k/2*p%M); // p^{-1}=1 (mod p-1)
break;
}
return 0;
}

test20190901 NOI2019 模拟赛的更多相关文章

  1. noi2019模拟测试赛(四十七)

    noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...

  2. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  3. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  4. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

  5. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  6. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  7. 小奇模拟赛9.13 by hzwer

    2015年9月13日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...

  8. PKUSC 模拟赛 day1 下午总结

    下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...

  9. [GRYZ]寒假模拟赛

    写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...

随机推荐

  1. C#中各种Lock的速度比较

    简单写了个小程序,比较了一下C#中各种Lock的速度(前提是都没有进入wait状态). 各进入离开Lock 1kw次,结果如下: Lock Time (ms) No lock 58 CriticalS ...

  2. Git 克隆

    工作中大家分工协作,共同开发维护一个项目,git仓库放在公共的服务器上,如github.Gitee等. 在这种情况使用git,需要先克隆仓库到本地. 克隆非常简单,使用命令git clone 将远程仓 ...

  3. 在ensp上配置RIPv2的认证

    原理 实验模拟 实验拓扑 测试连通性 搭建rip网络 查看路由表 R3模拟攻击首先把在自己的的ip通告网段 配置完成后查看一下路由表 可以看到已经非法获取R1R2的网段信息,那么现在我们R3可以向两个 ...

  4. jdbc(mysql)数据库连接

    0.将驱动引入项目 在项目根目录新建文件夹lib,把数据库驱动mysql-connector-java-5.1.7-bin.jar放入该文件夹. 右键点击项目名称->properties-> ...

  5. kafka的分区

    分区会均匀的分配到不同的broke上,即不同的机器上.

  6. LOJ2401 JOISC2017 Dragon2 计算几何、线段树

    传送门 先考虑每一个攻击方的龙和被攻击方的龙可以与多少个被攻击方/攻击方的龙匹配. 对于攻击方的龙\(A\)和被攻击方的龙\(B\),在道路为线段\((C,D)\)的情况下,能够与下图位置的所有对应属 ...

  7. MOOC 数据库笔记(四):关系代数

    关系代数 关系代数概述 特点 基于集合,提供了一系列的关系代数操作:并.差.笛卡尔积(广义积).选择.投影和更名等基本操作 以及交.连接和关系除等扩展操作,是一种集合思维的操作语言. 关系代数操作以一 ...

  8. pandas-02 Series()和DataFrame()的区别与联系

    pandas-02 Series()和DataFrame()的区别与联系 区别: series,只是一个一维数据结构,它由index和value组成. dataframe,是一个二维结构,除了拥有in ...

  9. 【开发工具】- 推荐一款好用的文本编辑器[Sublime Text]

    作为一个程序员除了IDE外,文本编辑器也是必不可少的一个开发工具.之前一直在用的是NotePad++.EditPlus,这两款编辑器,但是总感觉差点什么,昨天在知乎上看到有人推荐Sublime Tex ...

  10. webpack集成vue单文件模式的很多坑(研究了1个星期)

    1.一开始不知道局部安装webpack后,如何调用webpack. 后来看说明文档(webpack中文网)才知道,有个npx可以启动本地安装的webpack. 我估计:全局安装webpack,全局的w ...