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

话说这次考试

Drink

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

真的很棒

前置卡常知识

1.char要比int快

char是最快的

输出putchar,输入getchar

快了7000豪

2.read

快读非常棒,让你变得更快

3.循环展开

循环展开非常棒,虽然看上去没什么用,然而循环展开往往是使你从T到A的关键

扫描二维码关注公众号,回复: 6999902 查看本文章

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

猜你喜欢

转载自www.cnblogs.com/znsbc-13/p/11332552.html