NOIP2022 暴毙记
创业未半而中道崩殂
这大概就是我的最后一场比赛了,
长达两年的OI生涯在今天惨淡收场。 ——2022.11.26
Day -? 1
在CSP-S2022一轮中拿到了本弱市的rk1(87.5),自然在FJ获得了参加NOIP2022的资格。
Day -? 2
“没进队线就回来好好搞whk”他这么说。
我能怎么办,尽人事听天命,两周胡了百来道题,打印用了数百张纸,whk完全没听。
Day 0
靖城突然有了疫情(这鬼地方都能有疫情的吗),手机来不了了。
自驾去福州考试大概是弱校的特权吧。
考场在时代中学,但是5点才开放,先到附中看一下,见到了传说中的Win10考场。
在门口等了好久才进考场,出来的时候天都黑了。
这个键盘感觉要凉。
晚上补了一道点双,但是不小心写成了边双(RP都用在这上面了),拍了好久才发现问题。
Day1
早上起来默了一堆不可能考的板子。
键盘很卡,不习惯。
五分钟打完缺省源,开始看题。
T1题面看起来有点乱,手画了一下发现是裸的前缀和,30分钟才打完(最后一个样例有点意思)。
T2玩了半小时只玩出前30分,放弃先看T3
T3一眼边双后dp,有了昨天的经验10分钟就把点缩好了。计数的时候总是漏东漏西的,前前后后搞了1小时才过大样例。
继续玩T2,玩到了12:30,出来一堆没用的结论,感觉危,赶紧打了个贪心,最后一分钟过了编译。
结束了。
出来之后经提醒才发现T2没输出操作数,30分都没。
估记:
听说一堆
或许能成为本校第一个NOIP省一?(学校不认CSP-S)
没练过构造,总觉得T2是个纸老虎,但自己就是冲不出来,也因此一直没看T4。
感觉和自己的实力不大匹配,但练得少是这样的,也没什么好说的。
就这样结束了,之后没多少机会搞OI了。
如果有机会省选的话可能还会诈一下尸?不过没啥希望。
完蛋了,T3内存开了
upd:附代码
T1
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9')f=(c!='-'),c=getchar();
while(c>='0'&&c<='9')x=10*x+c-'0',c=getchar();
if(f)return x;return -x;
}
const int maxn=1050,mod=998244353;
int dn[maxn][maxn],rt[maxn][maxn],up[maxn][maxn],G[maxn][maxn];
int get(){
char c=getchar();
while(c!='0'&&c!='1')c=getchar();
return c=='1';
}
int n,m,c,f,ans1,ans2;
signed main(){
//freopen("plant.in","r",stdin);
//freopen("plant.out","w",stdout);
int T=read(),id=read();while(T--){
n=read(),m=read(),c=read(),f=read(),ans1=0,ans2=0;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)G[i][j]=get();
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--)if(!G[i][j]){
if(j!=m&&!G[i][j+1])rt[i][j]=rt[i][j+1]+1;
else rt[i][j]=0;
}
}
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++)if(!G[i][j]){
up[i][j]=rt[i][j];
if(i!=1&&!G[i-1][j])up[i][j]+=up[i-1][j];
}
}
for(int j=1;j<=m;j++){
for(int i=n;i>=1;i--)if(!G[i][j]){
if(i!=n&&!G[i+1][j])dn[i][j]=dn[i+1][j]+1;
else dn[i][j]=0;
}
}
for(int i=3;i<=n;i++)for(int j=1;j<=m;j++)if(!G[i][j]){
if(G[i-1][j]||G[i-2][j])continue;
ans1=(ans1+up[i-2][j]*rt[i][j]%mod)%mod;
ans2=(ans2+up[i-2][j]*rt[i][j]%mod*dn[i][j]%mod)%mod;
}
printf("%lld %lld\n",ans1*c%mod,ans2*f%mod);
}return 0;
}
T3 (数组开大抱零了,luogu可过)
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9')f=(c!='-'),c=getchar();
while(c>='0'&&c<='9')x=10*x+c-'0',c=getchar();
if(f)return x;return -x;
}
const int maxn=5e6+10,mod=1e9+7;
int n,m,qp[maxn];
//int qpow(int a,int x){int ans=1;while(x){if(x&1)ans=ans*a%mod;a=a*a%mod,x>>=1;}return ans;}
int cut[maxn],c[maxn],ans=1,sum=0,siz[maxn],cnt;
namespace TREE{
int head[maxn],ver[maxn],nxt[maxn],tot;
void add(int a,int b){ver[++tot]=b,nxt[tot]=head[a],head[a]=tot;}
#define fore(u,i) for(int i=head[u];i;i=nxt[i])
int f[maxn],g[maxn],son[maxn];
void dfs(int u,int fa){
f[u]=qp[siz[u]],g[u]=qp[siz[u]],son[u]=1;
fore(u,i)if(ver[i]!=fa){
dfs(ver[i],u);son[u]+=son[ver[i]];
f[u]=(__int128)f[u]*(g[ver[i]]+qp[son[ver[i]]])%mod;
g[u]=((__int128)g[u]*(g[ver[i]]+qp[son[ver[i]]])%mod)%mod;
}
fore(u,i)if(ver[i]!=fa)f[u]=(f[u]-(__int128)g[ver[i]]*qp[son[u]-son[ver[i]]-1]%mod+mod)%mod;f[u]=(f[u]-qp[son[u]-1]+mod)%mod;
g[u]=(g[u]-qp[son[u]-1]+mod)%mod;
sum=(sum+(__int128)f[u]*qp[cnt-son[u]]%mod)%mod;
}
void work(){dfs(1,1);ans=(__int128)ans*sum%mod;}
}
namespace GRA{
int head[maxn],ver[maxn],nxt[maxn],tot=1;
void add(int a,int b){ver[++tot]=b,nxt[tot]=head[a],head[a]=tot;}
void link(int a,int b){add(a,b);add(b,a);}
#define fore(u,i) for(int i=head[u];i;i=nxt[i])
int dfn[maxn],low[maxn],idx;
void tarjan(int u,int edge){
dfn[u]=low[u]=++idx;
fore(u,i)if(i!=edge)if(!dfn[ver[i]]){
tarjan(ver[i],i^1);low[u]=min(low[u],low[ver[i]]);
if(low[ver[i]]>dfn[u])cut[i]=cut[i^1]=1;
}else low[u]=min(low[u],dfn[ver[i]]);
}
int vis[maxn];
void dfs(int u,int cc){c[u]=cc;vis[u]=1;fore(u,i)if(!cut[i]&&!vis[ver[i]])dfs(ver[i],cc);}
void build(){
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,0);
for(int i=1;i<=n;i++)if(!vis[i])dfs(i,++cnt);
for(int u=1;u<=n;u++){siz[c[u]]++;fore(u,i)if(cut[i])TREE::add(c[u],c[ver[i]]);}
for(int i=2;i<=tot;i+=2)if(!cut[i])ans=ans*2%mod;
}
}
signed main(){
freopen("barrack.in","r",stdin);
freopen("barrack.out","w",stdout);
while(1);
n=read(),m=read();for(int i=1;i<=m;i++)GRA::link(read(),read());
qp[0]=1;for(int i=1;i<=m;i++)qp[i]=qp[i-1]*2%mod;
GRA::build();TREE::work();
return printf("%lld",(long long)ans),0;
}