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
题解
$40\%$
按照题目说的做,直接枚举
$100\%$
我们建一棵tire树,
代码
#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); }
转载于:https://www.cnblogs.com/znsbc-13/p/11286426.html
NOIP模拟测试11「string·matrix·big」相关推荐
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
- NOIP模拟测试30「return·one·magic」
magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...
- NOIP模拟测试21「折纸·不等式」
折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...
- NOIP模拟测试38「金·斯诺·赤」
金 辗转相减见祖宗 高精 #include<bits/stdc++.h> using namespace std; #define A 2000 #define P 1 #define N ...
- NOIP模拟测试28「阴阳·虎·山洞」
写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方 ...
- NOIP模拟测试20「周·任·飞」
liu_runda出的题再次$\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%$ 任 题解 题目中为什么反复强调简单路径,没有环 没有环的图中点数-边数=联通块数 前缀和维护边 ...
- NOIP模拟测试23「mine·water·gcd」
mine 题解 一道比较水的dp 考试因为初始化挂掉了只有$80$分 代码有注释 #include<bits/stdc++.h> using namespace std; //无脑dp # ...
- NOIP模拟测试17「入阵曲·将军令·星空」
入阵曲 题解 应用了一种美妙移项思想, 我们先考虑在一维上的做法 维护前缀和$(sum[r]-sum[l-1])\%k==0$可以转化为 $sum[r]\% k==sum[l-1]\%k$开个桶维护一 ...
- NOIP模拟测试16「Drink·blue·weed」
话说这次考试 Drink 非常棒的一道卡常练习题,适合练习卡常 真的很棒 前置卡常知识 1.char要比int快 char是最快的 输出putchar,输入getchar 在这个题快了7000豪 2. ...
最新文章
- flex 表格勾选后 鼠标滚动会自动勾选_办公鼠里的BBA,罗技MX Anywhere 3鼠标开箱体验...
- python的setup.py文件及其常用命令
- 戴尔win10插耳机还外放_通州附近戴尔笔记本电脑维修哪家强-北京信维佳业科技有限公司...
- 继承和多态二:虚析构函数
- kernal tch 下载 天正_tch kernal.arx
- [图形]图形API的两种模式
- MAC修改保存bash_profile文件
- python识别鼠标在excel中选中的区域_[Excel技巧] 提高你工作效率的9个Excel技巧,职场新人必备...
- mongoDB的配置以及运行
- ES6标准入门(阮一峰)-阅读记录与心得
- 四种JSON解析工具--(json-libJacksonGsonFastJson)
- AIDA64 Extreme Edition(硬件检测)多国语言绿色特别版
- mysql 主从1236_mysql主从复制1236错误
- WebSocket网页聊天室
- Python中 or 和 and 用法
- 7kyu Jaden Casing Strings
- excel2010将数字变成以文本存储的数字
- 数据库原理——实验二《数据查询》
- 使用python制作epub
- 数值分析(1)-什么是数值分析
热门文章
- python时间倒计时显示屏厂家_python 实现倒计时功能(gui界面)
- Linux 命令之 pico -- 文本编辑器
- arpanet(阿帕网)
- python2打开文件_关于python:何时以二进制模式打开文件(b)?
- 华南理工网络教育计算机概论,2020年《计算机概论》平时作业华南理工网络教育学院.pdf...
- 浙江科技学院c语言考试试卷,浙江科技学院c语言C试卷A.doc
- java如何模拟请求_单元测试如何模拟用户请求
- springboot启动自动关闭_App自动化测试用例格式和App的启动与关闭
- C语言实现魔方阵代码及解析
- java int 传引用吗_Java的参数传递是「值传递」还是「引用传递」?