话说这次考试

Drink

非常棒的一道卡常练习题,适合练习卡常

真的很棒

前置卡常知识

1.char要比int快

char是最快的

输出putchar,输入getchar

在这个题快了7000豪

2.read

快读非常棒,让你变得更快,fread更棒,fread会爆炸,考试时不要用fread

3.循环展开

循环展开非常棒,虽然看上去没什么用,然而循环展开会让你的程序快很多,循环展开往往是使你从T90到A的关键

4.inline

inline没什么用

大多数时候都没有什么用,一般时间不会发生什么变化,然而在mex这个题inline突然变得有用

突然变快.jpeg

5.register

大多数时候都没有什么用,然而有时会突然变快,有时还会变慢

暂时没有例子,(或者说只有变慢的例子)

6.STL

priority_queue手打,

stack手打

map手打(不是让你打红黑树,是hash表)

stack真的慢,stack打起来也好打,手打

7.mod

define或者const

定义成变量会很慢,

8.*2变<<1 /2 变>>1 ==变 ! ^

上面的卡常应用到这个题呢

char+循环展开

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll int
  4. #define A 2100
  5. char a[A][A];
  6. ll n,m,k;
  7. const int L=1<<20|1;
  8. char buffer[L],*S,*T;
  9. #define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T))?EOF:*S++)
  10. const int maxn=100000+5;
  11. inline int read(){
  12. register int ret;
  13. register char r;
  14. while(r=getchar(),r<'0'||r>'9');ret=r-48;
  15. while(r=getchar(),r>='0'&&r<='9')ret=ret*10+r-48;
  16. return ret;
  17. }
  18. int main(){
  19. n=read(),m=read(),k=read();
  20. for(ll i=1;i<=n;i++)
  21. for(ll j=1;j<=m;j++){
  22. register int ret;
  23. char r=getchar();
  24. while(!isdigit(r)) r=getchar();
  25. a[i][j]=r;
  26. }
  27. for(ll j=1,x,y,c,xl,yl;j<=k;j++){
  28. x=read(),y=read(),c=read();
  29. xl=x+c-1,yl=y+c-1;
  30. while(c>1){
  31. for(ll i=0;i<=c-2;i++){
  32. ll a1=a[xl-i][y],a2=a[x][y+i],a3=a[x+i][y+c-1],a4=a[x+c-1][yl-i];
  33. a[x][y+i]=a1,a[x+i][yl]=a2,a[xl][yl-i]=a3,a[xl-i][y]=a4;
  34. }
  35. x++,y++,yl--,xl--,c-=2;
  36. }
  37. }
  38. for(ll i=1;i<=n;i++,puts(""))
  39. for(ll j=1;j<=m;j++){
  40. putchar(a[i][j]);putchar(' ');
  41. }
  42. }

blue

这个题它不卡set它卡splay!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

贪心,都说这个题很水,但我还是觉得不明白,看题解也是似懂非懂的

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define A 5010101
  4. #define Inf 10000000ll
  5. #define ll long long
  6. #define py printf("*****\n")
  7. #define mem(a) memset(a,0,sizeof(a))
  8. ll landu[A],head[A],nx[A],ver[A],edg[A],dep[A],a[A],bl[A],blx[A],ch[A][2],cnt[A],size[A],key[A],fa[A];
  9. ll n,m,tot=1,S,T,t,D,L,sz,rt;
  10. set<ll> s;
  11. inline ll read(){
  12. ll f=1,x=0;char c=getchar();
  13. while(!isdigit(c)) {
  14. if(c=='-') f=-1;
  15. c=getchar();
  16. }
  17. while(isdigit(c)){
  18. x=(x<<1)+(x<<3)+c-'0';
  19. c=getchar();
  20. }
  21. return f*x;
  22. }
  23. inline void clear(ll x)
  24. {
  25. ch[x][0]=ch[x][1]=key[x]=cnt[x]=fa[x]=size[x]=0;
  26. }
  27. inline bool get(ll x)
  28. {
  29. return ch[fa[x]][1]==x;
  30. }
  31. inline void pushup(ll x)
  32. {
  33. if(x)
  34. {
  35. size[x]=cnt[x];
  36. if(ch[x][1]) size[x]+=size[ch[x][1]];
  37. if(ch[x][0]) size[x]+=size[ch[x][0]];
  38. }
  39. }
  40. inline void rotate(ll x)
  41. {
  42. ll old=fa[x],oldfa=fa[old],which=get(x);
  43. ch[old][which]=ch[x][which^1]; fa[ch[old][which]]=old;
  44. ch[x][which^1]=old; fa[old]=x;
  45. fa[x]=oldfa;
  46. if(oldfa) ch[oldfa][ch[oldfa][1]==old]=x;
  47. pushup(old);pushup(x); return ;
  48. }
  49. inline void splay(ll x)
  50. {
  51. for(ll f;f=fa[x];rotate(x))
  52. if(fa[f])
  53. rotate(get(f)==get(x)?f:x);
  54. rt=x;
  55. }
  56. inline ll pre()
  57. {
  58. if(cnt[rt]>1)
  59. return rt;
  60. ll now=ch[rt][0];
  61. while(ch[now][1]) now=ch[now][1];
  62. return now;
  63. }
  64. inline ll nxt()
  65. {
  66. if(cnt[rt]>1)
  67. return rt;
  68. ll now=ch[rt][1];
  69. while(ch[now][0]) now=ch[now][0];
  70. return now;
  71. }
  72. inline void insert(ll x)
  73. {
  74. if(rt==0)
  75. {
  76. sz++;rt=sz;
  77. cnt[sz]=size[sz]=1;
  78. key[sz]=x;
  79. fa[sz]=ch[sz][0]=ch[sz][1]=0;
  80. return ;
  81. }
  82. ll f=0,now=rt;
  83. while(233)
  84. {
  85. if(key[now]==x)
  86. {
  87. cnt[now]++;
  88. pushup(now);
  89. pushup(f);
  90. splay(now);
  91. return ;
  92. }
  93. f=now,now=ch[now][key[now]<x];
  94. if(now==0)
  95. {
  96. sz++;
  97. cnt[sz]=size[sz]=1;
  98. key[sz]=x;fa[sz]=f;
  99. ch[sz][1]=ch[sz][0]=0;
  100. ch[f][key[f]<x]=sz;
  101. pushup(f);splay(sz);return ;
  102. }
  103. }
  104. }
  105. inline ll rnk(ll x)
  106. {
  107. ll ans=1,now=rt;
  108. while(1)
  109. {
  110. if(x<key[now])
  111. now=ch[now][0];
  112. else
  113. {
  114. ans+=size[ch[now][0]];
  115. if(x==key[now])
  116. {
  117. splay(now);return ans;
  118. }
  119. ans+=cnt[now];
  120. now=ch[now][1];
  121. }
  122. }
  123. }
  124. inline void del(ll x)
  125. {
  126. rnk(x);
  127. if(cnt[rt]>1)
  128. {cnt[rt]--;pushup(rt);return ;}
  129. if(!ch[rt][0]&&!ch[rt][1])
  130. {clear(rt);rt=0;return ;}
  131. if(!ch[rt][0]||!ch[rt][1])
  132. {
  133. ll old=rt;
  134. rt=ch[rt][1]|ch[rt][0];
  135. clear(old);
  136. fa[rt]=0;
  137. return ;
  138. }
  139. ll older=rt; ll leftbigest=pre();
  140. splay(leftbigest);
  141. ch[rt][1]=ch[older][1];
  142. fa[ch[older][1]]=rt;
  143. clear(older);
  144. pushup(rt);
  145. }
  146. void re(){
  147. memset(ch,0,sizeof(ch));
  148. memset(size,0,sizeof(size));
  149. memset(key,0,sizeof(key));
  150. memset(fa,0,sizeof(fa));
  151. }
  152. int main()
  153. {
  154. set<ll>::iterator it;
  155. scanf("%lld",&t);
  156. while(t--){
  157. n=read(),m=read(),D=read(),L=read();
  158. s.clear();
  159. s.insert(-0x7ffffff);
  160. for(ll i=1;i<=n;i++){
  161. a[i]=read();
  162. // insert(a[i]);
  163. s.insert(a[i]);
  164. }
  165. ll ok=1,cnt=0;
  166. while(ok){
  167. ll now=0;
  168. while(now<L){
  169. if(now+D>=L) break;
  170. // insert(now+D);
  171. // ll x=pre();
  172. // del(now+D);
  173. ll x=*--s.upper_bound(now+D);
  174. // printf("x=%lld cnt=%lld\n",x,cnt);
  175. if(x<now){
  176. ok=0;
  177. break;
  178. }
  179. // now=key[x];
  180. now=x;
  181. s.erase(x);
  182. // del(key[x]);
  183. }
  184. if(ok==0) break;
  185. cnt++;
  186. if(cnt==m) break;
  187. }
  188. if(cnt!=m)
  189. printf("%lld\n",cnt);
  190. else
  191. printf("Excited\n");
  192. }
  193. }

weed

比较神的一道题,学长讲的时候我没弄明白,这次考试30分就是报应

以每个信息为下标记录三个信息,减少之后的层数,减少之后总的权值和,对之前区间减少的量

首先在建树和修改时我们将叶子节点维护好,上传时利用这三个信息进行计算就行了

优先删去右儿子节点(出现时间靠后),在右儿子不够时删除左儿子

假设我们现在已经算完左右儿子

那么如果右边儿子减少少于增加

直接无脑加即可

  1. if(tr[rs].cut==0){
  2. tr[x].v=tr[ls].v+tr[rs].v;
  3. tr[x].c=tr[ls].c+tr[rs].c;
  4. tr[x].cut=tr[ls].cut+tr[rs].cut;
  5. return ;
  6. }

如果右面儿子减少大于增加,并且右面儿子减少>=左面儿子层数和

那么当前cut会有剩余,那么v直接赋c直接赋成右面儿子剩余v,c的值,

  1. if(tr[ls].c<=tr[rs].cut){
  2. tr[x].cut=tr[rs].cut-tr[ls].c+tr[ls].cut;
  3. tr[x].v=tr[rs].v;
  4. tr[x].c=tr[rs].c;
  5. return ;
  6. }

如果右面儿子减少小于左面增加,这是一种比较麻烦的情况,我们维护一个cal函数,专门计算左面儿子v的值

  1. if(tr[ls].c>tr[rs].cut){
  2. tr[x].cut=tr[ls].cut;
  3. tr[x].v=tr[rs].v+ask(ls,tr[rs].cut);
  4. tr[x].c=tr[rs].c+tr[ls].c-tr[rs].cut;
  5. return ;
  6. }

cal函数具体实现很简单

当右儿子恰好够减,直接返回左儿子剩余

右儿子省的多,从右儿子的右儿子搜

右儿子不够,从左儿子搜

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define A 7200000
  5. #define ls x<<1
  6. #define rs x<<1|1
  7. #define py printf("****\n")
  8. struct tree{
  9. ll l,r,v,c,cut;
  10. }tr[A];
  11. ll ceng[A],cu[A];
  12. ll m,q;
  13. ll ask(ll x,ll c){
  14. // if(c==tr[x].c) return 0;
  15. if(tr[rs].c==c)
  16. return tr[x].v-tr[rs].v;
  17. else if(tr[rs].c>c)
  18. return tr[x].v-tr[rs].v+ask(rs,c);
  19. else return ask(ls,c-tr[rs].c+tr[rs].cut);
  20. }
  21. void pushup(ll x){
  22. if(tr[ls].c<=tr[rs].cut){
  23. tr[x].cut=tr[rs].cut-tr[ls].c+tr[ls].cut;
  24. tr[x].v=tr[rs].v;
  25. tr[x].c=tr[rs].c;
  26. return ;
  27. }
  28. if(tr[rs].cut==0){
  29. tr[x].v=tr[ls].v+tr[rs].v;
  30. tr[x].c=tr[ls].c+tr[rs].c;
  31. tr[x].cut=tr[ls].cut+tr[rs].cut;
  32. return ;
  33. }
  34. if(tr[ls].c>tr[rs].cut){
  35. tr[x].cut=tr[ls].cut;
  36. tr[x].v=tr[rs].v+ask(ls,tr[rs].cut);
  37. tr[x].c=tr[rs].c+tr[ls].c-tr[rs].cut;
  38. return ;
  39. }
  40. }
  41. void built(ll p,ll l,ll r){
  42. // printf("p=%lld l=%lld r=%lld\n",p,l,r);
  43. tr[p].l=l,tr[p].r=r;
  44. if(l==r){
  45. if(cu[l]) {
  46. tr[p].cut=ceng[l];
  47. tr[p].v=0,tr[p].c=0;
  48. return ;
  49. }
  50. if(!cu[l]){
  51. tr[p].v=ceng[l];
  52. tr[p].c=1;
  53. tr[p].cut=0;
  54. return ;
  55. }
  56. }
  57.  
  58. ll mid=(l+r)>>1;
  59. built(p<<1,l,mid);
  60. built(p<<1|1,mid+1,r);
  61. pushup(p);
  62. }
  63. void change(ll x,ll q){
  64. if(tr[x].l==tr[x].r){
  65. if(!cu[q]){
  66. tr[x].v=ceng[q];
  67. tr[x].c=1;
  68. tr[x].cut=0;
  69. return ;
  70. }
  71. else{
  72. tr[x].cut=ceng[q];
  73. tr[x].v=0,tr[x].c=0;
  74. return ;
  75. }
  76. }
  77. ll mid=(tr[x].l+tr[x].r)>>1;
  78. if(mid>=q)
  79. change(ls,q);
  80. else
  81. change(rs,q);
  82. pushup(x);
  83. }
  84. int main(){
  85. scanf("%lld%lld",&m,&q);
  86. for(ll i=1;i<=m;i++){
  87. scanf("%lld%lld",&cu[i],&ceng[i]);
  88. }
  89. built(1,1,m);
  90. // printf("tr.c .v=%lld %lld\n",tr[2].c,tr[2].v);
  91. // printf(".c=%lld v=%lld\n",tr[3].c,tr[3].v);
  92. // printf(".c=%lld\n",tr[1].v);
  93. for(ll i=1,a,b,c;i<=q;i++){
  94. scanf("%lld%lld%lld",&a,&b,&c);
  95. cu[a]=b;
  96. ceng[a]=c;
  97. change(1,a);
  98. // printf("p14 v=%lld c=%lld\n",tr[14].c,tr[14].v);
  99. printf("%lld\n",tr[1].v);
  100. }
  101. }

NOIP模拟测试16「Drink·blue·weed」的更多相关文章

  1. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  2. NOIP模拟测试30「return·one·magic」

    magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...

  3. NOIP模拟测试38「金·斯诺·赤」

    金 辗转相减见祖宗 高精 #include<bits/stdc++.h> using namespace std; #define A 2000 #define P 1 #define N ...

  4. NOIP模拟测试28「阴阳·虎·山洞」

    写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方 ...

  5. NOIP模拟测试20「周·任·飞」

    liu_runda出的题再次$\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%$ 任 题解 题目中为什么反复强调简单路径,没有环 没有环的图中点数-边数=联通块数 前缀和维护边 ...

  6. NOIP模拟测试23「mine·water·gcd」

    mine 题解 一道比较水的dp 考试因为初始化挂掉了只有$80$分 代码有注释 #include<bits/stdc++.h> using namespace std; //无脑dp # ...

  7. NOIP模拟测试9「随·单·题」

    liu_runda出的题,先$\%\%\%\%\%\%\%\%\%\%\%$为敬 随 考试时没有Qj 然后甚至没做,甚至没交 我不知道我怎么想的 这个题挺难改 你需要用到 循环矩阵快速幂,矩阵快速幂优 ...

  8. NOIP模拟测试4「礼物·通讯·奇袭」

    礼物. 首先见到期望一定要想dp,看到n的范围无脑想状压, 然后我就只想到这了. dp方程式还是比较好想的,但是我依然想不出来 略经思考   颓题解 依然不会,随便写了个式子 i状态中不含j $f[i ...

  9. 8.10 NOIP模拟测试16 Blue+Weed+Drink

    T1 Blue 贪心,每次跳得时候跳能跳到的最远的地方,跳过的就把他设为0,每次二分找到位置,一直跳就行,如果能跳到的位置就是当前位置或比当前位置还小(数组里现在呆着的这一块石头,二分得到的就是当前位 ...

随机推荐

  1. 『政善治』Postman工具 — 8、Postman中Pre-request Script的使用

    目录 1.Pre-request Script介绍 2.常用SNIPPETS(片段)说明 (1)获取变量脚本: (2)设置变量脚本: (3)清空变量脚本: (4)Send a request代码片段 ...

  2. C++逆向分析----虚函数与多层继承

    虚函数 C++通过关键字virtual来将函数声明为一个虚函数.当一个类包含虚函数后编译器就会给类的实例对象增加一个虚表指针,所谓的虚表指针就是指向虚表的指针.虚表就是一张地址表,它包含了这个类中所有 ...

  3. 使用find_if算法搜寻map的value

    // // main.cpp // map_find // // Created by PKU on 14-9-8. // Copyright (c) 2014年 PKU. All rights re ...

  4. Gradle的环境安装与配置

    本文是基于Windows环境对Gradle-6.6版本进行的安装配置. 简介 下载 安装 环境变量配置 开发工具配置 1.简介 Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持m ...

  5. [BD] Sqoop

    什么是Sqoop 数据交换工具(ETL):RDBMS(MySQL.Oracle等)<-->Sqoop<-->HDFS(HBase.Hive等) 基于JDBC 执行数据交换时,本 ...

  6. [刷题] 349 Intersection of Two Arrays

    查找问题 查找有无(只有键) 元素'a'是否存在 set(集合) 查找对应关系(键值对应) 元素'a'出现了几次 map(字典) set和map的底层实现是红黑树 常见操作 insert() find ...

  7. Zabbix 自定义report

    #!/bin/bash . /etc/profile logdir='/home/admin/zabbix/zabbix_log' mysql_host='localhost' mysql_user= ...

  8. 使用Wok管理kvm虚拟机

    [Centos7.4] !!!测试环境我们首关闭防火墙和selinux [root@localhost ~]# systemctl stop firewalld [root@localhost ~]# ...

  9. git使用简单教程-(转自linux人)

    什么是Git Git是目前世界上最先进的分布式版本控制系统.最初由Linus Torvalds编写,用作Linux内核代码的管理.如果你是windows用户,看到这里你可能会担心"是不是只能 ...

  10. Centos7 搭建prometheus+Grafana监控

    https://baijiahao.baidu.com/s?id=1676883786156871051&wfr=spider&for=pc node   scrape_configs ...