NOIP模拟测试11「string·matrix·big」
打的big出了点小问题,maxx初值我设的0然后少了10分
第二题暴力打炸
第一题剪了一些没用的枝依然40分
总分70
这是一次失败的考试
string
想到和序列那个题很像,但我没做序列,考场回忆学长讲课,打不出来。最后我口胡了一个CDQ分治,大概能减很多枝比如之前5 6 修改,之后4 6修改,那么其实你5 6不用改。
秉承这个思路,我随意打了一个分治,然后依然40分。
题解
我们可以维护每一段区间字母个数,维护一个桶,每次询问先把桶求出来,按照顺序排序时我们可以顺序枚举26个字母,进行区间修改,然后按照逆序反过来枚举就好了。这样把修改操作转化为若干个区间修改。但单单这么做我们会T,维护起来也不好维护,各种懒标记很恶心,我们还需要别的特殊姿势,
if(tr[p].a) tr[p<<1].a=tr[p].a,tr[p<<1|1].a=tr[p].a;
这样做我们修改和询问就不用递归到儿子节点了,而且这样我们还节省了维护懒标记时间
那么我们思考如何维护
修改时
if(tr[p].l>=l&&tr[p].r<=r||tr[p].a==x){
tr[p].a=x;
return ;
}
若区间不完全覆盖
if(tr[p].a) tr[p<<1].a=tr[p].a,tr[p<<1|1].a=tr[p].a,tr[p].a=0;
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 1010101
struct tree{
ll x,f,a,l,r;
}tr[A];
char s[A];
ll w[A];
ll n,m;
map<ll,char>mp;
void built(ll p,ll l,ll r){
tr[p].l=l,tr[p].r=r;
if(l==r){
// printf("l=%lld s=%lld\n",l,s[l]-'a'+1ll);
tr[p].a=s[l]-'a'+1;
return ;
}
ll mid=(l+r)>>1;
built(p<<1,l,mid);
built(p<<1|1,mid+1,r);
if(tr[p<<1].a==tr[p<<1|1].a)
tr[p].a=tr[p<<1].a;
}
void getsum(ll p,ll l,ll r){
// printf("l=%lld r=%lld l=%lld r=%lld tr[p].a=%lld\n",tr[p].l,tr[p].r,l,r,tr[p].a);
if(tr[p].l>=l&&tr[p].r<=r&&tr[p].a){
w[tr[p].a]+=(tr[p].r-tr[p].l+1);
return ;
}
ll mid=(tr[p].l+tr[p].r)>>1;
if(tr[p].a) tr[p<<1].a=tr[p].a,tr[p<<1|1].a=tr[p].a;
if(mid>=l)getsum(p<<1,l,r);
if(mid<r)getsum(p<<1|1,l,r);
}
void change(ll p,ll l,ll r,ll x){
// printf("l=%lld r=%lld ***\n",l,r);
if(tr[p].l>=l&&tr[p].r<=r||tr[p].a==x){
tr[p].a=x;
return ;
}
ll mid=(tr[p].l+tr[p].r)>>1;
// printf("tr[%lld]=%lld\n",p,tr[p].a);
if(tr[p].a) tr[p<<1].a=tr[p].a,tr[p<<1|1].a=tr[p].a,tr[p].a=0;
if(mid>=l) change(p<<1,l,r,x);
if(mid<r) change(p<<1|1,l,r,x);
}
void out(ll p){
// printf("p=%lld tr[p].a=%lld mp=%c\n",p,tr[p].a,mp[tr[p].a]);
if(tr[p].a){
for(ll i=1;i<=tr[p].r-tr[p].l+1;i++)
printf("%c",(char)mp[tr[p].a]);
return ;
}
out(p<<1);
out(p<<1|1);
}
void pre(){
for(ll i=1;i<=26;i++)
mp[i]='a'+i-1;
return ;
}
int main(){
pre();
scanf("%lld%lld",&n,&m);
scanf("%s",s+1);
built(1,1,n);
for(ll i=1,a,b,c,t;i<=m;i++){
scanf("%lld%lld%lld",&a,&b,&c);
getsum(1,a,b);
ll l=a;
if(c){
for(ll t=1;t<=26;t++)
if(w[t])
change(1,l,l+w[t]-1,t),l=l+w[t],w[t]=0;
}
else {
for(ll t=26;t>=1;t--)
if(w[t])
change(1,l,l+w[t]-1,t),l=l+w[t],w[t]=0;
}
}
out(1);
puts("");
}
big
题解咕咕咕
代码
#include<bits/stdc++.h>
#define ll long long
#define A 6000000
using namespace std;
ll tire[A][2],t[A],sum[A],dl[A],a[A];
ll tot=1,n,m,maxx=0,ans=0;
bool pan;
ll change(ll x){
return (2*x/(1<<n)+2*x)%(1<<n);
}
bool cmp(ll x,ll y){
return x>y;
}
inline void insert(ll x)
{
ll p=1;
for(ll i=1;i<=n;i++)
{
ll zan=(x>>(n-i))&1;
// printf("zan=%lld tot=%lld\n",zan,tot);
if(!tire[p][zan]) tire[p][zan]=++tot;
p=tire[p][zan];
}
}
inline ll dfs(ll x,ll zhi,ll deep)
{
if(deep<0){
dl[++dl[0]]=zhi;
}
// printf("trie[0][1]=[%lld][%lld] deep=%lld zhi=%lld 1<<=%lld\n",tire[x][0],tire[x][1],deep,zhi,1ll<<deep);
if(tire[x][0]&&!tire[x][1])
dfs(tire[x][0],zhi^(1ll<<deep),deep-1);
if(!tire[x][0]&&tire[x][1])
dfs(tire[x][1],zhi^(1ll<<deep),deep-1);
if(tire[x][0]&&tire[x][1]){
dfs(tire[x][0],zhi,deep-1);dfs(tire[x][1],zhi,deep-1);
}
}
int main()
{
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=m;i++)
scanf("%lld",&a[i]);
for(ll i=m;i>=1;i--)
sum[i]=sum[i+1]^a[i];
for(ll i=0,now=0;i<=m;i++){
// printf("now=%lld add=%lld\n",now,now^sum[i+1]);
now=now^change(a[i]);
insert(now^sum[i+1]);
}
// printf("1 %lld 0%lld\n",tire[1][1],tire[1][0]);
dfs(1,0,n-1);
sort(dl+1,dl+dl[0]+1,cmp);
for(ll i=1;i<=dl[0];i++)
if(dl[i]==dl[1]) ans++;
printf("%lld\n%lld\n",dl[1],ans);
}
NOIP模拟测试11「string·matrix·big」的更多相关文章
- NOIP模拟测试14「旋转子段·走格子·柱状图」
旋转子段 连60分都没想,考试一直肝t3,t2,没想到t1最简单 我一直以为t1很难,看了题解发现也就那样 题解 性质1 一个包含a[i]旋转区间值域范围最多为min(a[i],i)----max(a ...
- NOIP模拟测试5「星际旅行·砍树·超级树」
星际旅行 0分 瞬间爆炸. 考试的时候觉得这个题怎么这么难, 打个dp,可以被儿子贡献,可以被父亲贡献,还有自环,叶子节点连边可以贡献,非叶子也可以贡献,自环可以跑一回,自环可以跑两回, 关键是同一子 ...
- 2019.8.1 NOIP模拟测试11 反思总结
延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
- NOIP模拟测试21「折纸·不等式」
折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...
- NOIP模拟测试17「入阵曲·将军令·星空」
入阵曲 题解 应用了一种美妙移项思想, 我们先考虑在一维上的做法 维护前缀和$(sum[r]-sum[l-1])\%k==0$可以转化为 $sum[r]\% k==sum[l-1]\%k$开个桶维护一 ...
- NOIP模拟测试13「矩阵游戏·跳房子·优美序列」
矩阵游戏 考试时思路一度和正解一样,考试到最后还是打了80分思路,结果80分打炸了只得了40分暴力分 题解 算出来第一列的总值,每次通过加每两列之间的差值得出下一列的总值 算第一列我们只需要让当前点* ...
- NOIP模拟测试11
这次考试T1想到了正解没有去实现,然后就死了,不过我估计就算想到正解也会挂(26^2和暴力一个分),肝了两个小时T2屁都没蹦出来,T3没有搞清那个式子的含义. (不过一分没挂) T1:string 开 ...
- [NOIP模拟测试11] 题解
A.string 和河北的一道省选题很像.考场上写的暴力桶排,正解其实就是优化一下这个思路. 开线段树维护字符串中每个字母出现的次数.对于每条询问,区间查询.区间赋值维护即可. 另外,本题卡常严重,正 ...
随机推荐
- 使用JSONassert进行JSON对象对比
在日常工作中,会接到用户提出一张订单,修改后需要记录每次修改的信息,然后需要查看修改前后的差异信息这样的需求.要实现这样的功能方式有很多.下面介绍下JSONassert的简单使用,也方便自己后续使 ...
- 如何实现一个简易版的 Spring - 如何实现 AOP(上)
前言 本文是「如何实现一个简易版的 Spring 系列」的第五篇,在之前介绍了 Spring 中的核心技术之一 IoC,从这篇开始我们再来看看 Spring 的另一个重要的技术--AOP.用过 Spr ...
- 30.Stream流
5.Stream流 5.1体验Stream流[理解] 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集 ...
- VS·调试过程中某个操作导致调试突然退出之解决方案
阅文时长 | 0.11分钟 字数统计 | 232字符 主要内容 | 1.引言&背景 2.声明与参考资料 『VS·调试过程中某个操作导致调试突然退出之解决方案』 编写人 | SCscHero 编 ...
- Spec2006使用说明
Spec2006使用说明 五 10 十月 2014 By penglee 工具介绍 SPEC CPU 2006 benchmark是SPEC新一代的行业标准化的CPU测试基准套件.重点测试系统的处理器 ...
- Linux_进程管理相关命令
一.进程管理命令 1.ps -- 进程查看命令 1️⃣:ps(process state)命令用于列出当前的进程 2️⃣:可以显示详细的进程信息,包括: 用户识别符(UID),它确定进程的特权 唯一进 ...
- Docker-Compose入门-(转载)
Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 Compose 中你可以使用 YAML 文件来配置你的应用服务.然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务 ...
- shell基础之变量及表达式
本节内容 1. shell变量简介 2. 定义变量 3. 使用变量 4. 修改变量的值 5. 单引号和双引号的区别 6. 将命令的结果赋值给变量 7. 删除变量 8. 变量类型 9. 特殊变量列表 1 ...
- STM32 库函数 延时函数计算
- python3 读取txt文件数据,绘制趋势图,matplotlib模块
python3 读取txt文件数据,绘制趋势图 test1.txt内容如下: 时间/min cpu使用率/% 内存使用率/% 01/12-17:06 0.01 7.61 01/12-17:07 0.0 ...