8.1 NOIP模拟 11

今天上午返校之后,颓了一会,然后下午就开始考试,中午睡着了,然后刚开始考试的时候就困的一匹,我一看T1,woc,这不是之前线段树专题的题啊,和那道题差不多,所以我......想起来了,我当时没有做,完了,这就是之前坑哇的太大的缘故。我的内心当时就在滴血,心想推正解还不如先打个暴力,然后愉快的5分钟吗了一个暴力,整个就是俩sort,又花了五分钟改成了桶排,然后就愉快的交上去了,然后我T1还是没有思路,就15分钟的时候转了T2,T2一看就开始推组合数的柿子,但是由于我的误判成数学题,就完犊子了,那还等啥,一看20%的数据,就果断摔了一个dfs上去,然后就转T3,(此时内心虚的一批),T3一看,先想了一个啥都没有的暴力,然后又想到了前缀和优化,就优化一下,自己有造了几个极限数据,发现20%和40%应该都能过(当时心花怒放,但是其实60是不存在的),然后开考50分钟,打完了三个暴力,就歇菜了,剩下的时间就开始刚正解,最后的提交我也是挂着暴力交上去的,所以最后我的分数并没有因为我的覆盖而降低,但是也没有因为我的“正解”而分数增高,刚考完我就知道我这次凉凉,只打了3个暴力,肯定又垫底了,但是竟然还有暴力都没打对的大佬然后,我就和13个同学并列rank7,100分,虽然rank7,但是这是在别人失误的情况下得的,所以如果别人都没失误,那我这次就又垫底了,所以这次还是失败的考试。

T1 string

这这,一看就是之前学长讲过的那道用线段树维护的题,好像还带了二分,但是仔细一看略有不同,之前的那个是指询问地q个数,而这个是询问整个结果,所以我就(缨缨婴)只能打暴力,但是好像全场都没几个打正解的。在下面改题的过程中我就想到了一种奇爬的方法,就是维护一个每个字母出现次数的前缀和,然后通过一系列操作实现对字符串的变化,但是时间复杂度是$ O(n*m*26) $交上去T40,和我的暴力跑的时间一样,然后我就想怎么优化,有这么一种思路,就是我把前缀和的图像画在了之上,然后发现他是单调上升函数(这不是废话吗!),那么我就想到使用链表吧图像的拐点存下来,这样就可以知道了一些信息,而且可以 $ O(1) $计算出一些信息,但是需要 $ O(m*26) $的复杂度进行转移,所以应该比正解跑的还要快,但是男就难在了这个思路不好实现,所以我还是老老实实的打了线段树,最后还是没有忍住话了一点时间打了一下,发现确实很难条,我就暂且哇个坑,有神犇愿意为我条一下的也可以,后来我看cbx的T1快到飞起,其实他的思路和我的这个思路是一样的,就不赘述了;

我的T40暴力代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char cc;cc=getchar();
while(cc>''||cc<''){if(cc=='-')f=-;cc=getchar();}
while(cc>=''&&cc<=''){x=(x<<)+(x<<)+cc-'';cc=getchar();}
return x*f;
}
char s[];
int n,m,l,r,x;
inline bool cmp1(char a,char b){return a<b;}
inline bool cmp2(char a,char b){return a>b;}
int main()
{
//freopen("cnm.txt","r",stdin);
n=read();m=read();
scanf("%s",s+);
for(int i=;i<=m;i++)
{
l=read(),r=read(),x=read();
if(x==)sort(s+l,s+r+,cmp1);
else sort(s+l,s+r+,cmp2);
}
for(int i=;i<=n;i++)
printf("%c",s[i]);
puts("");
return ;
}

T40

我的AC线段树代码:

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
const int maxn=;
using namespace std;
#define re register
#define debug(x) cout<<x<<" debug!"<<endl;
inline int read()
{
re int x=,f=;char cc;cc=getchar();
while(cc>''||cc<''){if(cc=='-')f=-;cc=getchar();}
while(cc>=''&&cc<=''){x=(x<<)+(x<<)+cc-'';cc=getchar();}
return x*f;
}
int m,n,k,t,sum[];
char s[maxn];
struct tree{
int l,r,vv,lev;
}tr[maxn<<];
inline void pushup(int x)
{
if(tr[x<<].vv==tr[x<<|].vv)
tr[x].vv=tr[x<<].vv;
else tr[x].vv=-;
}
inline void pushdown(int x)
{
if(tr[x].vv!=-)
tr[x<<].vv=tr[x<<|].vv=tr[x].vv;
else tr[x].vv=-;
}
inline void build(int x,int l,int r)
{
tr[x].l=l, tr[x].r=r;
tr[x].vv=-;
if(tr[x].l==tr[x].r)
{
tr[x].vv=s[l]-'a';
return;
}
int mid=(tr[x].l+tr[x].r)>>;
build(x<<,l,mid); build(x<<|,mid+,r);
pushup(x);
}
inline void query(int x)
{
if(tr[x].vv!=-)
{
for(register int i=;i<=tr[x].r-tr[x].l+;++i)
putchar(tr[x].vv+'a');
return;
}
query(x<<);
query(x<<|);
}
inline void make(int x,int l,int r)
{
if(l<=tr[x].l&&tr[x].r<=r)
{
if(tr[x].vv!=-)
{
sum[tr[x].vv]+=tr[x].r-tr[x].l+;
return;
}
}
pushdown(x);
int mid=(tr[x].l+tr[x].r)>>;
if(l<=mid)make(x<<,l,r);
if(mid+<=r)make(x<<|,l,r);
}
inline void change(int x,int l,int r,int vv)
{
if(l>r) return;
if(l<=tr[x].l&&tr[x].r<=r)
{
tr[x].vv=vv;
return;
}
int mid=(tr[x].l+tr[x].r)>>;
if(l<=mid)change(x<<,l,r,vv);
if(mid+<=r)change(x<<|,l,r,vv);
pushup(x);
}
int main()
{
//freopen("1.txt","r",stdin);
n=read(),m=read();
scanf("%s",s+);
build(,,n);
while(m--)
{
memset(sum,,sizeof(sum));
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
make(,l,r);
if(x==)
{
int L=l;
for(register int i=;i<;++i)
{
change(,L,L+sum[i]-,i);
L+=sum[i];
}
}
if(x==)
{
int L=l;
for(register int i=;i>=;--i)
{
change(,L,L+sum[i]-,i);
L+=sum[i];
}
}
}
query();
puts("");
}

AC

还有cbx的代码就不放了,本人懒得征求版权了!

T2 Matrix

这到题是本人感觉正常最难的题,虽然看起来像组合数学(而且我也是按组合数学打的,但是并不是)

这是题解,其实就是一个贼神仙的dp,由于时间限制以及任务繁多,本人扔下代码就跑:

 #include<iostream>
#include<cstdio>
using namespace std;
#define LL long long
#define re register
inline LL read()
{
re LL x=,f=;char cc;cc=getchar();
while(cc>''||cc<''){if(cc=='-')f=-;cc=getchar();}
while(cc>=''&&cc<=''){x=(x<<)+(x<<)+cc-'';cc=getchar();}
return x*f;
}
const LL p=;
LL n,m,dp[][],pw[],inv[],ipw[],l[],r[];
int main()
{
n=read(),m=read();
for(re LL i=;i<=n;++i)++l[read()],++r[read()];
for(re LL i=;i<=m;++i)l[i]+=l[i-],r[i]+=r[i-];
dp[][]=;
for(re LL i=;i<=m;++i)
{
dp[i][]=dp[i-][];
for(re LL j=;j<=r[i];++j)
dp[i][j]=(dp[i-][j]+dp[i-][j-]*(r[i]-j+)%p)%p;
for(re LL j=l[i-];j<l[i];++j)
for(re LL k=;k<=i-j;++k)
dp[i][k]=dp[i][k]*(i-k-j)%p;
}
printf("%lld\n",dp[m][n]);
}

T2

T3 big

本人也是先哇下坑,先沽了;

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
#define re register
LL ch[][],tot;
LL num[],n,m;
LL ans,cnt,sum,pre[],x;
LL head[],nxt[],ver[],tot2,vvt[];
const int pc=;
inline LL read()
{
re LL x=,f=;char cc;cc=getchar();
while(cc>''||cc<''){if(cc=='-')f=-;cc=getchar();}
while(cc>=''&&cc<=''){x=(x<<)+(x<<)+cc-'';cc=getchar();}
return x*f;
}
void inser(LL x)
{
LL h=x%pc;
for(int i=head[h];i;i=nxt[i])
if(ver[i]==x)++vvt[i];
ver[++tot2]=x;
nxt[tot2]=head[h];
head[h]=tot2;
vvt[tot2]++;
}
LL query(LL x)
{
LL h=x%pc;
LL op=;
for(int i=head[h];i;i=nxt[i])
if(ver[i]==x)
op=vvt[i];
return op;
}
LL insert(LL x)
{
LL u=,wc=,xx=x;
for(register int i=n-;i>=;--i)
{
wc=(xx&(<<i))?:;
if(!ch[u][wc])
ch[u][wc]=++tot;
u=ch[u][wc];
}
}
inline void dfs(int x,int dep,int sum)
{
if(dep==-)
{
if(sum>=ans) ans=sum,inser(ans);
return;
}
if(!ch[x][]) dfs(ch[x][],dep-,sum^(<<dep));
if(!ch[x][]) dfs(ch[x][],dep-,sum^(<<dep));
if(ch[x][]&&ch[x][])
{
dfs(ch[x][],dep-,sum);
dfs(ch[x][],dep-,sum);
}
}
int main()
{
n=read(),m=read();
for(register int i=;i<=m;++i)
x=read(),pre[i]=pre[i-]^x;
for(register int i=,x;i<=m;++i)
{
x=((*pre[i])/(<<n)+*pre[i])%(<<n);
insert(x^pre[i]^pre[m]);
}
dfs(,n-,);
LL uu=query(ans);
printf("%lld\n%lld\n",ans,uu);
}

T3

8.1 NOIP模拟11的更多相关文章

  1. Noip模拟11 2021.7.11

    T1 math 其实看看题面,看看给的那机组数据即可看出规律了(然而当时并没有,只是发现模数的循环节,存了个vector,接下来就暴力了) 有个柿子: 其实就是裴蜀定理. 然后想一想的话就是 那么只要 ...

  2. noip模拟11

    T1 math 就挺水一小破题目,第一眼看好像不可做,看着看着突然发现假设x和y的最大公约数是gcd,那么kx%y一定是gcd的倍数, 然后想到可以把所有数字与k的gcd求出来,打一个完全背包,可是仔 ...

  3. NOIP模拟 11

    差点迟到没赶上开题 开题后看了T1,好像一道原题,没分析复杂度直接敲了个NC线段树,敲了个暴力,敲了个对拍,就1h了.. 对拍还对出错了,发现标记下传有点问题,改了以后对拍通过,就把T1扔掉看T2 觉 ...

  4. [考试总结]noip模拟11

    菜 这次考试又是骗了一堆分数... 然而其实一个正解都没写... \(T1\) 的方法说实话确实不是很正统.... 然而却 \(A\) 了... 在打完 \(T1\) 后拍了老长时间... 然后就耽搁 ...

  5. NOIP 模拟 $11\; \rm english$

    题解 本题有一定代码难度 对于需要区间最大值,可以反过来考虑,先预处理出每个数所能扩展的最大边界,也就是说,求出一个最大的区间,其最大值为这个数,单调栈 \(\mathcal O(n)\) 求解 那么 ...

  6. NOIP 模拟 $11\; \rm biology$

    题解 首先对 \(a\) 离散化,则可推出转移方程 \[dp_{i,j}=\max\{{dp_{{i^{'}},{j^{'}}}+|i-i^{'}|+|j-j^{'}|}\}+b_{i,j} \;\; ...

  7. NOIP 模拟 $11\;\rm math$

    题解 签到题(然而还是不会) 考虑所有可能的值一定是 \(\in [0,k)\),且一定为 \(gcd(a_1,a_2,...a_n,k)\) 的倍数. 证明: 设 \(tmp=b_1a_1+b_2a ...

  8. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  9. 11/1 NOIP 模拟赛

    11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...

随机推荐

  1. asp.net core learn

    .NET Core WebApi RESTful规范 RESTful API 最佳实践 理解RESTful架构 接口版本控制 Support multiple versions of ASP.NET ...

  2. springboot 自定义LocaleResolver切换语言

    springboot 自定义LocaleResolver切换语言 我们在做项目的时候,往往有很多项目需要根据用户的需要来切换不同的语言,使用国际化就可以轻松解决. 我们可以自定义springboor中 ...

  3. 【LeetCode刷题】——两数之和.1

    ---恢复内容开始--- 一直想在leetcode上面刷题,但是java刚刚摸了一下门,所以迟迟没有动手,今天做了第一道题,感觉自己实在菜的不行,但是还是学到了很多东西, 就记录一下遇到的问题. 首先 ...

  4. git操作指令,以及常规git代码操作

    安装git后操作指令如下:可以查阅git安装使用操作指南详情git安装使用操作图示详情.note 线上可参考指南:http://www.bootcss.com/p/git-guide/   所有操作在 ...

  5. ssh隧道代理连接

    0x00 什么是SSH隧道 场景: 假设有两台主机: A主机为外网,B主机为内网通常来说外网主机A是无法直接连接到内网主机B的,这时如果要实现A主机通过ssh控制B主机,通常来说有两种方法: 1.端口 ...

  6. vc++中输入表的免杀

    国外的杀毒软件一般会把特征码定位在PE文件的输入表函数(也就是源码里我们调用了的API函数)上, 我们对付这种查杀的方法就是在源码里对API函数进行动态调用,对一个函数动态调用之后,本来以输入 表函数 ...

  7. Javascript实现10种排序算法

    1.冒泡排序: 比较相邻的两个数,如果前一个数大于后一个数,就将这两个数换位置.每一次遍历都会将本次遍历最大的数冒泡到最后.为了将n个数排好序,需要n-1次遍历.如果某次遍历中,没有调整任何两个相邻的 ...

  8. JavaScript正则表达式之语法

    Regular Expressions翻译成中文叫正则表达式.也不知道是谁翻译过来的,听起来就很严肃.似乎翻译成通用表达式更能传达其精髓. 为什么叫通用表达式?因为它有一套和编程语言无关的文本匹配规则 ...

  9. 手把手教你搭建HEXO免费博客

    一.环境搭建 node安装 百度搜索node,进入官网.下载稳定版: 下载好后直接打开安装 我这里将其安装在D盘(可以自己选择安装位置) 可以看到安装包中已经自带npm包管理工具 等待安装完成后,WI ...

  10. opencv::霍夫变换-直线

    霍夫直线变换介绍 Hough Line Transform用来做直线检测 前提条件 – 边缘检测已经完成 平面空间到极坐标空间转换 对于任意一条直线上的所有点来说,变换到极坐标中,从[0~360]空间 ...