感觉自己放弃题目还是过于容易。

其实第一题不是很难,但是自己拿了一个暴力就走人了。。

然后其实简单优化一下子就有不少分数。

然后第二题的本质不同的子序列个数的方程没有推出来,如果推出来就会直接有 \(67pts\),但是自己只能用 \(2^n\) 暴力去计算。

第三题还是对期望有一些畏惧。。。

其实这个仔细想想方程并不难,然后这样就有很多分数,然后线段树确实不是很好写,但是基础 \(dp\) 也有很多。。。。

prime

我们可以先筛出来 \(1\)~$ min(sqrt(r),k)$ 之间的素数,然后向上筛,标记后异或。

然后没了。。。

#include<bits/stdc++.h>
using std::endl; using std::cout;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
#define asm(i,x) for(register signed i=head[x];i;i=edge[i].next)
namespace xin_io
{
#define debug cout<<"debug"<<endl
#define sb(x) cout<<#x" = "<<x<<' '
#define jb(x) cout<<#x" = "<<x<<endl
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1 ++
char buf[1<<20],*p1 = buf,*p2 = buf; typedef long long ll; typedef unsigned long long ull;
class xin_stream{public:template<typename type>xin_stream &operator >> (type &s)
{
register bool f = 0; s = 0; register char ch = gc();
while(!isdigit(ch)) f |= ch == '-',ch = gc();
while( isdigit(ch)) s = (s << 1) + (s << 3) + (ch xor 48),ch = gc(); return s = f ? -s : s,*this;
}}io;
}
using namespace xin_io; static const int maxn = 1e7+10;
#define int long long
namespace xin
{
bool number[maxn];
int prime[maxn];
int l,r,k,count = 0;
bool vis[maxn];
inline short main()
{
io >> l >> r >> k;
int N = std::min((ll)std::sqrt(r) * 1ll,k * 1ll);
memset(number,true,sizeof(number));
try(i,2,N)
{
if(number[i]) prime[count++]=i;
for(register int j=0;j<count&&prime[j]*i<=N;j++)
{
number[prime[j]*i]=false;
if(i%prime[j]==0)
break;
}
}
try(i,0,count-1)
{
register int temp = l / prime[i];
if(temp * prime[i] < l) temp += 1; temp += (temp == 1);
while(temp * prime[i] <= r)
{
vis[temp * prime[i] - l] = 1;
temp ++;
}
}
int ans = 0;
try(i,0,r - l)
if(!vis[i])
ans ^= (1ll * i + l);
cout<<ans<<endl;
return 0;
}
}
signed main() {return xin::main();}

sequence

好像还是第一次考到的矩阵快速幂优化\(dp\)

然后基础 \(dp\) 求本质不同子序列个数就是设\(f_i\) 表示以 \(i\) 结尾的本质不同的子序列个数,然后 \(f_i=\sum_{j=1}^{k}f_j + 1\),我们发现这个其实是 \(\mathcal O(n)\) 的,然后 \(m==0\) 的测试点就都有了。

之后考虑如何接 \(m\),我们考虑发现每一次进行转移 \(f_i\) 的时候,其实接下来的 \(f_i\) 与 \(i\) 无关,因为本质不同的子序列个数就是 \(\sum f_i\) ,而我们要最大化这个玩意,我们就可以每次选择最小的 \(f_i\) 进行转移。

\(\color{red} {\huge{\text{但是}}}\)

你确定要使用 \(<\) 进行比较吗??

这个可是取过模的啊!!!1

你可不能认为 \(1e9+6>1e9+8\) 啊

所以我们转化一下就是我们每次找到最后出现位置最靠前的那个元素

这个就是用 \(priority\)_\(queue\) 就行。

之后我们考虑矩阵转移,我们要转移那个基础的方程,并且我们要保证这个 \(\sum\) 最大,所以我们就要保证顺序的转移。

我们的基础矩阵就是一个 \(1 * k+1\) 的矩阵

\[\quad
\begin{bmatrix} f_1 \\ f_2 \\ f_3\\.\\.\\.\\f_n\\1 \end{bmatrix}
\]

最后的\(1\) 是转移所需。

然后我们构造转移矩阵,我们保证其将基础矩阵的最小值移动到最上面,最后 \(\sum\) 就是答案

那么就是

\[\quad
\begin{bmatrix}0 & 1 & 0 & 0 & 0\\0&0&1&0&0\\0&0&0&1&0\\0&0&0&0&1\\0&0&0&0&0\\1&1&1&1&1\\0&0&0&0&1 \end{bmatrix}
\]

然后最后的矩阵的 \(\sum\) 就是答案



#include<bits/stdc++.h>
using std::cout; using std::endl;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
#define asm(i,x) for(register signed i=head[x];i;i=edge[i].next)
namespace xin_io
{
#define sb(x) cout<<#x" = "<<x<<' '
#define jb(x) cout<<#x" = "<<x<<endl
#define debug cout<<"debug"<<endl
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
char buf[1<<20],*p1 = buf,*p2 = buf; int ak; typedef long long ll; typedef unsigned long long ull;
class xin_stream{public:template<typename type>inline xin_stream &operator >> (type &s)
{
register int f = 0;s = 0; register char ch = gc();
while(!isdigit(ch)) {f |= ch == '-'; ch = gc();}
while( isdigit(ch)) s = (s << 1) + (s << 3) + (ch xor 48),ch = gc(); return s = f ? -s : s,*this;
}}io;
}
using namespace xin_io; static const int maxn = 1e6+10,inf = 1e9+7; const ll llinf = 1e18+7;
#define int long long
namespace xin
{
const int mod = inf;
int f[maxn];
int n,m,k;
int sum = 0;
class xin_mat
{
public:
int a[110][110];
int n,m;
friend xin_mat operator * (xin_mat x,xin_mat y)
{
xin_mat temp;
try(i,1,x.n) try(j,1,y.m)
{
temp.a[i][j] = 0;
try(k,1,x.m) (temp.a[i][j] += x.a[i][k] * y.a[k][j] % mod);
temp.a[i][j] %= mod;
}
temp.n = x.n; temp.m = y.m;
return temp;
}
}mat,my,zhuan;
class xin_data
{
private:
friend bool operator < (xin_data x,xin_data y)
{return x.pos > y.pos;}
public:
int col,pos;
xin_data(){}
xin_data(int col,int pos):col(col),pos(pos){}
};
std::priority_queue<xin_data>q;
bool vis[maxn];
int a[maxn];
inline short main()
{
io >> n >> m >> k;
sum = 0;
try(i,1,n)
{
io >> a[i];
register int temp = f[a[i]];
(f[a[i]] = 1 + sum) %= mod;
(sum += f[a[i]] - temp + mod) %= mod;
}
throw(i,n,1)
if(!vis[a[i]]) q.push(xin_data(a[i],i)),vis[a[i]] = 1;
try(i,1,k)
if(!vis[i]) q.push(xin_data(i,0));
mat.n = k + 1; mat.m = 1;
try(i,1,k) mat.a[i][1] = f[q.top().col],q.pop();
mat.a[k+1][1] = 1;
my.n = my.m = k + 1;
try(i,1,k+1) my.a[i][i+1] = 1;
try(i,1,k+1) my.a[k][i] = 1;
my.a[k+1][k+1] = 1;
zhuan.n = zhuan.m = k + 1;
try(i,1,k+1) zhuan.a[i][i] = 1;
while(m)
{
if(m & 1) zhuan = zhuan * my;
my = my * my; m >>= 1;
}
mat = zhuan * mat;
int ans = 0;
try(i,1,k) (ans += mat.a[i][1]) %= mod;
cout<<ans<<endl;
return 0;
}
}
signed main() {return xin::main();}

Omeed

基础分数就是

\[A * \sum_{i=l}^{r} p_i
\]

然后 \(combo\) 应该是

\[B * \sum_{i=l}^{r}(f_{i-1}+1)
\]

然后

\[f_i=p_i*(f_{i-1}+1)+(1-p_i)*f_{i-1}*t
\]

之后就有很多分数,之后发现可以线段树维护。

之后这个题目卡常严重!!!!

加油



#include<bits/stdc++.h>
using std::endl; using std::cout;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
#define asm(i,x) for(register signed i=head[x];i;i=edge[i].next)
namespace xin_io
{
#define debug cout<<"debug"<<endl
#define sb(x) cout<<#x" = "<<x<<' '
#define jb(x) cout<<#x" = "<<x<<endl
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1 ++
char buf[1<<20],*p1 = buf,*p2 = buf; typedef long long ll; typedef unsigned long long ull;
class xin_stream{public:template<typename type>xin_stream &operator >> (type &s)
{
register bool f = 0; s = 0; register char ch = gc();
while(!isdigit(ch)) f |= ch == '-',ch = gc();
while( isdigit(ch)) s = (s << 1) + (s << 3) + (ch xor 48),ch = gc(); return s = f ? -s : s,*this;
}}io;
}
using namespace xin_io; static const int maxn = 1e7+10,mod = 998244353;
#define int long long
namespace xin
{
inline int ksm(int x,int y)
{
register int ret = 1 ;
while(y)
{
if(y & 1) ret = ret * x % mod;
x = x * x % mod; y >>= 1;
}
return ret;
}
int n,bian,q,ta,tb,A,B,t;
int p[maxn];
class xin_seg
{
private:
#define ls (x << 1)
#define rs (x << 1 | 1)
inline void up(int x)
{
shit1[x] = (shit1[ls] + shit1[rs]) % mod;
shit2[x] = (shit2[ls] + shit2[rs] * fk[ls] % mod) % mod;
fk[x] = fk[ls] * fk[rs] % mod;
shit4[x] = (shit4[rs] + shit4[ls] * fk[rs] % mod) % mod;
sum[x] = (sum[rs] + sum[ls] + shit4[ls] * shit2[rs] % mod) % mod;
}
public:
int shit1[maxn],shit4[maxn],fk[maxn],sum[maxn],siz[maxn],shit2[maxn];
class xin_data
{
public:
int rshit1,rfr,rsu;
xin_data(){}
xin_data(int rshit1,int rfr,int rsu):rshit1(rshit1),rfr(rfr),rsu(rsu){}
}data;
void build(int x,int l,int r)
{
if(l == r) {shit1[x] = shit4[x] = p[l]; fk[x] = (t - (t - 1) * p[l] % mod+ mod) % mod;
sum[x] = 0; shit2[x] = shit1[x] ;return ;}
register int mid = l + r >> 1; build(ls,l,mid); build(rs,mid+1,r); up(x);
}
void insert(int x,int l,int r,int pos,int val)
{
siz[x] = r - l + 1;
if(l == r) {shit1[x] = shit4[x] = val; fk[x ]= (t - (t - 1) * val % mod + mod) % mod;
sum[x] = 0; shit2[x] =shit1[x]; return;}
register int mid = l + r >> 1;
if(pos <= mid) insert(ls,l,mid,pos,val); else insert(rs,mid+1,r,pos,val); up(x);
}
void query(int x,int l,int r,int ql,int qr)
{
if(ql <= l and qr >= r)
{
data.rshit1 = (data.rshit1 + shit1[x]) % mod;
data.rsu = (data.rsu + sum[x] + data.rfr * shit2[x] % mod) % mod;
data.rfr = (data.rfr * fk[x] + shit4[x]) % mod; return ;
}
register int mid = l + r >> 1;
if(ql <= mid) query(ls,l,mid,ql,qr); if(qr > mid) query(rs,mid+1,r,ql,qr);
}
}seg;
inline short main()
{
io >> bian >> n >> q >> ta >> tb >> A >> B;
t = ta * ksm(tb,mod-2) % mod;
try(i,1,n)
{
register int wa,wb; io >> wa >> wb;
p[i] = wa * ksm(wb,mod - 2) % mod;
}
seg.build(1,1,n);
try(cse,1,q)
{
register int op; io >> op;
if(op)
{
register int l,r; io >> l >> r;
seg.data = xin_seg::xin_data(0,0,0);
seg.query(1,1,n,l,r);
printf("%lld\n",(seg.data.rshit1 * A % mod + (seg.data.rsu + seg.data.rshit1) * B % mod) % mod);
}
else
{
register int x, wa,wb; io >> x >> wa >> wb;
p[x] = wa * ksm(wb,mod-2) % mod;
seg.insert(1,1,n,x,p[x]);
}
}
return 0;
}
}
signed main() {return xin::main();}

[考试总结]noip模拟47的更多相关文章

  1. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  2. 5.23考试总结(NOIP模拟2)

    5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...

  3. 5.22考试总结(NOIP模拟1)

    5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...

  4. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  5. [考试总结]noip模拟23

    因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...

  6. 「考试」noip模拟9,11,13

    9.1 辣鸡 可以把答案分成 每个矩形内部连线 和 矩形之间的连线 两部分 前半部分即为\(2(w-1)(h-1)\),后半部分可以模拟求(就是讨论四种相邻的情况) 如果\(n^2\)选择暴力模拟是有 ...

  7. 6.11考试总结(NOIP模拟7)

    背景 时间分配与得分成反比,T1 20min 73pts,T2 1h 30pts,T3 2h 15pts(没有更新tot值,本来应该是40pts的,算是本次考试中最遗憾的地方了吧),改起来就是T3比较 ...

  8. 6.10考试总结(NOIP模拟6)

    前言 就这题考的不咋样果然还挺难改的.. T1 辣鸡 前言 我做梦都没想到这题正解是模拟,打模拟赛的时候看错题面以为是\(n\times n\)的矩阵,喜提0pts. 解题思路 氢键的数量计算起来无非 ...

  9. 6.7考试总结(NOIP模拟5)

    前言 昨天说好不考试来着,昨晚就晚睡颓了一会,今天遭报应了,也没好好考,考得挺烂的就不多说了. T1 string 解题思路 比赛上第一想法就是打一发sort,直接暴力,然后完美TLE40pts,这一 ...

随机推荐

  1. linux安装虚拟环境的步骤

    1.创建名为env_wcs,python版本为3.6的虚拟环境conda create -n env_wcs python=3.6conda create -n my_ env numpy matpl ...

  2. centos ansible常用命令

    ansible在日常运维中经常使用,特别是批量执行多台服务器的时候,有效减小重复的操作成本,以下从安装到使用仅讲解工作中常用的几种方式,模块很多功能很强大,但不做全面讨论. ansible安装 在ce ...

  3. 开源ERP和其它ERP软件比较

    现在有许多企业将ERP项目,在企业中没有实施好,都归咎于软件产品不好.其实,这只是你们的借口.若想要将ERP软件真正与企业融合一体,首先得考虑企业的自身情况,再去选择适合的 ERP软件. 如果你的企业 ...

  4. JAVAWEB过滤器、监听器的作用及使用>从零开始学JAVA系列

    目录 JAVAWEB过滤器.拦截器的作用及使用 过滤器Filter 什么是过滤器 为什么要使用过滤器(过滤器所能解决的问题) 配置一个过滤器完成编码的过滤 编写一个EncodingFilter(名称自 ...

  5. 记录21.07.26 —— Vue/cil

    VUE搭载脚手架 搭载环境 下载node node.js下载地址 控制台输入 npm install -g @vue/cil 查看版本 创建vue项目 创建完后会显示启动服务的指令 这个指令可以在pa ...

  6. C++面向对象 1(类-封装)

    1 //类和对象 2 //C++ 面向对象 三大特性 : 封装 继承 多态 3 4 //设计一个圆类,求圆的周长 5 //圆周长 = 2*PI * 半径 6 7 #include <iostre ...

  7. markdown的摘要测试

    123456789 1 123456789 2 123456789 3 123456789 4 123456789 5 123456789 6 粗体 123456 划线 123456 斜体 12345 ...

  8. vue服务端渲染之nuxtjs

    前言 本篇主要针对nuxtjs中的一些重要概念整理和代码实现! 在学习vue服务端渲染之前,先搞清楚几个概念: 什么是客户端渲染(CSR) 什么是服务端渲染(SSR) CSR和SSR有什么异同 客户端 ...

  9. linux的iptables设置

    添加规则 -A 在链末尾追加一条规则 -I 在链开头或某序号前插入一条规则 查看规则 -L 列出所有规则 -n 数字显示地址和端口信息 -v 详细信息 -line-numbers 显示规则序号 删除规 ...

  10. 【笔记】衡量线性回归法的指标 MSE,RMS,MAE以及评价回归算法 R Square

    衡量线性回归法的指标 MSE,RMS,MAE以及评价回归算法 R Square 衡量线性回归法的指标 对于分类问题来说,我们将原始数据分成了训练数据集和测试数据集两部分,我们使用训练数据集得到模型以后 ...