T1

Description

给定一个长度为$n$的正整数序列$a$。可以将序列分成若干段,定义第$i$段的权值$x_i$为这一段中所有数的最大值,特殊地,$x_0=0$。求$\sum_{i=1}^{m}|x_i-x_{i-1}|$的最小值以及划分方案数,$\sum_{i=1}^{m}(x_i-x_{i-1})^2$ 的最小值以及划分方案数,其中$m$为划分的段数。

Input

第一行一个整数$n$。第二行$n$个正整数$a_1-a_n$。

Output

按顺序输出四个非负整数表示答案,其中两个方案数均对$10^9+7$取模。

Sample Input

4
10 30 20 30

Sample Output

30

6

500

3

HINT

$n\;\leq\;10^5,1\;\leq\;a_i\;\leq\;10^9$.

Solution

从后往前单调栈维护一个不上升序列,记为序列$s$。

记$s$的长度为$l$,$s[l+1]=0$。将$s$在$a$的位置记为$d$。

显然,对于一个序列$a$,$\sum_{i=1}^{m}|x_i-x_{i-1}|$的最小值为序列中最大的数。

在$s_i$与$s_{i+1}$之间,定一个断点有$(d_i-d_{i+1})$种方案,不定断点,有$1$种方案。

所以总方案数为$\prod_{i=1}^{m-1}(d_{i}-d_{i+1}+1)$。

易证$\sum_{i=1}^{m}(x_{i}-x_{i-1})^2$的最小值为$\sum_{i=1}^{l}(s_{i}-s_{i+1})^2$。

显然,s中的每一种值至少需要出现一次,所以对于每种值的情况进行考虑。

在$[d_{i-1},d_i)$这段区间内定一个断点,有$(d_i-d_{i-1})$种方案,不定断点,有$1$种方案。

由于每个值都必须出现一次,所以不能出现都不定断点的情况。

记所有不同的值为$b$,则总方案数为$\prod_{i=1}^{|b|}(\prod_{s[j]=b[i]}(d_{j-1}-d_{j}+1)-1)$

#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 1000005
#define M 1000000007ll
using namespace std;
typedef long long ll;
ll ans,tot=1,sum;
int a[N],s[N],x[N],t,n;
inline int read(){
int ret=0;char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c)){
ret=ret*10+c-'0';
c=getchar();
}
return ret;
}
inline ll sqr(ll k){
return k*k;
}
inline void init(){
n=read();
for(int i=1;i<=n;++i)
a[i]=read();
for(int i=n;i;--i){
while(t&&a[i]>s[t]) --t;
s[++t]=a[i];x[t]=i;
}
s[t+1]=0;
for(int i=1;i<t;++i)
tot=tot*(ll)(x[i]-x[i+1]+1)%M;
printf("%d\n%lld\n",s[1],tot);
for(int i=1;i<=t;++i)
ans+=sqr((ll)(s[i]-s[i+1]));
tot=1;
for(int i=t,j;i;i=j){
sum=1;
for(j=i-1;j&&s[j]==s[i];--j);
for(int k=i;k>j&&k>1;--k)
sum=sum*(x[k-1]-x[k]+1)%M;
if(j) --sum;
tot=tot*(sum)%M;
}
printf("%lld\n%lld\n",ans,tot);
}
int main(){
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
init();
fclose(stdin);
fclose(stdout);
return 0;
}

T2

Description

给定一个质数$p$,构造出一个模$p$意义下的$n$次同余方程,使得该方程在$[0,p)$中的解尽可能少。

Input

一行两个整数$n,p$。

Output

依次输出$x^n,x^{n-1},…,x^0$前的系数。

Sample Input

1 97

Sample Output

1 0

HINT

$n\;\leq\;100,n<p<10^5,p$为质数。

Solution

高次同余方程的概念:$f(x)=0(mod\;m)$($f(x)$为次数大于$1$的整式)

显然$n=1$时,显然所有方程都有$1$个解,任意构造方程即可;

$n>1$时,设$f(x)=x^n+(p-1)x$。则$f(0)=f(1)$,所以一定存在一个数$y$使得$f(x)\not=y$。

答案即为$x^n+(p-1)x+(p-t)$即可。

#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100005
using namespace std;
typedef long long ll;
ll n,p;
bool b[N];
inline ll read(){
ll ret=0;char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c)){
ret=ret*10+c-'0';
c=getchar();
}
return ret;
}
inline void init(){
scanf("%lld%lld",&n,&p);
if(n==1){
printf("1 0\n");return;
}
for(ll i=2,k;i<p;++i){
k=i;
for(ll j=1;j<n;++j)
k=k*i%p;
k=(k+(p-1)*i)%p;
b[k]=true;
}
printf("1 ");
for(ll i=2;i<n;++i)
printf("0 ");
printf("%lld ",p-1);
for(ll i=1;i<p;++i)
if(!b[i]){
printf("%lld\n",p-i);break;
}
}
int main(){
freopen("equation.in","r",stdin);
freopen("equation.out","w",stdout);
init();
fclose(stdin);
fclose(stdout);
return 0;
}

T3

Description

给定一个序列$A$,选择$i,j$,记糟糕指数为$A_i|A_{i+1}|A_{i+2}|…|A_j$,其中|为二进制或运算。

求有多少组$(i,j)$使得糟糕指数小于$M$。

Input

第一行两个正整数$N,M$。

第二行为$N$个正整数$A_1,A_2,…,A_n$。

Output

一行一个整数表示选择方案数。

Sample Input

4 6

1 3 5 1

Sample Output

2

HINT

$1\;\leq\;N\;\leq\;10^5,0\;\leq\;M\;\leq\;2^{30},1\;\leq\;A_i\;\leq\;2^{30}$

Solution

除非有人和我一样因为迷之断句看不懂题目,不然肯定会觉得是一道水题。

把每个数转成二进制,尺取法即可。

#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define M 32
#define N 1000005
using namespace std;
typedef long long ll;
ll ans;
int s[N][M],n,m,t;
inline bool chk(int l,int r){
int ret=0;
for(int i=1,k=1;i<M;++i,k<<=1)
if(s[r][i]-s[l][i]) ret+=k;
return ret<=m;
}
inline void init(){
scanf("%d%d",&n,&m);
for(int i=1,k;i<=n;++i){
scanf("%d",&k);
for(int j=1;j<M;++j,k>>=1){
s[i][j]=s[i-1][j];
if(k&1) ++s[i][j];
}
}
for(int i=1;i<=n;++i){
t=max(t,i);
while(t<n&&chk(i-1,t+1)) ++t;
ans+=(ll)(t-i);
}
printf("%lld\n",ans);
}
int main(){
freopen("evolve.in","r",stdin);
freopen("evolve.out","w",stdout);
init();
fclose(stdin);
fclose(stdout);
return 0;
}

[日常训练]常州集训day8的更多相关文章

  1. [日常训练]常州集训day7

    T1 Description 给定一个序列,初始为空.依次将$1-n$插入序列,其中$i$插到当前第$a_i$个数的右边($a_i=0$表示插到序列最左边).求最终序列. Input 第一行一个整数$ ...

  2. [日常训练]常州集训day5

    T1 Description 小$W$和小$M$一起玩拼图游戏啦~ 小$M$给小$M$一张$N$个点的图,有$M$条可选无向边,每条边有一个甜蜜值,小$W$要选$K$条边,使得任意两点间最多有一条路径 ...

  3. [日常训练]常州集训day3

    T1 Description 有$K$个石子,石子只能放在$N$条水平线与$M$条竖直线构成的网格的交点上. 求用$K$个石子最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子. ...

  4. [日常训练]常州集训day2

    T1 Description 给定$N$个点,问这$N$个点能构成的三角形个数. Input 第一行一个整数$N$,代表点数. 接下来$N$行,每行两个非负整数$X,Y$,表示一个点的坐标. Outp ...

  5. 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)

    题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...

  6. [日常] NOIP前集训日记

    写点流水账放松身心... 10.8 前一天考完NHEEE的一调考试终于可以开始集训了Orz (然后上来考试就迟到5min, GG) T1维护队列瞎贪心, 过了大样例交上去一点也不稳...T出翔只拿了5 ...

  7. 「日常训练」 Fire!(UVA-11624)

    与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...

  8. 「日常训练」COMMON 约数研究(HYSBZ-1968)

    题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...

  9. 「日常训练」 Mike and Fun (CFR305D2B)

    题意(CodeForces 548B) 每次对01矩阵中的一位取反,问每次操作后,单列中最长连续1的长度. 分析 非常非常简单,但是我当时训练的时候WA了四次...无力吐槽了,人间 不值得.jpg 代 ...

随机推荐

  1. Html代码保存为Pdf文件

    前段时间Insus.NET有实现了<上传Text文档并转换为PDF>http://www.cnblogs.com/insus/p/4313092.html 和<截取视图某一段另存为部 ...

  2. eap

    本文介绍了eap  

  3. 实时监控log文件

    一个进程在运行,并在不断的写log,你需要实时监控log文件的更新(一般是debug时用),怎么办,不断的打开,关闭文件吗? 不用,至少有两个方法,来自两个很常用的命令: tail -f log.tx ...

  4. HomeKit 与老旧设备

    苹果推了HomeKit,已经有很多厂商在做,可以达到Siri控制所有设备的功能. 但是Siri也不是万能的,对人类的语义理解也会产生差错,不过我相信未来这个问题会解决掉.     如果家里有老旧的电视 ...

  5. WPF 3D模型 3D场景

    1.首先得说明的是这并不是真正的3D,模型被导出为一系列的单个图片,例如一个3D户型图,以某个视角旋转360°,渲染出一系列连续的单个图片文件. 2.在Image.MouseMove事件中添加相应代码 ...

  6. Enum引发的血案,反思

    前几天公司产品更新版本,更新完后不少用户反应原先保存的report的一些表在新版本打开后设置突然变了,本来选的第六个,现在打开变成第四个了.领导要求赶紧查出原因修改好,发紧急补丁.啊啊..发紧急补丁可 ...

  7. poj 1698 Alice‘s Chance

    poj 1698  Alice's Chance 题目地址: http://poj.org/problem?id=1698 题意: 演员Alice ,面对n场电影,每场电影拍摄持续w周,每周特定几天拍 ...

  8. webpack入坑之旅(二)loader入门

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack 在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

  9. android 按钮点击效果实现 在studio下出现的错误

    在照做上一篇随笔的时候 在studio下为了方便我在写完一个 btn_select.xml 文件后直接粘贴了三个文件到drawable下 结果问题来了 总是报这样一个错误: Resource is n ...

  10. __getattribute__

    class Foo: def __init__(self,x): self.x = x def __getattribute__(self, item): print('不管是否纯在,我都会执行') ...