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

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

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

然后第二题的本质不同的子序列个数的方程没有推出来,如果推出来就会直接有 \(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. 【Azure 应用服务】App Service 运行状况健康检查功能简介 (Health check)

    通过Azure App Service门户,启用Health Check来监视应用服务的实例,当发现其中一个实例处于不健康(unhealthy)状态时,通过重新路由(即把有问题的实例从负载均衡器中移除 ...

  2. Optional解决空指针

    Java 8 Optional 类 Java 8 新特性 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. O ...

  3. 使用 GLFW 在 OpenGL 的场景中漫游

    前言 前面已经建立了 OpenGL 框架,加载了 3D 模型,但是还没有在场景中漫游的功能.为了展示 3D 模型,我只是简单地利用变换视图矩阵的方式使模型在视野中旋转.同时,之前的程序连最简单的改变窗 ...

  4. 3、基于Python建立任意层数的深度神经网络

    一.神经网络介绍: 神经网络算法参考人的神经元原理(轴突.树突.神经核),在很多神经元基础上构建神经网络模型,每个神经元可看作一个个学习单元.这些神经元采纳一定的特征作为输入,根据自身的模型得到输出. ...

  5. Sqli-labs 注入靶场(1-22)

    Sqli-labs靶场1-22 Sql注入的本质是代码和数据的未分离,导致用户的输入可以对数据库产生恶意的输入或输出. 本篇博客旨在通过Sqli-labs的第1-22关,详细的描述Sql注入的相关场景 ...

  6. 大学同学做Java开发比我多5K,八年老Android只会crud该转Java吗?

    最近在网上看到这样一个帖子: 做了八年Android开发,感觉这块做着也挺没意思,日常工作就是做一些架构优化,质量数据监控,改一改构建脚本,最主要的是业务负责人没有一个是做客户端的,都是后端的人. 最 ...

  7. CentOS后台服务管理类

    目录 一.service 后台服务管理(临时,只对当前有效) 二.chkconfig 设置后台服务的自启配置(永久) 三.CentOS7 后添加的命令:systemctl 一.service 后台服务 ...

  8. 【Lua篇】静态代码扫描分析(三)语法分析

    一.语法分析 通过将词法分析获取的Token流按照目标语言的语法进行解析的过程,例如解析函数声明.函数调用.变量声明.各种语句等. 二.Lua语法分析 在写语法分析程序前,先需要了解Lua的语句和语法 ...

  9. [TensorFow2.0]-MNIST手写数字识别

    本人人工智能初学者,现在在学习TensorFlow2.0,对一些学习内容做一下笔记.笔记中,有些内容理解可能较为肤浅.有偏差等,各位在阅读时如有发现问题,请评论或者邮箱(右侧边栏有邮箱地址)提醒. 若 ...

  10. Use w3m as Web Browser

    Installation: apt-get install w3m. use "a" to input text, "tab" to jump between ...