话说这次考试

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);
else
printf("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);
}
}

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. .NET Core 对象( Transient、Scope、Singleton )生命周期详解 (对象创建以及释放)

    首先我们在VS2019中创建一个.NET Core的控制台程序,方便演示: 需要安装两个依赖包 Microsoft.Extensions.DependencyInjection 依赖注入对象的具体实现 ...

  2. InnoDB存储引擎简介

    前言: 存储引擎是数据库的核心,对于 MySQL 来说,存储引擎是以插件的形式运行的.虽然 MySQL 支持种类繁多的存储引擎,但最常用的当属 InnoDB 了,本篇文章将主要介绍 InnoDB 存储 ...

  3. Java开发人员最容易出现的几类错误

    一.把数组转成ArrayList List<String> list = Arrays.asList(arr); //以下带伪代码来自Arrays类中public static <T ...

  4. 设置vue全局配置

    全局配置 创建全局配置文件 vue.config.js 添加配置项

  5. [bug] org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    问题 原因不明,按参考文章中的做法,加了空格,clean后解决 参考 http://www.qishunwang.net/news_show_7922.aspx https://www.cnblogs ...

  6. [bug] IDEA中解决程序包javax.servlet不存在

    参考 https://blog.csdn.net/qq_41283865/article/details/81865806

  7. [Java] 类库例题

    例1 字符串操作 定义一个StringBuffer类对象,然后通过append()方法向对象中添加26个小写字母,每次只添加一次,共添加26次,然后按逆序方式输出,并且可以删除前5个字符 面向过程实现 ...

  8. 转圈 箭头 ⟳ 10227 27F3 刷新 HTML常用的特殊符号总结

    HTML常用的特殊符号总结 2014年9月12日 57621次浏览 html中经常会用到一些特殊符号,例如箭头,雪花,心形等等,这些符号就不用css样式或者图片来写了,直接用html特殊符号可以实现. ...

  9. Linux软件安装管理之——dpkg与apt-*详解 apt命令(dpkg和apt代替rpm)

    apt list *python* Nosee123关注赞赏支持   Linux软件安装管理之--dpkg与apt-*详解 [Linux软件安装管理系列]- - 传送门: - -<Linux软件 ...

  10. BogoMips 和cpu主频无关 不等于cpu频率

    http://tinylab.org/explore-linux-bogomips/ 内核探索:Linux BogoMips 探秘 Tao HongLiang 创作于 2015/05/12 打赏 By ...