NOIP模拟测试16「Drink·blue·weed」

话说这次考试

 

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+循环展开

 代码

#include<bits/stdc++.h>
using namespace std;
#define ll int
#define A 2100
char a[A][A];
ll n,m,k;
const int L=1<<20|1;
char buffer[L],*S,*T;
#define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T))?EOF:*S++)
const int maxn=100000+5;
inline int read(){register int ret;register char r;while(r=getchar(),r<'0'||r>'9');ret=r-48;while(r=getchar(),r>='0'&&r<='9')ret=ret*10+r-48;return ret;
}
int main(){n=read(),m=read(),k=read();for(ll i=1;i<=n;i++)for(ll j=1;j<=m;j++){register int ret;char r=getchar();while(!isdigit(r)) r=getchar();a[i][j]=r;}for(ll j=1,x,y,c,xl,yl;j<=k;j++){x=read(),y=read(),c=read();xl=x+c-1,yl=y+c-1;while(c>1){    for(ll i=0;i<=c-2;i++){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];a[x][y+i]=a1,a[x+i][yl]=a2,a[xl][yl-i]=a3,a[xl-i][y]=a4;}x++,y++,yl--,xl--,c-=2;}}for(ll i=1;i<=n;i++,puts(""))for(ll j=1;j<=m;j++){putchar(a[i][j]);putchar(' ');}
}

blue

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

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

代码

#include<bits/stdc++.h>
using namespace std;
#define A 5010101
#define Inf 10000000ll
#define ll long long
#define py printf("*****\n")
#define mem(a) memset(a,0,sizeof(a))
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];
ll n,m,tot=1,S,T,t,D,L,sz,rt;
set<ll> s;
inline ll read(){ll f=1,x=0;char c=getchar();while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return f*x;
}
inline void clear(ll x)
{ch[x][0]=ch[x][1]=key[x]=cnt[x]=fa[x]=size[x]=0;
}
inline bool get(ll x)
{return ch[fa[x]][1]==x;
}
inline void pushup(ll x)
{if(x){size[x]=cnt[x];if(ch[x][1]) size[x]+=size[ch[x][1]];if(ch[x][0]) size[x]+=size[ch[x][0]];}
}
inline void rotate(ll x)
{ll old=fa[x],oldfa=fa[old],which=get(x);ch[old][which]=ch[x][which^1]; fa[ch[old][which]]=old;ch[x][which^1]=old; fa[old]=x;fa[x]=oldfa;if(oldfa) ch[oldfa][ch[oldfa][1]==old]=x;pushup(old);pushup(x); return ;
}
inline void splay(ll x)
{for(ll f;f=fa[x];rotate(x))if(fa[f])rotate(get(f)==get(x)?f:x);rt=x;
} 
inline ll pre()
{if(cnt[rt]>1) return rt;ll now=ch[rt][0];while(ch[now][1]) now=ch[now][1];return now;
}
inline ll nxt()
{    if(cnt[rt]>1)return rt;ll now=ch[rt][1];while(ch[now][0]) now=ch[now][0];return now;
}
inline void insert(ll x)
{if(rt==0){sz++;rt=sz;cnt[sz]=size[sz]=1;key[sz]=x;fa[sz]=ch[sz][0]=ch[sz][1]=0;return ;}ll f=0,now=rt;while(233){    if(key[now]==x){cnt[now]++;pushup(now);pushup(f);splay(now);return ;}f=now,now=ch[now][key[now]<x];if(now==0){sz++;cnt[sz]=size[sz]=1;key[sz]=x;fa[sz]=f;ch[sz][1]=ch[sz][0]=0;ch[f][key[f]<x]=sz;pushup(f);splay(sz);return ;}}
}
inline ll rnk(ll x)
{ll ans=1,now=rt;while(1){if(x<key[now])now=ch[now][0];else{ans+=size[ch[now][0]];if(x==key[now]){splay(now);return ans;}ans+=cnt[now];now=ch[now][1];}}
}
inline void del(ll x)
{rnk(x);if(cnt[rt]>1){cnt[rt]--;pushup(rt);return ;} if(!ch[rt][0]&&!ch[rt][1]){clear(rt);rt=0;return ;}if(!ch[rt][0]||!ch[rt][1]){ll old=rt;rt=ch[rt][1]|ch[rt][0];clear(old);fa[rt]=0;return ;}ll older=rt; ll leftbigest=pre();splay(leftbigest);ch[rt][1]=ch[older][1];fa[ch[older][1]]=rt;clear(older);pushup(rt);
}
void re(){memset(ch,0,sizeof(ch));memset(size,0,sizeof(size));memset(key,0,sizeof(key));memset(fa,0,sizeof(fa));
}
int main()
{
set<ll>::iterator it;scanf("%lld",&t);while(t--){n=read(),m=read(),D=read(),L=read();s.clear();s.insert(-0x7ffffff);for(ll i=1;i<=n;i++){a[i]=read();
//            insert(a[i]);
            s.insert(a[i]);}ll ok=1,cnt=0;while(ok){ll now=0;while(now<L){if(now+D>=L) break;
//                insert(now+D);
//                ll x=pre();
//                del(now+D);ll x=*--s.upper_bound(now+D);
//                printf("x=%lld  cnt=%lld\n",x,cnt);if(x<now){ok=0;break;}
//                now=key[x];now=x;s.erase(x);
//                del(key[x]);
            }if(ok==0) break;cnt++;if(cnt==m) break;}if(cnt!=m)printf("%lld\n",cnt);elseprintf("Excited\n");}
}

weed

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

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

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

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

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

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

直接无脑加即可

    if(tr[rs].cut==0){tr[x].v=tr[ls].v+tr[rs].v;tr[x].c=tr[ls].c+tr[rs].c;tr[x].cut=tr[ls].cut+tr[rs].cut;return ;}

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

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

    if(tr[ls].c<=tr[rs].cut){tr[x].cut=tr[rs].cut-tr[ls].c+tr[ls].cut;tr[x].v=tr[rs].v;tr[x].c=tr[rs].c;return ;}

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

    if(tr[ls].c>tr[rs].cut){tr[x].cut=tr[ls].cut;tr[x].v=tr[rs].v+ask(ls,tr[rs].cut);tr[x].c=tr[rs].c+tr[ls].c-tr[rs].cut;return ;}

cal函数具体实现很简单

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

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

右儿子不够,从左儿子搜

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 7200000
#define ls x<<1
#define rs x<<1|1
#define py printf("****\n")
struct tree{ll l,r,v,c,cut;
}tr[A];
ll ceng[A],cu[A];
ll m,q;
ll ask(ll x,ll c){
//    if(c==tr[x].c) return 0;if(tr[rs].c==c)return tr[x].v-tr[rs].v;else if(tr[rs].c>c)return tr[x].v-tr[rs].v+ask(rs,c);else  return ask(ls,c-tr[rs].c+tr[rs].cut);
}
void pushup(ll x){if(tr[ls].c<=tr[rs].cut){tr[x].cut=tr[rs].cut-tr[ls].c+tr[ls].cut;tr[x].v=tr[rs].v;tr[x].c=tr[rs].c;return ;}if(tr[rs].cut==0){tr[x].v=tr[ls].v+tr[rs].v;tr[x].c=tr[ls].c+tr[rs].c;tr[x].cut=tr[ls].cut+tr[rs].cut;return ;}if(tr[ls].c>tr[rs].cut){tr[x].cut=tr[ls].cut;tr[x].v=tr[rs].v+ask(ls,tr[rs].cut);tr[x].c=tr[rs].c+tr[ls].c-tr[rs].cut;return ;}
}
void built(ll p,ll l,ll r){
//    printf("p=%lld l=%lld r=%lld\n",p,l,r);tr[p].l=l,tr[p].r=r;if(l==r){if(cu[l]) {tr[p].cut=ceng[l];tr[p].v=0,tr[p].c=0;return ;}if(!cu[l]){tr[p].v=ceng[l];tr[p].c=1;tr[p].cut=0;return ;}}ll mid=(l+r)>>1;built(p<<1,l,mid);built(p<<1|1,mid+1,r);pushup(p);
}
void change(ll x,ll q){if(tr[x].l==tr[x].r){if(!cu[q]){tr[x].v=ceng[q];tr[x].c=1;tr[x].cut=0;return ;}else{tr[x].cut=ceng[q];tr[x].v=0,tr[x].c=0;return ;}}ll mid=(tr[x].l+tr[x].r)>>1;if(mid>=q)change(ls,q);else change(rs,q);pushup(x);
}
int main(){scanf("%lld%lld",&m,&q);for(ll i=1;i<=m;i++){scanf("%lld%lld",&cu[i],&ceng[i]);}built(1,1,m);
//    printf("tr.c .v=%lld  %lld\n",tr[2].c,tr[2].v);
//    printf(".c=%lld v=%lld\n",tr[3].c,tr[3].v);
//    printf(".c=%lld\n",tr[1].v);for(ll i=1,a,b,c;i<=q;i++){scanf("%lld%lld%lld",&a,&b,&c);cu[a]=b;ceng[a]=c;change(1,a);
//        printf("p14 v=%lld c=%lld\n",tr[14].c,tr[14].v);printf("%lld\n",tr[1].v);}
}

 

转载于:https://www.cnblogs.com/znsbc-13/p/11332552.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot Web Slice测试–示例

春天开机推出 测试切片而回&#xff0c;它已经采取了一些时间来解决它我的头&#xff0c;并探讨一些细微的差别。 背景 使用此功能的主要原因是减少样板。 考虑一个看起来像这样的控制器&#xff0c;仅适用于使用Kotlin编写的各种控制器。 RestController RequestMapping(&qu…

DECODE函数

DECODE函数相当于一条件语句(IF),它将输入数值与函数中的参数列表相比较&#xff0c;根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然&#xff0c;如果未能与任何一个实参序偶匹配成功&#xff0c;则函数也有默认的返回值。区别于…

多线程练习

写两个线程&#xff0c;其中一个线程打印1-52&#xff0c;另一个线程打印A-Z&#xff0c;打印顺序应该是12A34B56C......5152Z。 该习题需要用到多线程通信的知识。 思路分析&#xff1a; 把打印数字的线程称为线程N&#xff0c;打印字母的线程称为线程L. 1.线程N完成打印后&am…

java jee curd_Java / JEE中的有效日志记录–映射的诊断上下文

java jee curd这一切始于当我和一位同事坐在一起解决一些应用程序问题时&#xff0c;当我注意到一些有趣的事情时。 他正在合并代码&#xff0c;我的眼睛吸引了此类“ org.apache.log4j.MDC”的注意。 这导致了以下发现&#xff1a; 什么是MDC&#xff1f; MDC代表“ 映射诊断…

Learning Cocos2d-x for WP8(7)——让Sprite动起来

C#(wp7)兄弟篇Learning Cocos2d-x for XNA&#xff08;7&#xff09;——让Sprite动起来 本讲将详细介绍Cocos2d-x游戏中动画Animate的创建方式&#xff0c;通过逐帧数组播放动画和创建动画集合播放动画&#xff0c;比较两者的异同&#xff0c;让Sprite动起来。 工程文件&#…

GWT的渐进式Web应用程序配方

渐进或不渐进… 如果您一段时间以来一直在设计或开发Web应用程序&#xff0c;那么您可能会遇到无数次“渐进式Web应用程序”一词&#xff0c;并且在未来几年内可能会这样做。 您可能想知道PWA的确切定义是什么&#xff0c;如何识别PWA&#xff0c;以及如何构建PWA。 根据字典&a…

问题 1047: [编程入门]报数问题

题目描述有n人围成一圈&#xff0c;顺序排号。从第1个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人退出圈子&#xff0c;问最后留下的是原来的第几号的那位。输入初始人数n输出最后一人的初始编号样例输入3 样例输出2分析&#xff1a;因为每次报3都会…

NOIP模拟测试17「入阵曲·将军令·星空」

入阵曲 题解 应用了一种美妙移项思想&#xff0c; 我们先考虑在一维上的做法 维护前缀和$(sum[r]-sum[l-1])\%k0$可以转化为 $sum[r]\% ksum[l-1]\%k$开个桶维护一下即可 然后拓展到二维上 把两行之间所有行拍扁看作一维上的区间&#xff0c; 我们枚举两行和行之间所有列开个桶…

理解sizeof

1、sizeof返回的是字节个数&#xff0c;内存编址的最小单元是字节。因此&#xff0c;空对象&#xff0c;bool值占用的内存也是一个字节。 2、可以对哪些东西求sizeof ? a、对象和类型。如int a; sizeof(a)&#xff0c; sizeof(int)&#xff0c;二者是等价的。同一类型的对象&a…

java 分析java死锁_Java死锁示例–如何分析死锁情况

java 分析java死锁死锁是两个线程或多个线程永远被阻塞的编程情况&#xff0c;这种情况发生在至少两个线程和两个或更多资源的情况下。 在这里&#xff0c;我编写了一个简单的程序&#xff0c;它将导致死锁情况&#xff0c;然后我们将看到如何对其进行分析。 Java死锁示例 pac…

insert 多条数据 并且具有唯一标识符

DECLARE COUNT INT DECLARE NAME NVARCHAR(10) SET COUNT0 WHILE COUNT<1000 BEGIN SET NAMESYSTEMCAST(COUNT AS NVARCHAR(10)) INSERT INTO dbo.users VALUES (NEWID(),NAME,123123COUNT,DATEADD(DAY,COUNT,2012-12-12),GETDATE()) SET COUNT COUNT 1 END 转载于:http…

Java Message System简介

Java消息系统 在本文中&#xff0c;我将讨论面向消息的中间件 &#xff08;MOM&#xff09;以及JMS如何在Enterprise Java中实现它。 另外&#xff0c;我将讨论适合JMS使用的典型用例以及用于讨论消息传递解决方案的不同术语&#xff0c;例如Publisher / Sender &#xff0c; D…

FLV协议5分钟入门浅析

FLV协议简介 FLV&#xff08;Flash Video&#xff09;是一种流媒体格式&#xff0c;因其体积小、协议相对简单&#xff0c;很快便流行开来&#xff0c;并得到广泛的支持。 常见的HTTP-FLV直播协议&#xff0c;就是使用HTTP流式传输通过FLV封装的音视频数据。对想要了解HTTP-FLV…

问题 1049: [编程入门]结构体之时间设计

题目描述定义一个结构体变量&#xff08;包括年、月、日&#xff09;。计算该日在本年中是第几天&#xff0c;注意闰年问题。输入年月日输出当年第几天样例输入2000 12 31 样例输出366 import java.util.Scanner; public class Main{ public static void main(String args[]){ …

反序列化 jackson_使用Jackson和Super类型令牌的Json反序列化

反序列化 jacksonDatatables是一个jquery插件&#xff0c;用于显示表格信息–它可以增强简单的表或可以使用基于AJAX的数据并以表格形式显示信息。 数据表要​​求来自服务器的数据遵循特定的JSON格式才能在屏幕上显示。 考虑要显示Member实体列表的情况&#xff0c;那么Membe…

NOIP模拟测试18「引子·可爱宝贝精灵·相互再归的鹅妈妈」

待补 引子 题解 大模拟&#xff0c;注意细节 代码1 #include<bits/stdc.h> using namespace std; int n,m;char a[1005][1005];bool vst[1005][1005]; void solve(int na,int nb) {int ina,jnb,now0;while(1){j;if(a[na][j])break;}while(1){i;if(a[i][nb])break;}for(in…

GC解释:收集器概述

当前版本的HotSpot JVM包括三种类型的垃圾收集器&#xff1a; –串行收集器 –并行收集器 –多数同时收集者 它们都是世代的&#xff0c;这意味着它们利用了堆的划分方式 。 垃圾收集器负责三个主要操作&#xff1a; –查找不再使用的对象 –释放这些对象之后的内存 –…

数据结构之排序五:选择排序

def selectedSort(myList):#获取list的长度length len(myList)#一共进行多少轮比较for i in range(0,length-1):#默认设置最小值得index为当前值smallest i#用当先最小index的值分别与后面的值进行比较,以便获取最小indexfor j in range(i1,length):#如果找到比当前值小的ind…

C#代码规范

1. 引言 本文是一套面向C# programmer 和C# developer 进行开发所应遵循的开发规范。 按照此规范来开发C#程序可带来以下益处&#xff1a; 代码的编写保持一致性&#xff0c; 提高代码的可读性和可维护性&#xff0c; 在团队开发一个项目的情况下&a…

谷歌guava_使用Google Guava进行馆藏创建和不变性

谷歌guava因此&#xff0c;我想看看番石榴提供的一些集合创建模式&#xff0c;以及它提供的某些不可变集合类型。 如果您没有看过我以前的文章&#xff0c;则可能要从这里开始&#xff1a; 番石榴第1部分– MultiMaps 番石榴第2部分– BiMaps 番石榴第3部分–多组 Guava的…