【娱乐性博客】警钟长鸣
1
2024年1月1日17点52分记
某人尝试速通Febonacci矩阵加速递推
定义结构体后没加分号
导致CE
若至错误调试耗时15分钟
PS:加上分号后无编译AC,当事人非常开心
以上,引以为戒
(附CE代码)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = ((ll)1e9+7) ;
struct Matrix
{
ll g[3][3];
void init()
{
for(int i=1;i<=2;i++)
{
g[i][i]=1;
}
}
void clear()
{
memset(g,0,sizeof(g));
}
}
Matrix operator* (Matrix a,Matrix b)
{
Matrix ans;
ans.clear();
for(int i=1;i<=2;i++)
{
for(int j=1;j<=2;j++)
{
for(int k=1;k<=2;k++)
{
ans.g[i][j]+=(a.g[i][k]*b.g[k][j])%mod;
ans.g[i][j]%=mod;
}
}
}
return ans;
}
Matrix qpow(Matrix a,ll n)
{
Matrix ans;
ans.clear();
ans.init();
while(n)
{
if(n&1)
{
ans=ans*a;
}
a=a*a;
n>>=1;
}
return ans;
}
int main()
{
ll n;
cin>>n;
if(n<=2)
{
cout<<1;
return 0;
}
n-=2;
Matrix origin;
origin.clear();
origin.g[1][1]=1;
origin.g[1][2]=1;
Matrix base;
base.clear();
base.g[1][1]=0;
base.g[1][2]=1;
base.g[2][1]=1;
base.g[2][2]=1;
Matrix output=qpow(base,n);
output=origin*output;
cout<<output.g[1][2];
return 0;
}
2
刚刚有个笨比做blog的时候手滑点到删除了
直接导致学习笔记导航页寄了
导航页寄了哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
索性丢的不是重要的东西,耗时2min补救完毕
以上,警示后人写博客一定要小心点鼠标
随笔终
3
正在完成线性基板子题
始终WA#2 #3 #4 #5
百思不得其解
遂撅洛谷讨论区,得前人警示:位运算记得打括号
补上括号,遂AC
以上,警钟长鸣
附WA代码
#include<bits/stdc++.h>
using namespace std;
#define ll unsigned long long
ll d[100];
int n;
void Insert(ll x)
{
for(int i=62;i>=1;i--)
{
if(!(x>>(i-1))) continue;
if(!d[i])
{
d[i]=x;
return ;
}
else
{
x^=d[i];
}
}
}
ll FindMax()
{
ll ans=d[62];
for(int i=62;i>=1;i--)
{
if(ans^d[i]>ans) //**事故多发地段**
{
ans^=d[i];
}
}
return ans;
}
int main()
{
// freopen("working.in","r",stdin);
// freopen("working.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
ll x;
cin>>x;
Insert(x);
}
cout<<FindMax();
return 0;
}
4
和质因数教初中生/小学生写c++基础
头铁,所以斐波那契就要用记忆化搜索
但是始终全WA
开long long WA
改结构WA
终把自己以前得代码撅出来,猛然发觉Febonacci数列近乎倍增,需要边模边算,遂解决,耻辱下课
以上,警示后人,没逝记得%%%%%%%口牙!
没有代码
5
2024年1月24日15点49分
正在完成高斯消元板子题
ALL # WA
翻出董晓逐行比对
一眼丁真
遂发现判断无解时括号打歪了
if(fabs(a[i][i]<eps))
蒸乌鱼
解决此问题耗时20min
以上,警示后人
附WA代码
#include<bits/stdc++.h>
using namespace std;
const double eps = 0.000001;
const int N = 105;
double a[N][N];
int n;
bool GaussJordan()
{
for(int i=1;i<=n;i++)
{
int r=i;
for(int k=i;k<=n;k++) if(fabs(a[k][i])>eps) {r=k;break;}
if(r!=i) swap(a[r],a[i]);
if(fabs(a[i][i]<eps)) return 0;//事故多发地段
for(int k=1;k<=n;k++)
{
if(k==i) continue;
double t=a[k][i]/a[i][i];
for(int j=i;j<=n+1;j++) a[k][j]-=t*a[i][j];
}
}
for(int i=1;i<=n;i++) a[i][n+1]/=a[i][i];
return 1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n+1;j++)
{
cin>>a[i][j];
}
}
if(GaussJordan())
{
for(int i=1;i<=n;i++)
{
printf("%.2lf\n",a[i][n+1]);
}
}
else
{
cout<<"No Solution";
}
return 0;
}
6
写二分图匹配匈牙利板子
洛谷 3386 WA #2
百思不得其解
翻看讨论区 并 ctrl f
发现同样情况的帖子
发现原因是函数内循环遍历的是左侧点
有如下感受
1.wssb
2.洛谷的数据怎么这么水
以上,警示后人
附WA 代码
#include<bits/stdc++.h>
using namespace std;
const int N= 505;
const int M= (int)5e4;
int n,m,c;
int g[505][505];
int match[N];
bool vis[N];
int ans;
bool Ntr(int u)
{
for(int i=1;i<=n;i++) //事故多发地段
{
if(g[u][i]==1 && !vis[i])
{
vis[i]=1;
if(!match[i] || Ntr(match[i]))
{
match[i]=u;
return 1;
}
}
}
return 0;
}
int main()
{
cin>>n>>m>>c;
for(int i=1;i<=c;i++)
{
int u,v;
scanf("%d%d",&u,&v);
g[u][v]=1;
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(Ntr(i)) ans++;
}
cout<<ans;
return 0;
}
7
受不了辣啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
调了半天原来是本来应该开int的数组开成了bool
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
问题我的解法还很怪,题解都没有我这么做的,也就是说没法找前人的警示
服了
以上,警示后人 开数组一定记得确认数据类型
附WA代码
#include<bits/stdc++.h>
using namespace std;
const int N = 205;
const int M = 205*205;
int n;
int idx;
int g[N][N];
int ans;
vector<int> lft;
vector<int> rit;
vector<int> e[N];
bool vis[M];
int match[M];
inline void Link(int u,int v)
{
if(u && v)
{
e[u].push_back(v);
cout<<u<<" "<<v<<endl;
}
}
bool Ntr(int u)
{
for(int v : e[u])
{
if(!vis[v])
{
vis[v]=1;
if(!match[v] || Ntr(match[v]))
{
match[v]=u;
return 1;
}
}
}
return 0;
}
int main()
{
cin>>n;
getchar();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
char ch=getchar();
if(ch=='0')
{
g[i][j]=++idx;
if((i^j)&1) lft.push_back(idx);
else rit.push_back(idx);
}
}
getchar();
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(g[i][j])
{
if(i-2>=1)
{
if(j-1>=1) Link(g[i][j],g[i-2][j-1]);
if(j+1<=n) Link(g[i][j],g[i-2][j+1]);
}
if(i-1>=1)
{
if(j-2>=1) Link(g[i][j],g[i-1][j-2]);
if(j+2<=n) Link(g[i][j],g[i-1][j+2]);
}
if(i+2<=n)
{
if(j-1>=1) Link(g[i][j],g[i+2][j-1]);
if(j+1<=n) Link(g[i][j],g[i+2][j+1]);
}
if(i+1<=n)
{
if(j-2>=1) Link(g[i][j],g[i+1][j-2]);
if(j+2<=n) Link(g[i][j],g[i+1][j+2]);
}
}
}
}
for(int u : lft)
{
for(int i=1;i<=idx;i++) vis[i]=0;
if (Ntr(u)) ans++;
}
cout<<idx-ans;
return 0;
}
8
网络流
建立虚拟源点汇点编号分别为0,n+1
然后初始化的时候从1到n....
调题调了两个小时
啊哈哈,被自己,蠢笑啦~
#include<bits/stdc++.h>
using namespace std;
const int N = 605;
const int M = 2505;
const int INF = (int)0x3f3f3f3f;
int edgeid=1;
int head[N];
struct edge
{
int v;
int w;
int nxt;
}e[N*N*2];
inline void addedge(int u,int v,int w)
{
edgeid++;
e[edgeid].v=v;
e[edgeid].w=w;
e[edgeid].nxt=head[u];
head[u]=edgeid;
}
queue<int> q[M];
int n,m;
int st,ed;
int c[M];
int dep[N];
int cur[N];
int ans;
queue<int> qq;
bool Bfs()
{
memset(dep,-1,sizeof(dep));
for(int i=0;i<=n+1;i++) cur[i]=head[i]; //事故地段
while(!qq.empty()) qq.pop();
qq.push(st);
dep[st]=0;
while(!qq.empty())
{
int u=qq.front();
qq.pop();
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(e[i].w && dep[v]==-1)
{
dep[v]=dep[u]+1;
// cout<<v<<" "<<dep[v]<<endl;
if(v==ed) return 1;
qq.push(v);
}
}
}
return 0;
}
int Dfs(int u,int rst)
{
if(!rst || (u==ed)) return rst;
int sum=0;
for(int i=cur[u];i;i=e[i].nxt)
{
int v=e[i].v;
cur[u]=i;
int f;
if(dep[v]==dep[u]+1 && (f=Dfs(v,min(rst,e[i].w))))
{
e[i].w-=f;
e[i^1].w+=f;
sum+=f;
rst-=f;
if(rst==0) break;//余量优化 常数
}
}
if(sum==0) dep[u]=0;//废点优化 常数
return sum;
}
void Dinic()
{
while(Bfs())
{
ans+=Dfs(st,INF);
}
}
int main()
{
// freopen("working.in","r",stdin);
cin>>m>>n;
st=0,ed=n+1;
for(int i=1;i<=m;i++) scanf("%d",&c[i]);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
for(int j=1;j<=x;j++)
{
int z;
scanf("%d",&z);
q[z].push(i);
}
scanf("%d",&x);
addedge(i,ed,x);
addedge(ed,i,0);
}
for(int i=1;i<=m;i++)
{
if(q[i].empty()) continue;
addedge(st,q[i].front(),c[i]);
addedge(q[i].front(),st,0);
int lst=q[i].front();
q[i].pop();
while(!q[i].empty())
{
addedge(lst,q[i].front(),INF);
addedge(q[i].front(),lst,0);
lst=q[i].front();
q[i].pop();
}
}
Dinic();
cout<<ans;
return 0;
}