传送门

Solution

A.

一共有\(T\)组数据

每次询问你\([l,r]\)中有多少个数能被他的所有数位整除(如果数位中含有\(0\)忽略掉)

数位dp,咕咕咕

B.

题面略

考虑一个个只有两个元素组成的小区间

可以发现若选择\([l,l+1]\),则必定要选择一个最大的区间包含\([a[l],a[l+1]]\)的区间

每个小区间看成一个点,向它所要求必须要选择的点连边,线段树优化建图

对图进行tarjan缩点,然后拓扑排序即可

全是区间询问,大概要有5棵线段树的样子

其实有简单得多的解法。

为了方便,考虑初始情况线段树的第i个叶子的val值是i

从左到右,如果当前数是\(x\),位置为\(j\),且\(x-1\)的位置小于当前位置(假设是\(k\)),那么\([1,k]\)区间加1,\(x+1\)同理

每对相邻数字只会被算一次

这样每次就能维护以左边每个点做左端点,当前点做为右端点,中间能有多少个点连续

找到最大的val值为\(j\)的左端点,就是以该点做右端点的答案了

C.

题面略

经过一波推导可得:\(a_i=x_{i+1}x_i-c_1(c_2-c_1)\)

所以分块+矩阵快速幂就完事了

没开ll会re,虽然到最后也不知道到底是哪里没开ll

Code 

/*
B 2019/3/18
*/
#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=1e5+5;
int N,Q,a[MN],b[MN],ls[MN*3],rs[MN*3],tt,root,minb[MN<<2],maxb[MN<<2];
struct edge{int to,nex;}e[MN<<4];int en,hr[MN*3];
inline void ins(int f,int t){e[++en]=(edge){t,hr[f]};hr[f]=en;}
inline void build(int &x,int l,int r)
{
if(l==r){x=l;return;}register int mid=(l+r)>>1;
x=++tt;build(ls[x],l,mid);build(rs[x],mid+1,r);
ins(x,ls[x]);ins(x,rs[x]);
}
inline void Build(int x,int l,int r)
{
if(l==r){minb[x]=maxb[x]=b[l];return;}int mid=(l+r)>>1;
Build(x<<1,l,mid);Build(x<<1|1,mid+1,r);
minb[x]=min(minb[x<<1],minb[x<<1|1]);
maxb[x]=max(maxb[x<<1],maxb[x<<1|1]);
}
inline int qmi(int x,int l,int r,int a,int b)
{
if(a==l&&b==r)return minb[x];int mid=(l+r)>>1;
if(b<=mid) return qmi(x<<1,l,mid,a,b);
else if(a>mid) return qmi(x<<1|1,mid+1,r,a,b);
return min(qmi(x<<1,l,mid,a,mid),qmi(x<<1|1,mid+1,r,mid+1,b));
}
inline int qma(int x,int l,int r,int a,int b)
{
if(a==l&&b==r)return maxb[x];int mid=(l+r)>>1;
if(b<=mid) return qma(x<<1,l,mid,a,b);
else if(a>mid) return qma(x<<1|1,mid+1,r,a,b);
return max(qma(x<<1,l,mid,a,mid),qma(x<<1|1,mid+1,r,mid+1,b));
}
inline void Insert(int x,int l,int r,int a,int b,int t)
{
if(l==a&&r==b){ins(t,x);return;}
int mid=(l+r)>>1;
if(b<=mid) Insert(ls[x],l,mid,a,b,t);
else if(a>mid) Insert(rs[x],mid+1,r,a,b,t);
else Insert(ls[x],l,mid,a,mid,t),Insert(rs[x],mid+1,r,mid+1,b,t);
}
int bel[MN*3],Mi[MN*3],Ma[MN*3],dfn[MN*3],low[MN*3],dind,st[MN*3],tp,bl;
int getv(int x){if(x>N)return 0;return x;}bool in[MN*3];
inline void rwi(int &x,int y){if(y<x)x=y;}
inline void rwa(int &x,int y){if(y>x)x=y;}
void tj(int x)
{
dfn[x]=low[x]=++dind;st[tp++]=x;in[x]=true;
register int i;
for(i=hr[x];i;i=e[i].nex)
{
if(!dfn[e[i].to]) tj(e[i].to),low[x]=min(low[x],low[e[i].to]);
else if(in[e[i].to])low[x]=min(low[x],low[e[i].to]);
}
if(low[x]==dfn[x])
{
++bl;
for(;st[tp]!=x;in[st[--tp]]=false)bel[st[tp-1]]=bl,rwi(Mi[bl],st[tp-1]),rwa(Ma[bl],getv(st[tp-1]));
}
}
inline void Built(int x,int l,int r)
{
if(l==r){minb[x]=Mi[bel[l]];maxb[x]=Ma[bel[l]];return;}
register int mid=(l+r)>>1;
Built(x<<1,l,mid);Built(x<<1|1,mid+1,r);
minb[x]=min(minb[x<<1],minb[x<<1|1]);
maxb[x]=max(maxb[x<<1],maxb[x<<1|1]);
}
edge E[MN<<4];int En=0,Hr[MN*3],rd[MN*3];
inline void Ins(int f,int t){++rd[t];E[++En]=(edge){t,Hr[f]};Hr[f]=En;}
std::queue<int> q;
void jt()
{
register int i,j,I,J;
memset(Hr,0,sizeof Hr);
for(i=1;i<=tt;++i) for(j=hr[i];j;j=e[j].nex)
if(bel[i]^bel[e[j].to]) Ins(bel[e[j].to],bel[i]);
for(i=1;i<=bl;++i) if(!rd[i]) q.push(i);
while(!q.empty())
{
int u=q.front();q.pop();
for(i=Hr[u];i;i=E[i].nex)
{
if(Ma[u]) rwa(Ma[E[i].to],Ma[u]);
if(Mi[u]<N) rwi(Mi[E[i].to],Mi[u]);
if(!--rd[E[i].to]) q.push(E[i].to);
}
}
}
int main()
{
register int i,j;
tt=N=read();for(i=1;i<=N;++i)b[a[i]=read()]=i;
build(root,1,N-1);Build(1,1,N);
for(i=1;i<N;++i)
{
int l=a[i],r=a[i+1],mi,ma;
if(l>r) std::swap(l,r);
mi=qmi(1,1,N,l,r);ma=qma(1,1,N,l,r);--ma;
if(mi<i) Insert(root,1,N-1,mi,i-1,i);
if(ma>i) Insert(root,1,N-1,i+1,ma,i);
}
memset(Mi,0x3f,sizeof Mi);
for(i=1;i<=tt;++i) if(i!=N&&!dfn[i]) tj(i);jt();
memset(minb,0,sizeof minb);memset(maxb,0,sizeof maxb);
Built(1,1,N-1);Q=read();
while(Q--)
{
int l=read(),r=read(),mi,ma;--r;
if(l>r){printf("%d %d\n",l,l);continue;}
mi=qmi(1,1,N-1,l,r);ma=qma(1,1,N-1,l,r);
printf("%d %d\n",mi,ma+1);
}
return 0;
}
/*
C 2019/3/18
*/
#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
#define reg register
ll N,M,P,Q,_1,_2;
std::map<ll,ll> mp;
const ll MN=2e5+5;
struct matrix
{
ll a[3][3];
matrix(){memset(a,0,sizeof a);}
matrix operator *(const matrix o)
{
reg int i,j,k;matrix c;
for(k=0;k<2;++k)for(i=0;i<2;++i)for(j=0;j<2;++j)
(c.a[i][j]+=(1ll*o.a[i][k]*a[k][j])%P)%=P;
return c;
}
}L[MN],R[MN],ep,_;
ll ans[MN<<1],dec;
ll Cal(ll num)
{
ll x=(num-1)/M,y=(num-1)%M+1;
matrix t;
t=L[x]*R[y];
ll xi=(1ll*t.a[0][0]*_1%P+1ll*t.a[0][1]*_2%P)%P;
ll xi_=(1ll*t.a[1][0]*_1%P+1ll*t.a[1][1]*_2%P)%P;
return (1ll*xi_*xi%P+dec)%P;
}
ll cal(ll x,ll y)
{
if(mp.count(1ll*(x-1)*M+y)) return (Cal(mp[1ll*(x-1)*M+y])+P)%P;
else return (Cal(1ll*(x-1)*M+y)+P)%P;
}
signed main()
{
ll x,y,i,j;
N=read(),M=read();Q=read();P=read();_1=read();_2=read();
dec=1ll*_1*((_2-_1+P)%P)%P;dec=1ll*(P-dec)%P;
while(Q--)
{
x=read();y=read();
i=mp.count(x)?mp[x]:x;j=mp.count(y)?mp[y]:y;
mp[x]=j;mp[y]=i;
}
ep.a[0][0]=ep.a[1][1]=1;ep.a[0][1]=ep.a[1][0]=0;
_.a[0][1]=_.a[1][0]=_.a[1][1]=1;_.a[0][0]=0;
R[0]=ep;for(i=1;i<=M;++i)R[i]=R[i-1]*_;
L[0]=ep;for(i=1;i<=N;++i)L[i]=L[i-1]*R[M];
ans[1]=cal(1,1);
for(i=1,j=1;i<=N&&j<=M;)
{
if(i<N)x=cal(i+1,j);else x=P+1;
if(j<M)y=cal(i,j+1);else y=P+1;
ans[i+j]=min(x,y);
if(x<=y) i++;else j++;
if(i==N&&j==M)break;
}
for(i=1;i<N+M;++i) printf("%lld ",ans[i]);
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

[NOI.AC]NOI2019省选模拟赛 第二场的更多相关文章

  1. NOI.AC NOIP模拟赛 第二场 补记

    NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...

  2. NOI.AC省选模拟赛第一场 T1 (树上高斯消元)

    link 很容易对于每个点列出式子 \(f_{x,y}=(f_{x,y-1}+f_{x,y}+f_{x,y+1}+f_{x+1,y})/4\)(边角转移类似,略) 这个转移是相互依赖的就gg了 不过你 ...

  3. NOI2019省选模拟赛 第五场

    爆炸了QAQ 传送门 \(A\) \(Mas\)的童年 这题我怎么感觉好像做过--我记得那个时候还因为没有取\(min\)结果\(100\to 0\)-- 因为是个异或我们肯定得按位考虑贡献了 把\( ...

  4. NOI2019省选模拟赛 第六场

    传送门 又炸了-- \(A\) 唐时月夜 不知道改了什么东西之后就\(A\)掉了\(.jpg\) 首先,题目保证"如果一片子水域曾经被操作过,那么在之后的施法中,这片子水域也一定会被操作&q ...

  5. NOI2019省选模拟赛 第三场

    传送门 明明没参加过却因为点进去结果狂掉\(rating\)-- \(A\) 集合 如果我们记 \[f_k=\sum_{i=1}^nT^i{n-i\choose k}\] 那么答案显然就是\(f_{k ...

  6. SCNU省选校赛第二场B题题解

    今晚的校赛又告一段落啦,终于"开斋"了! AC了两题,还算是满意的,英语还是硬伤. 来看题目吧! B. Array time limit per test 2 seconds me ...

  7. CSP-S全国模拟赛第二场 【nan】

    A.count 本场比赛最难的题... 隔板法组合数容斥 xjb 搞搞就好了 //by Judge #include<cstdio> #include<iostream> #d ...

  8. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  9. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

随机推荐

  1. Python 3 MySQL数据库操作

    import pymysql class Mysql_db(): def __init__(self,ip,username,password,db_name,table_name): self.ip ...

  2. VS2017 配置 boost_1_70

    1. 下载与安装 1.1 安装方法1 (1) 下载 https://www.boost.org/ 或者使用 https://sourceforge.net/projects/boost/files/b ...

  3. vue+ElementUI+高德API地址模糊搜索(自定义UI组件)

    开发环境描述: Vue.js ElementUI 高德地图API 需求描述: 在新增地址信息的时候,我们需要根据input输入的关键字调用地图的输入提示API,获取到返回的数据,并根据这些数据生成下拉 ...

  4. 学习笔记之CloudCompare

    CloudCompare - Open Source project https://www.danielgm.net/cc/ 3D point cloud and mesh processing s ...

  5. Oracle 子查询(复杂select语句)

    在执行数据操作时,如果某个操作需要依赖于另外一个 select语句的查询结果,那么就可以把 select 语句迁入到该操作语句中,这样就形成了一个子查询.实际应用中,表与表之间相互关联,相互依存,这样 ...

  6. Invalid escape sequence at line 1 column 29 path $[0].name

    编译报错:Invalid escape sequence at line 1 column 29 path $[0].name 解决:grade.properties 文件下 org.gradle.j ...

  7. IIS-This configuration section cannot be used at this path.

    Q:在IIS上部署web后,游览器打开报以下异常: This configuration section cannot be used at this path. This happens when ...

  8. Java异常类的继承关系图

  9. kali linux 虚拟机克隆之后版本回退问题

    今天在做虚拟机的克隆的之后发现 之前kali linux 系统内核升级后的更改全部又回退到之前的版本,也就是说之前安装的软件被删除了,现在需要自己重新安装一遍  ,(我滴个乖乖哟) 这里就不放图了.

  10. 三种Timer

    一.基于 Windows 的标准计时器(System.Windows.Forms.Timer) 首先注意一点就是:Windows 计时器是为单线程环境设计的.它直接继承自Componet.Timer控 ...