10.【2024初三集训模拟测试2】
2024初三集训模拟测试2
- 不会有人比本蒟蒻更蒻了
。
T1小P的2048
- 本来是道原题,可以在
秒内 ,但是突然改题了。然后一分没得(一坤小时白打了)。 秒 了 之后总分凭空增加 分。
题解
- 没啥好说的,
你。 - 分四个方向讨论,先合并同类项,之后再进行移动,最后统计空格子,进行插入新值。
- 记录一下
数组,假如发现 与 相同,则说明无法操作。 - 具体的看代码吧
。
代码
#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子集
- 叕是唯一得到的分。
题解
的分很好得,输出 并从 输出到 即可。 为偶数的分也很好得,一大一小组合即可。 的分也很好得,输出 即可。- 对于
为偶数, 为奇数的情况,可以证明无解。
设
化简得
最后得出
因此无法平均分配,则无解。
- 之后就得到
的好成绩。 - 对于
, 都为奇数的情况,应该怎么办呢?(打表。 ) - 先看看
, 的情况。
- 再看看
, 的情况。
- 最后看看
, 的情况。
- 感觉打表找规律是最简单的(
蒟蒻没有打表的时候怎么也没想明白)。 - 也就是说,第一列从
到 直接排。 - 到第二列时定义
,之后小于 为 ,大于 为 。 - 到第三列时,就可以根据前两列以及前三个数的和来求出了。
- 再往后,就可以按照偶数的情况排列了!
- 之后就愉快的
了
代码
#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混凝土粉末
- 小信未孚,神芙芙也——芙宁娜
题解
- 用一个下标为询问时间的树状数组,用扫描线化简一维,用来维护混凝土实时高度。
- 相当于让混凝土当前高度变成一维,只关注当前横坐标的历史高度,之后二分查找
使该坐标被覆盖的第一个时间,或者无解。 - 时间复杂度
代码
#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排水系统
- 小信未孚,神芙芙也——芙卡洛斯
题解
代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】