10.【2024初三集训模拟测试2】

\(\Huge打了一场模拟赛,又垫底了。qwq\)

2024初三集训模拟测试2

  • 不会有人比本蒟蒻更蒻了 \(qwq\)

T1小P的2048

\(0pts\) \(\Large⚓⚓⚓\) \(\Large🌚🗿🗿🌝\) \(\Huge🔯\)

  • 本来是道原题,可以在 \(30\) 秒内 \(AC\) ,但是突然改题了。然后一分没得(一坤小时白打了)。\(\Large🚾\)
  • \(Shadow\) \(40\)\(A\)\(T1\) 之后总分凭空增加 \(100\) 分。

题解 \(\Huge 🈶\)

  • 没啥好说的, \(\Huge\%\) 你。
  • 分四个方向讨论,先合并同类项,之后再进行移动,最后统计空格子,进行插入新值。
  • 记录一下 \(last\) 数组,假如发现 \(last\)\(now\) 相同,则说明无法操作。
  • 具体的看代码吧 \(qwq\)

代码 \(\Huge 🈶\)

#include<bits/stdc++.h>
//#define int long long
#define N (1000010)
#define I i
#define J j
#define itn int
#define Int int
#define sort stable_sort
using namespace std;
namespace IO
{
    #define ll long long
    const int MAX=1<<12;
    char buf[MAX],*p1=buf,*p2=buf;
    char obuf[MAX],*o=obuf;
    #define gc()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<12,stdin),p1==p2)?EOF:*p1++)
    //template<typename T>
    //inline T read()
    inline int read()
    {
        int x=0;bool f=1;
        char c=gc();
        for(;c<48||c>57;c=gc())if(c=='-')f=0;
        for(;c>=48&&c<=57;c=gc())x=(x<<3)+(x<<1)+(c^48);
        return f?x:~x+1;
    }
    void print(ll x){if(x>9)print(x/10);*o++=(x%10)+'0';}
    void pit(ll x){if(x<0)*o++='-',x=~x+1;print(x);}
    void write(ll x,char ed){pit(x);*o++=ed;}
    void flush(){fwrite(obuf,o-obuf,1,stdout);}
    #undef ll
}
using IO::read;using IO::write;using IO::flush;using std::complex;
inline int min(int x,int y){return y&((y-x)>>31)|x&(~(y-x)>>31);}
inline int max(int x,int y){return x&((y-x)>>31)|y&(~(y-x)>>31);}
inline void swap(int &x,int &y){int tmp=x;x=y;y=tmp;}
long long n,m;
void init_set()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
}
int fontaine;
int x,y,xx,yy,z,tot;
int genshin_impact;
int kamisato_ayaka[12][12];
int las[12][12];
signed main()
{
    init_set();
    n=read();m=read();
    x=read();y=read();
    kamisato_ayaka[x][y]=read();
    xx=read();yy=read();
    kamisato_ayaka[xx][yy]=read();
    genshin_impact=n*n-2;
    if(x==xx&&y==yy)genshin_impact=n*n-1;
    for(int t(1);t<=m;++t)
    {
        x=read(),y=read(),z=read();
        for(int i(1);i<=n;++i)
            for(int j(1);j<=n;++j)
                las[i][j]=kamisato_ayaka[i][j];
        if(x==0)
        {
            for(int i(1);i<=n;++i)
                for(int j(1),k(2);j<=n&&k<=n;++k)
                {
                    for(;!kamisato_ayaka[k][i]&&k<n;++k);//跳过空格
                    if(kamisato_ayaka[j][i]==kamisato_ayaka[k][i]&&kamisato_ayaka[j][i])//这俩相同
                        kamisato_ayaka[k][i]<<=1,
                        fontaine+=kamisato_ayaka[k][i],
                        ++genshin_impact,
                        kamisato_ayaka[j][i]=0;
                        
                    else j=k;
                }
            for(int i(1);i<=n;++i)
                for(int j(1),k(1);j<=n;++j,++k)
                {
                    for(;!kamisato_ayaka[j][i]&&j<n;++j);
                    kamisato_ayaka[k][i]=kamisato_ayaka[j][i];
                    if(j!=k)kamisato_ayaka[j][i]=0;
                }
        }
        else if(x==1)
        {
            for(int i(1);i<=n;++i)
                for(int j(n),k(n-1);j>=1&&k>=1;--k)
                {
                    for(;!kamisato_ayaka[k][i]&&k>1;--k);
                    if(kamisato_ayaka[j][i]==kamisato_ayaka[k][i]&&kamisato_ayaka[j][i])
                        kamisato_ayaka[k][i]<<=1,
                        fontaine+=kamisato_ayaka[k][i],
                        ++genshin_impact,
                        kamisato_ayaka[j][i]=0;
                    else j=k;
                }
            for(int i(1);i<=n;++i)
                for(int j(n),k(n);j>=1&&k>=1;--j,--k)
                {
                    for(;!kamisato_ayaka[j][i]&&j>1;--j);
                    kamisato_ayaka[k][i]=kamisato_ayaka[j][i];
                    if(j!=k)kamisato_ayaka[j][i]=0;
                }
        }
        else if(x==2)
        {
            for(int j(1);j<=n;++j)
                for(int i(1),k(2);i<=n&&k<=n;++k)
                {
                    for(;!kamisato_ayaka[j][k]&&k<n;++k);
                    if(kamisato_ayaka[j][i]==kamisato_ayaka[j][k]&&kamisato_ayaka[j][i])
                        kamisato_ayaka[j][k]<<=1,
                        fontaine+=kamisato_ayaka[j][k],
                        ++genshin_impact,
                        kamisato_ayaka[j][i]=0;
                    else i=k;
                }
            for(int j(1);j<=n;++j)
                for(int i(1),k(1);i<=n&&k<=n;++i,++k)
                {
                    for(;!kamisato_ayaka[j][i]&&i<n;++i);
                    kamisato_ayaka[j][k]=kamisato_ayaka[j][i];
                    if(i!=k)kamisato_ayaka[j][i]=0;
                }
        }
        else
        {
            for(int j(1);j<=n;++j)
                for(int i(n),k(n-1);i>=1&&k>=1;--k)
                {
                    for(;!kamisato_ayaka[j][k]&&k>1;--k);
                    if(kamisato_ayaka[j][i]==kamisato_ayaka[j][k]&&kamisato_ayaka[j][i])
                        kamisato_ayaka[j][k]<<=1,
                        fontaine+=kamisato_ayaka[j][k],
                        ++genshin_impact,
                        kamisato_ayaka[j][i]=0;
                    else i=k;
                }
            for(int j(1);j<=n;++j)
                for(int i(n),k(n);i>=1&&k>=1;--i,--k)
                {
                    for(;!kamisato_ayaka[j][i]&&i>1;--i);
                    kamisato_ayaka[j][k]=kamisato_ayaka[j][i];
                    if(i!=k)kamisato_ayaka[j][i]=0;
                }
        }
        bool gssa=0,tiao=0;
        for(int i(1);i<=n;++i)
        {
            for(int j(1);j<=n;++j)
            {
                if(kamisato_ayaka[i][j]!=las[i][j]){tiao=1;break;}
                if(i==n&&j==n){write(t-1,'\n'),gssa=1;break;}
            }
            if(gssa)break;
            if(tiao)break;
        }
        if(gssa)break;
        tot=0;
        y%=genshin_impact;++y;
        for(int i(1);i<=n;++i)
        {
            for(int j(1);j<=n;++j)
            {
                if(!kamisato_ayaka[i][j])++tot;
                if(tot==y)
                {
                    kamisato_ayaka[i][j]=z,
                    --genshin_impact;
                    break;
                }
            }
            if(tot==y)break;
        }
        if(t==m)write(t,'\n');
    }
    write(fontaine,'\n');
    flush();
    return 0;
}

T2子集

\(25pts\)

  • 叕是唯一得到的分。

题解 \(\Huge 🈶\)

  • \(k=1\) 的分很好得,输出 \(Yes\) 并从 \(1\) 输出到 \(n\) 即可。
  • \(\dfrac nk\) 为偶数的分也很好得,一大一小组合即可。
  • \(n=k\&n\not=1\) 的分也很好得,输出 \(No\) 即可。
  • 对于 \(n\) 为偶数, \(\dfrac nk\) 为奇数的情况,可以证明无解。

\(S\) 为每组数的和, \(k=2a\) , \(\dfrac nk=2b+1\) ,则 $$S=\frac{(2a(2b+1)+1)2a(2b+1)}{2\times 2a}$$

化简得 $$S=\frac {(4ab+2a+1)(4ab+2a)}{4a}$$

最后得出 $$S=4ab^2+4ab+a+b+\frac 12$$

因此无法平均分配,则无解。

  • 之后就得到 \(25pts\) 的好成绩。
  • 对于 \(n\)\(m\) 都为奇数的情况,应该怎么办呢?(打表 \(qwq\)
  • 先看看 \(n=15\)\(k=5\) 的情况。
\(1\) \(2\) \(3\) \(Sum\)
\(1\) \(8\) \(15\) \(24\)
\(2\) \(9\) \(13\) \(24\)
\(3\) \(10\) \(11\) \(24\)
\(4\) \(6\) \(14\) \(24\)
\(5\) \(7\) \(12\) \(24\)
  • 再看看 \(n=15\)\(k=3\) 的情况。
\(1\) \(2\) \(3\) \(4\) \(5\) \(Sum\)
\(1\) \(5\) \(9\) \(15\) \(10\) \(40\)
\(2\) \(6\) \(7\) \(14\) \(11\) \(40\)
\(3\) \(4\) \(8\) \(13\) \(12\) \(40\)
  • 最后看看 \(n=45\)\(k=9\) 的情况。
\(1\) \(2\) \(3\) \(4\) \(5\) \(Sum\)
\(1\) \(14\) \(27\) \(45\) \(28\) \(115\)
\(2\) \(15\) \(25\) \(44\) \(29\) \(115\)
\(3\) \(16\) \(23\) \(43\) \(30\) \(115\)
\(4\) \(17\) \(21\) \(42\) \(31\) \(115\)
\(5\) \(18\) \(19\) \(41\) \(32\) \(115\)
\(6\) \(10\) \(26\) \(40\) \(33\) \(115\)
\(7\) \(11\) \(24\) \(39\) \(34\) \(115\)
\(8\) \(12\) \(22\) \(38\) \(35\) \(115\)
\(9\) \(13\) \(20\) \(37\) \(36\) \(115\)
  • 感觉打表找规律是最简单的(蒟蒻没有打表的时候怎么也没想明白)。
  • 也就是说,第一列从 \(1\)\(n\) 直接排。
  • 到第二列时定义 \(mid=\dfrac{k+1}2\) ,之后小于 \(mid\)\(i+k+mid-1\) ,大于 \(mid\)\(i+mid-1\)
  • 到第三列时,就可以根据前两列以及前三个数的和来求出了。
  • 再往后,就可以按照偶数的情况排列了!
  • 之后就愉快的 \(AC\)\(qwq\)

代码 \(\Huge 🈶\)

#include<bits/stdc++.h>
//#define int long long
#define N (1000010)
#define I i
#define J j
#define itn int
#define Int int
#define sort stable_sort
using namespace std;
namespace IO
{
    #define ll long long
    const int MAX=1<<24;
    char buf[MAX],*p1=buf,*p2=buf;
    char obuf[MAX],*o=obuf;
    #define gc()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<24,stdin),p1==p2)?EOF:*p1++)
    //template<typename T>
    //inline T read()
    inline int read()
    {
        int x=0;bool f=1;
        char c=gc();
        for(;c<48||c>57;c=gc())if(c=='-')f=0;
        for(;c>=48&&c<=57;c=gc())x=(x<<3)+(x<<1)+(c^48);
        return f?x:~x+1;
    }
    void print(ll x){if(x>9)print(x/10);*o++=(x%10)+'0';}
    void pit(ll x){if(x<0)*o++='-',x=~x+1;print(x);}
    void write(ll x,char ed){pit(x);*o++=ed;}
    void flush(){fwrite(obuf,o-obuf,1,stdout);}
    #undef ll
}
using IO::read;using IO::write;using IO::flush;using std::complex;
inline int min(int x,int y){return y&((y-x)>>31)|x&(~(y-x)>>31);}
inline int max(int x,int y){return x&((y-x)>>31)|y&(~(y-x)>>31);}
inline void swap(int &x,int &y){int tmp=x;x=y;y=tmp;}
long long n,m;
void init_set()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
}
int genshin_impact;
vector<signed>honkai_star_rail[1000010];
signed main()
{
    init_set();
    for(int t(read());t;--t)
    {
        n=read();m=read();
        if(m==1)
        {
            *IO::o++='Y',*IO::o++='e',*IO::o++='s',*IO::o++='\n';
            for(int i(1);i<=n;++i)write(i,' ');
            *IO::o++='\n';
        }
        else if(n==m)*IO::o++='N',*IO::o++='o',*IO::o++='\n';
        else if(!(n&1)&&((n/m)&1))*IO::o++='N',*IO::o++='o',*IO::o++='\n';
        else
        {
            *IO::o++='Y',*IO::o++='e',*IO::o++='s',*IO::o++='\n';
            if(!((n/m)&1))
                for(int i(1);i<=(n>>1);++i)
                {
                    write(i,' '),write(n-i+1,' ');
                    if(!(i%((n/m)>>1)))*IO::o++='\n';
                }
            else
            {
                int mid(m+1>>1);
                genshin_impact=((m*3+1)>>1)*(m*3)/m;
                for(int i(1);i<=m;++i)
                    honkai_star_rail[i].push_back(i);
                for(int i(1);i<=m;++i)
                    if(i<=mid)
                        honkai_star_rail[i].push_back(m+(m>>1)+i);
                    else 
                        honkai_star_rail[i].push_back((m>>1)+i);
                for(int i(1);i<=m;++i)
                    honkai_star_rail[i].push_back(genshin_impact-honkai_star_rail[i][0]-honkai_star_rail[i][1]);
                for(int j(1),cnt=(m*3);j<=m&&cnt<n;++j)
                    for(int i(1);i<=(n/m-3)>>1;++i)
                        honkai_star_rail[j].push_back(n-cnt+m*3),
                        honkai_star_rail[j].push_back(++cnt);
                for(int i(1);i<=m;++i)
                {
                    for(int j:honkai_star_rail[i])
                        write(j,' ');
                    *IO::o++='\n';
                }
                for(int i(1);i<=m;++i)
                    honkai_star_rail[i].clear();
            }
        }
    }
    flush();
    return 0;
}

T3混凝土粉末

\(0pts\)

  • 小信未孚,神芙芙也——芙宁娜

题解 \(\Huge 🈶\)

  • 用一个下标为询问时间的树状数组,用扫描线化简一维,用来维护混凝土实时高度。
  • 相当于让混凝土当前高度变成一维,只关注当前横坐标的历史高度,之后二分查找 \(\Large🉑\) 使该坐标被覆盖的第一个时间,或者无解。
  • 时间复杂度 \(O(n\log q\log q)\)

代码 \(\Huge 🈶\)

#include<bits/stdc++.h>
#define int long long
#define N (1000010)
#define I i
#define J j
#define raed read
#define reaD read
#define reAD read
#define rEAD read
#define READ read
#define REAd read
#define REad read
#define Read read
#define Reda read
#define redA read
#define reDA read
#define redA read
#define itn signed
#define Itn signed
#define ITN signed
#define Int signed
#define INT signed
#define foR for
#define fot for
#define foT for
#define sort stable_sort
using namespace std;
namespace IO
{
    #define ll long long
    const int MAX=1<<24;
    char buf[MAX],*p1=buf,*p2=buf;
    char obuf[MAX],*o=obuf;
    #define gc()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<24,stdin),p1==p2)?EOF:*p1++)
    //template<typename T>
    //inline T read()
    inline int read()
    {
        int x=0;bool f=1;
        char c=gc();
        for(;c<48||c>57;c=gc())if(c=='-')f=0;
        for(;c>=48&&c<=57;c=gc())x=(x<<3)+(x<<1)+(c^48);
        return f?x:~x+1;
    }
    void print(ll x){if(x>9)print(x/10);*o++=(x%10)+'0';}
    void pit(ll x){if(x<0)*o++='-',x=~x+1;print(x);}
    void write(ll x,char ed){pit(x);*o++=ed;}
    void flush(){fwrite(obuf,o-obuf,1,stdout);}
    #undef ll
}
using IO::read;using IO::write;using IO::flush;using std::complex;
inline int min(int x,int y){return y&((y-x)>>31)|x&(~(y-x)>>31);}
inline int max(int x,int y){return x&((y-x)>>31)|y&(~(y-x)>>31);}
inline void swap(int &x,int &y){int tmp=x;x=y;y=tmp;}
long long n,m;
void init_set()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
}
int tot,ans,x,y,z,l,r,v;
int c[2000010];
short honkai[2000010];
struct bb{int id,x;};
vector<bb>furina[2000010],fucaros[2000010];
int fontaine[2000010];
inline int lowbit(int x){return x&(~x+1);}
inline void add(int x,int v)
{for(;x<=m;x+=lowbit(x))c[x]+=v;}
int query(int x)
{
    int ans=0;
    for(;x;x-=lowbit(x))ans+=c[x];
    return ans;
}
signed main()
{
    init_set();
    n=read(),m=read();
    for(signed i(1);i<=m;++i)
    {
        honkai[i]=read(),l=read(),r=read();
        if(honkai[i]==1)
            v=read(),
            furina[l].push_back({i,v}),//区间始
            furina[r+1].push_back({i,~v+1});//区间终
            //差分,修改只在区间内有效
        else
            fucaros[l].push_back({i,r});
            //记录询问位置与时间。
    }
    for(signed i(1);i<=n;++i)
    {
        for(bb j:furina[i])add(j.id,j.x);//修改到树状数组中(长高或变矮)
        for(bb j:fucaros[i])
        {
            l=1,r=j.id;//二分查找在这段时间内高度最早达到的时间(或者此时达不到)
            fontaine[j.id]=0;//答案
            //由于树状数组维护的是高度叠加的和,
            //也就是位置 i 到时间 mid 为止所有历史高度,具有单调性,可以二分查找。
            for(;l<=r;)
            {
                int mid((l+r)>>1);
                if(query(mid)<j.x)l=mid+1;
                else fontaine[j.id]=mid,r=mid-1;
            }
        }
    }
    for(signed i(1);i<=m;++i)
        if(honkai[i]==2)
            write(fontaine[i],'\n');
    flush();
    return 0;
}

T4排水系统

\(0pts\)

  • 小信未孚,神芙芙也——芙卡洛斯

题解 \(\Huge 🈚\)

代码 \(\Huge 🈚\)

posted @ 2024-02-20 09:57  minecraft114514  阅读(26)  评论(2编辑  收藏  举报