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 🈚\)