chess草稿(附代码!)
2022/8/12日过了,代码如下:(已删除调试语句,保留注释,为了使代码更容易看懂并没有卡常。卡完常的代码不是给人看的)
点击查看代码
/*
倒序操作+合并连通块+维护集合,支持合并、区间查询+线段树合并
*/
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e6+50;
void InOut(int op)
{
freopen("chess.in","r",stdin);
if(op)
freopen("chess.out","w",stdout);
}
int N,M,Q;
bool Can(int x,int y)
{
if(x<1||y<1||x>N||y>M)
return false;
return true;
}
int ALL;//N*M
int Edge[4][MAXN<<1];
int Ans[MAXN];
struct Node
{
int Color,Level,x,y,Id;
}Piece[MAXN];
bool CanEat(Node a,Node b)//a CanEat b
{
if(a.Color!=b.Color&&a.Level>=b.Level)
return true;
return false;
}
bool cmp1(Node a,Node b)
{
if(a.Level==b.Level)
return a.Id<b.Id;
return a.Level<b.Level;
}
bool cmp2(Node a,Node b)
{
return a.Id<b.Id;
}
void LSHLevel()
{
sort(Piece+1,Piece+Q+1,cmp1);
for(int i=1;i<=Q;i++)
{
Piece[i].Level=i;
}
sort(Piece+1,Piece+Q+1,cmp2);
}
int HaveNode[MAXN];
int GetId(int op,int x,int y)//0:从上到下一行一行 :左右连续 1:从左到右一列一列 ,上下连续
{
if(op==0)
return (x-1)*M+y;
else
return (y-1)*N+x;
}
int GetX(int Id)
{
return (Id-1)/M+1;
}
int GetY(int Id)
{
return (Id-1)%M+1;
}
struct SegmentTree
{
int Root[MAXN];
int ls[MAXN<<2],rs[MAXN<<2],Size[MAXN<<2];
int CntId;
void Init()
{
memset(Root,0,sizeof(Root));
for(int i=1;i<=CntId;i++)
{
ls[i]=rs[i]=Size[i]=0;
}
CntId=0;
}
int Merge(int u1,int u2,int l,int r)
{
if(u1&&u2)
{
if(u1==u2)
return u1;
}
if(!u1||!u2)
{
return u1+u2;
}
if(l==r)
{
Size[u1]=max(Size[u1],Size[u2]);
return u1;
}
int Mid=l+r>>1;
ls[u1]=Merge(ls[u1],ls[u2],l,Mid);
rs[u1]=Merge(rs[u1],rs[u2],Mid+1,r);
Size[u1]=Size[ls[u1]]+Size[rs[u1]];
return u1;
}
void Insert(int &u,int l,int r,int x)
{
if(u==0)
{
u=++CntId;
}
if(l==r)
{
Size[u]=1;
return;
}
int Mid=l+r>>1;
if(x<=Mid)
Insert(ls[u],l,Mid,x);
else
Insert(rs[u],Mid+1,r,x);
Size[u]=Size[ls[u]]+Size[rs[u]];
}
void Delete(int &u,int l,int r,int x)
{
if(u==0)
{
return;
}
if(l==r)
{
Size[u]=0;
return;
}
int Mid=l+r>>1;
if(x<=Mid)
Delete(ls[u],l,Mid,x);
else
Delete(rs[u],Mid+1,r,x);
Size[u]=Size[ls[u]]+Size[rs[u]];
}
int Query(int u,int l,int r,int x,int y)
{
if(!u)
return 0;
if(x<=l&&r<=y)
{
return Size[u];
}
int Mid=l+r>>1,Sum=0;
if(x<=Mid&&y>=l)
Sum+=Query(ls[u],l,Mid,x,y);
if(x<=r&&y>=Mid+1)
Sum+=Query(rs[u],Mid+1,r,x,y);
return Sum;
}
bool Query(int u,int l,int r,int x)
{
if(u==0)
{
return false;
}
if(l==r)
{
if(Size[u])
return true;
else
return false;
}
int Mid=l+r>>1;
if(x<=Mid)
return Query(ls[u],l,Mid,x);
else
return Query(rs[u],Mid+1,r,x);
}
}trId[2],trLevel[2];//Id:0横1竖,Level[x]代表Color=x
void Insert1(int x,int y,int z)//(x,y)这个空点插入编号为z的连通块
{
trId[0].Insert(trId[0].Root[z],1,ALL,GetId(0,x,y));
trId[1].Insert(trId[1].Root[z],1,ALL,GetId(1,x,y));
}
void Insert2(int Nodeid,int z)//第Nodeid颗棋子插入编号为z的连通块
{
trLevel[Piece[Nodeid].Color].Insert(trLevel[0].Root[z],1,ALL,Piece[Nodeid].Level);
}
struct BingChaJi
{
int father[MAXN],Min[MAXN],Max[MAXN];//father都要用到,Min和Max只在维护横竖线的时候用到
void Init()
{
for(int i=1;i<=ALL;i++)
{
father[i]=i;
Min[i]=1e9;Max[i]=0;
}
}
int getfather(int x)
{
if(x!=father[x])
father[x]=getfather(father[x]);
return father[x];
}
void Merge(int x,int y)//x是father,y是son
{
int fx=getfather(x),fy=getfather(y);
if(fx==fy)
return;
father[fy]=fx;
}
}Set[3];//Set[0]:连通块,Set[1]:横,Set[2]:竖
void Init()
{
memset(Edge,0,sizeof(Edge));
memset(Ans,0,sizeof(Ans));
memset(HaveNode,0,sizeof(HaveNode));
trId[0].Init();
trId[1].Init();
trLevel[0].Init();
trLevel[1].Init();
Set[0].Init();
Set[1].Init();
Set[2].Init();
}
char opt[MAXN];
int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1};//对应Edge,上下左右
//方向op要比Edgeop大1,但相对位置不变
//竖着的GetId要想好是0还是1,因为Edge永远都是0
bool vis[MAXN];
int Mergedfs(int op,int x,int y,int fa)
{
if(op==4)
{
vis[GetId(0,x,y)]=true;
if(HaveNode[GetId(0,x,y+1)]==0&&Can(x,y+1)&&Edge[3][GetId(0,x,y)]==2)
{
Set[1].Merge(Set[1].getfather(GetId(0,x,fa)),Set[1].getfather(GetId(0,x,y+1)));
return Mergedfs(op,x,y+1,fa);
}
else
{
return y;
}
}
if(op==2)
{
vis[GetId(0,x,y)]=true;
if(HaveNode[GetId(0,x+1,y)]==0&&Can(x+1,y)&&Edge[1][GetId(0,x,y)]==2)
{
Set[2].Merge(Set[2].getfather(GetId(0,fa,y)),Set[2].getfather(GetId(0,x+1,y)));
return Mergedfs(op,x+1,y,fa);
}
else
{
return x;
}
}
}
//Id线段树是1-ALL,Level线段树是1-Q
void dfs3(int x,int y,int fx,int fy)
{
vis[GetId(0,x,y)]=true;
trId[0].Insert(trId[0].Root[GetId(0,fx,fy)],1,ALL,GetId(0,x,y));
trId[1].Insert(trId[1].Root[GetId(0,fx,fy)],1,ALL,GetId(1,x,y));//线段树只是记录竖编号,Root还是统一横编号!
for(int i=0;i<4;i++)
{
if(Edge[i][GetId(0,x,y)]==3&&vis[GetId(0,x+dx[i+1],y+dy[i+1])]==false)
{
if(HaveNode[GetId(0,x+dx[i+1],y+dy[i+1])]==0)
{
Set[0].Merge(Set[0].getfather(GetId(0,fx,fy)),Set[0].getfather(GetId(0,x+dx[i+1],y+dy[i+1])));
dfs3(x+dx[i+1],y+dy[i+1],fx,fy);
}
else
{
int t=HaveNode[GetId(0,x+dx[i+1],y+dy[i+1])];
trLevel[Piece[t].Color].Insert(trLevel[Piece[t].Color].Root[GetId(0,fx,fy)],1,Q,Piece[t].Level);
}
}
}
}
void Read()
{
scanf("%d%d%d",&N,&M,&Q);
ALL=N*M;
Init();
for(int i=1;i<=N;i++)
{
scanf("%s",&opt[1]);
for(int j=1;j<M;j++)
{
//opt[j]表示(i,j)至(i,j+1)的边
Edge[3][GetId(0,i,j)]=Edge[2][GetId(0,i,j+1)]=opt[j]-'0';
}
}
for(int i=1;i<N;i++)
{
scanf("%s",&opt[1]);
for(int j=1;j<=M;j++)
{
Edge[0][GetId(0,i+1,j)]=Edge[1][GetId(0,i,j)]=opt[j]-'0';
}
}
for(int i=1;i<=Q;i++)
{
scanf("%d%d%d%d",&Piece[i].Color,&Piece[i].Level,&Piece[i].x,&Piece[i].y);
Piece[i].Id=i;
HaveNode[GetId(0,Piece[i].x,Piece[i].y)]=i;
}
}
//除了trId[1]要用GetId(1)外其它都用GetId(0)
int SolveEdge1(Node Now)
{
int ans=0;
int fx=Set[0].getfather(GetId(0,Now.x,Now.y));
for(int i=0;i<4;i++)
{
if(Edge[i][GetId(0,Now.x,Now.y)]==1)
{
if(HaveNode[GetId(0,Now.x+dx[i+1],Now.y+dy[i+1])]==0)//旁边空格
{
if(trId[0].Query(trId[0].Root[fx],1,ALL,GetId(0,Now.x+dx[i+1],Now.y+dy[i+1]))==false)//空格,走3走不到
{
ans++;
}
}
else
{
if(CanEat(Now,Piece[HaveNode[GetId(0,Now.x+dx[i+1],Now.y+dy[i+1])]]))
{
int NowColor=Piece[HaveNode[GetId(0,Now.x+dx[i+1],Now.y+dy[i+1])]].Color,NowLevel=Piece[HaveNode[GetId(0,Now.x+dx[i+1],Now.y+dy[i+1])]].Level;
if(trLevel[NowColor].Query(trLevel[NowColor].Root[fx],1,Q,NowLevel)==false)//吃子,走3吃不到
{
ans++;
}
}
}
}
}
return ans;
}
vector<int>Eatid;
int SolveEdge2(Node Now)
{
int ans=0;
int l1,r1,l2,r2;//l1-r1横,l2-r2竖
l1=Set[1].Min[Set[1].getfather(GetId(0,Now.x,Now.y))];
r1=Set[1].Max[Set[1].getfather(GetId(0,Now.x,Now.y))];
l2=Set[2].Min[Set[2].getfather(GetId(0,Now.x,Now.y))];
r2=Set[2].Max[Set[2].getfather(GetId(0,Now.x,Now.y))];
int fx=Set[0].getfather(GetId(0,Now.x,Now.y));
//空格:能不能被3走到
ans+=r1-l1+1-trId[0].Query(trId[0].Root[fx],1,ALL,GetId(0,Now.x,l1),GetId(0,Now.x,r1));//因为先Delete,所以trId包含了自身,而r1-l1+1刚好包含了自身,所以消掉了
ans+=r2-l2+1-trId[1].Query(trId[1].Root[fx],1,ALL,GetId(1,l2,Now.y),GetId(1,r2,Now.y));
//吃子:最多4颗,能不能被3吃到
Eatid.clear();
if(Edge[2][GetId(0,Now.x,l1)]==2)//能往左边走(不是边界,却不是l1,则说明是有棋子)
Eatid.push_back(GetId(0,Now.x,l1-1));
if(Edge[3][GetId(0,Now.x,r1)]==2)
Eatid.push_back(GetId(0,Now.x,r1+1));
if(Edge[0][GetId(0,l2,Now.y)]==2)
Eatid.push_back(GetId(0,l2-1,Now.y));
if(Edge[1][GetId(0,r2,Now.y)]==2)
Eatid.push_back(GetId(0,r2+1,Now.y));
for(int i=0;i<Eatid.size();i++)
{
if(CanEat(Now,Piece[HaveNode[Eatid[i]]]))
{
int NowColor=Piece[HaveNode[Eatid[i]]].Color,NowLevel=Piece[HaveNode[Eatid[i]]].Level;
if(trLevel[NowColor].Query(trLevel[NowColor].Root[fx],1,Q,NowLevel)==false)
{
ans++;
}
}
}
return ans;
}
int SolveEdge3(Node Now)
{
int ans=0;
int fx=Set[0].getfather(GetId(0,Now.x,Now.y));
ans+=trId[0].Size[trId[0].Root[fx]]-trId[0].Query(trId[0].Root[fx],1,ALL,GetId(0,Now.x,Now.y));
ans+=trLevel[Now.Color^1].Query(trLevel[Now.Color^1].Root[fx],1,Q,1,Now.Level-1);
return ans;
}
vector<int>E2,E3;
void Del(Node Now)
{
HaveNode[GetId(0,Now.x,Now.y)]=0;
E3.clear();
for(int i=0;i<4;i++)
{
if(Edge[i][GetId(0,Now.x,Now.y)]==3)
{
E3.push_back(GetId(0,Now.x+dx[i+1],Now.y+dy[i+1]));
}
}
int ffx=Set[0].getfather(GetId(0,Now.x,Now.y));
trId[0].Insert(trId[0].Root[ffx],1,ALL,GetId(0,Now.x,Now.y));
trId[1].Insert(trId[1].Root[ffx],1,ALL,GetId(1,Now.x,Now.y));
for(int i=0;i<E3.size();i++)
{
int fx=Set[0].getfather(GetId(0,Now.x,Now.y)),fy=Set[0].getfather(E3[i]);
if(HaveNode[E3[i]])
{
int NowColor=Piece[HaveNode[E3[i]]].Color,NowLevel=Piece[HaveNode[E3[i]]].Level;
trLevel[NowColor].Insert(trLevel[NowColor].Root[fx],1,Q,NowLevel);
continue;
}
if(trId[0].Size[trId[0].Root[fy]])
trId[0].Root[fx]=trId[0].Merge(trId[0].Root[fx],trId[0].Root[fy],1,ALL);
if(trId[1].Size[trId[1].Root[fy]])
trId[1].Root[fx]=trId[1].Merge(trId[1].Root[fx],trId[1].Root[fy],1,ALL);
if(trLevel[0].Size[trLevel[0].Root[fy]])
trLevel[0].Root[fx]=trLevel[0].Merge(trLevel[0].Root[fx],trLevel[0].Root[fy],1,Q);
if(trLevel[1].Size[trLevel[1].Root[fy]])
trLevel[1].Root[fx]=trLevel[1].Merge(trLevel[1].Root[fx],trLevel[1].Root[fy],1,Q);
Set[0].Merge(fx,fy);
}
trLevel[Now.Color].Delete(trLevel[Now.Color].Root[ffx],1,Q,Now.Level);
//从可以被吃的点变成可以被走过的空格
if(Edge[0][GetId(0,Now.x,Now.y)]==Edge[1][GetId(0,Now.x,Now.y)]&&Edge[0][GetId(0,Now.x,Now.y)]==2&&HaveNode[GetId(0,Now.x-1,Now.y)]==0&&HaveNode[GetId(0,Now.x+1,Now.y)]==0)
{
int fx=Set[2].getfather(GetId(0,Now.x-1,Now.y)),fy=Set[2].getfather(GetId(0,Now.x+1,Now.y));
Set[2].Max[fx]=max(Set[2].Max[fx],Set[2].Max[fy]);//可以直接赋值,这样保险
Set[2].Min[fx]=min(Set[2].Min[fx],Set[2].Min[fy]);//肯定转移不了
Set[2].Merge(fx,fy);
Set[2].Merge(Set[2].getfather(GetId(0,Now.x-1,Now.y)),Set[2].getfather(GetId(0,Now.x,Now.y)));
}
else
{
if(Edge[0][GetId(0,Now.x,Now.y)]==2&&HaveNode[GetId(0,Now.x-1,Now.y)]==0)
{
Set[2].Merge(Set[2].getfather(GetId(0,Now.x-1,Now.y)),Set[2].getfather(GetId(0,Now.x,Now.y)));
Set[2].Max[Set[2].getfather(GetId(0,Now.x-1,Now.y))]=Now.x;
}
else
{
if(Edge[1][GetId(0,Now.x,Now.y)]==2&&HaveNode[GetId(0,Now.x+1,Now.y)]==0)
{
Set[2].Merge(Set[2].getfather(GetId(0,Now.x+1,Now.y)),Set[2].getfather(GetId(0,Now.x,Now.y)));
Set[2].Min[Set[2].getfather(GetId(0,Now.x+1,Now.y))]=Now.x;
}
else
{
Set[2].Min[GetId(0,Now.x,Now.y)]=Set[2].Max[GetId(0,Now.x,Now.y)]=Now.x;
}
}
}
if(Edge[2][GetId(0,Now.x,Now.y)]==Edge[3][GetId(0,Now.x,Now.y)]&&Edge[2][GetId(0,Now.x,Now.y)]==2&&HaveNode[GetId(0,Now.x,Now.y-1)]==0&&HaveNode[GetId(0,Now.x,Now.y+1)]==0)
{
int fx=Set[1].getfather(GetId(0,Now.x,Now.y-1)),fy=Set[1].getfather(GetId(0,Now.x,Now.y+1));
Set[1].Max[fx]=max(Set[1].Max[fx],Set[1].Max[fy]);
Set[1].Min[fx]=min(Set[1].Min[fx],Set[1].Min[fy]);
Set[1].Merge(fx,fy);
Set[1].Merge(Set[1].getfather(GetId(0,Now.x,Now.y-1)),Set[1].getfather(GetId(0,Now.x,Now.y)));
}
else
{
if(Edge[2][GetId(0,Now.x,Now.y)]==2&&HaveNode[GetId(0,Now.x,Now.y-1)]==0)
{
Set[1].Merge(Set[1].getfather(GetId(0,Now.x,Now.y-1)),Set[1].getfather(GetId(0,Now.x,Now.y)));
Set[1].Max[Set[1].getfather(GetId(0,Now.x,Now.y-1))]=Now.y;
}
else
{
if(Edge[3][GetId(0,Now.x,Now.y)]==2&&HaveNode[GetId(0,Now.x,Now.y+1)]==0)
{
Set[1].Merge(Set[1].getfather(GetId(0,Now.x,Now.y+1)),Set[1].getfather(GetId(0,Now.x,Now.y)));
Set[1].Min[Set[1].getfather(GetId(0,Now.x,Now.y+1))]=Now.y;
}
else
{
Set[1].Min[GetId(0,Now.x,Now.y)]=Set[1].Max[GetId(0,Now.x,Now.y)]=Now.y;
}
}
}
}
void Solve()
{
Read();
LSHLevel();
//预处理:
//2类边:
for(int i=1;i<=ALL;i++)
vis[i]=false;
//横:
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
if(HaveNode[GetId(0,i,j)]==0&&vis[GetId(0,i,j)]==0)
{
Set[1].Min[GetId(0,i,j)]=j;
Set[1].Max[GetId(0,i,j)]=Mergedfs(4,i,j,j);
}
}
}
//竖:
for(int i=1;i<=ALL;i++)
vis[i]=false;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
if(HaveNode[GetId(0,i,j)]==0&&vis[GetId(0,i,j)]==0)
{
Set[2].Min[GetId(0,i,j)]=i;
Set[2].Max[GetId(0,i,j)]=Mergedfs(2,i,j,i);
}
}
}
//3类边:
for(int i=1;i<=ALL;i++)
vis[i]=false;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
if(vis[GetId(0,i,j)]==0&&HaveNode[GetId(0,i,j)]==0)
{
dfs3(i,j,i,j);
}
}
}
//开始模拟
for(int i=Q;i>=1;i--)
{
Del(Piece[i]);
Ans[i]=SolveEdge1(Piece[i])+
SolveEdge2(Piece[i])+
SolveEdge3(Piece[i]);
}
for(int i=1;i<=Q;i++)
{
printf("%d\n",Ans[i]);
}
}
int main()
{
InOut(1);
int T;
scanf("%d",&T);
while(T--)
{
Solve();
}
}
草稿,而不是题解
chess:大体思路
棋盘行数:N
棋盘列数:M
边的类型:(0类)不能走,(1类)走一步,(2类)一直朝同方向走,(3类)随便走
棋子 颜色:0,1
棋子 个数:Q
棋子等级:[1,Q]
走子规则:只能走同一条边
吃子规则: 颜色不同,等级小于等于的棋子可以吃
求:放上一个棋子,能走到多少个位置
不吃子时:
倒着来看,先算当前棋子的答案:
1:3类边答案
2:去重
1类边:枚举这条边能到的4个点的id,线段树查一下有没有,没有则ans++
2类边:维护当前能到的最远点,左右横着编号,上下竖着编号(下一步就是边界或棋子,不包含下一步)
3类边:维护连通块,每次算完一个棋子都要合并-->如何合并?
去重:3类边开2个动态开点线段树,一个代表横着编号,一个代表竖着编号
- 枚举周围1类边不在编号线段树里的点有多少个
- 枚举2对方向,对于横着的方向,能走的有最左...左一格,右一格...最右,=r-l 然后在线段树横着那一棵查询[l,r]区间内的和,减去
- 加上2线段树的根节点和
注意两棵线段树均不包含当前讨论的点,题目要求不含当前点。
更新图的状态:
开 2 棵线段树,表示当前连通块能走到的白点的Level,黑点的Level(权值线段树)
把当前点周围能到达的不同的联通块对应的(4棵)线段树分别合并起来
并查集维护连通块编号。
2类边:并查集,维护最左最右、最上最下。删掉当前点后最多合并2次
综上:
4棵线段树:横着编号连通块,竖着编号连通块,连通块白点Level,连通块黑点Level(找的时候找严格小于当前讨论点的Level 的)
3个并查集:连通块,最左最右编号,最上最下编号
规定细节:最左最右最上最下编号不包含有棋子的点,即不能吃。吃棋子单独讨论,跟颜色线段树进行去重
编号线段树不包含可以吃的子
颜色线段树只能包含可以吃的子
删掉当前子之后合并出来的编号线段树要包含当前点,颜色线段树要去掉当前点
预处理:
把所有棋子放上去,预处理出:
找到极长横(竖)线,此段的father都是左边那个,然后Min都是左边,Max都是右边
合并的时候Min为左边(上面)的Min,Max为右边(下面)的Max
father[右(上)根]=左(下)根
找到每一个连通块,合并
对于每一个放棋子的点,看看周围的连通块,周围的连通块的线段树更新此点
chess草稿(附代码!)的更多相关文章
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...
- 分享5种风格的 jQuery 分页效果【附代码】
jPaginate 是一款非常精致的分页插件,提供了五种不同风格的分页效果,支持鼠标悬停翻页,快速分页功能.这款插件还提供了丰富的配置选项,你可以根据需要进行设置. 效果演示 源码下载 各个 ...
- Python进阶:函数式编程实例(附代码)
Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...
- c#万能视频播放器(附代码)
原文:c#万能视频播放器(附代码) c#万能视频播放器 本人之前很多的文章中均提到了使用libvlc为播放器内核制作的播放器,也许有些朋友对此感兴趣,于是我用c#写了一个调用libvlc api实现的 ...
- python德国信用评分卡建模(附代码AAA推荐)
欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 python信用评分卡建模视频系列教程(附代码) 博主录制 https://study.163.com/course/i ...
- 十图详解tensorflow数据读取机制(附代码)转知乎
十图详解tensorflow数据读取机制(附代码) - 何之源的文章 - 知乎 https://zhuanlan.zhihu.com/p/27238630
- 【转】- 从FM推演各深度CTR预估模型(附代码)
从FM推演各深度CTR预估模型(附代码) 2018年07月13日 15:04:34 阅读数:584 作者: 龙心尘 && 寒小阳 时间:2018年7月 出处: 龙心尘 寒小阳
- 数据挖掘领域十大经典算法之—C4.5算法(超详细附代码)
https://blog.csdn.net/fuqiuai/article/details/79456971 相关文章: 数据挖掘领域十大经典算法之—K-Means算法(超详细附代码) ...
- 【独家】阿里天池IJCAI17大赛第四名方案全解析(附代码)
[独家]阿里天池IJCAI17大赛第四名方案全解析(附代码) https://mp.weixin.qq.com/s?__biz=MzAxMzA2MDYxMw==&mid=2651560625& ...
- 球体的双目视觉定位(matlab,附代码)
球体的双目视觉定位(matlab,附代码) 标签(空格分隔): 机器视觉 引言 双目视觉定位是我们的一个课程设计,最近刚做完,拿出来与大家分享一下,实验的目的是在拍摄的照片中识别球体,并求出该球体到相 ...
随机推荐
- 当我把ChatGPT拉进群聊里,我的朋友都玩疯了
前言 近期ChatGPT可以说是太火了,问答.写论文.写诗.写代码,只要输入精确的prompt,他的表现总是让人惊喜.本着打不过就加入的原则.要是把ChatGPT拉入群聊中,会是怎样一番场景?说做就做 ...
- Spring Data Redis 框架
系统性学习,移步IT-BLOG 一.简介 对于类似于首页这种每天都有大量的人访问,对数据库造成很大的压力,严重时可能导致瘫痪.解决方法:一种是数据缓存.一种是网页静态化.今天就讨论数据缓存的实现 Re ...
- ASP.NET Core - 选项系统之源码介绍
.NET Core 选项系统的主要实现在 Microsoft.Extensions.Options 和 Microsoft.Extensions.Options.ConfigurationExtens ...
- 开发一个二方包,优雅地为系统接入ELK(elasticsearch+logstash+kibana)
去年公司由于不断发展,内部自研系统越来越多,所以后来搭建了一个日志收集平台,并将日志收集功能以二方包形式引入各个自研系统,避免每个自研系统都要建立一套自己的日志模块,节约了开发时间,管理起来也更加容易 ...
- 企业什么喜欢做电视看板,电视看板浏览网页的必备工具 电视看板浏览器 电视看板自动打开网页 电视看板必备APP
企业喜欢做电视看板主要是因为它可以提供以下几个方面的优势: 增强企业形象:电视看板可以将企业的信息和广告以更加生动.直观的方式呈现出来,提高企业形象和知名度. 提高工作效率:电视看板可以在企业内部作为 ...
- pandas之sorting排序
Pands 提供了两种排序方法,分别是按标签排序和按数值排序.本节讲解 Pandas 的排序操作.下面创建一组 DataFrame 数据,如下所示: import pandas as pd impor ...
- pysimplegui之画布,图形,表格和树结构元素
画布元素 在我看来,tkinter Canvas 小部件是 tkinter 小部件中功能最强大的.虽然我尽我所能将用户与任何与 tkinter 相关的东西完全隔离,但 Canvas 元素是一个例外.它 ...
- Ficow 的 AI 平台快速上手指南(ChatGPT, NewBing, ChatGLM-6B, cursor.so)
本文首发于 Ficow Shen's Blog,原文地址: Ficow 的 AI 平台快速上手指南(ChatGPT, NewBing, ChatGLM-6B, cursor.so). 内容概览 前言 ...
- mapper接口中常见的增删改查
前言 相信大家在使用mybatis写mapper接口的时候,最常用且简单的方法就是增删改查了.我也是刚开始做项目,在本篇文章中,我将根据自己在vhr微人力项目中的mapper接口方法为实例,记录一下接 ...
- Go语言实现简单分布式系统
使用Go语言实现比较简单的分布式系统,这个系统中采用多个分布式模型,即混合模型,并且基于HTTP进行通信,传输JSON数据 github链接: https://github.com/T4t4KAU/d ...