天梯赛赛前复习 没有排版,只为记录,建议别点

4 篇文章 0 订阅
3 篇文章 0 订阅

 str="$#";
    for(int i=0;i<len;++i)
    {
        str+=s[i];
        str+='#';
    }

int manarcher()                                     //回文子串长度为半径-1
{
    len=str.size();
    p[0]=0; id=0;                  //p[i]记录的是加了填充以后,最长回文子串的一半 最大值就是最长子串的长度
    maxx=0;
    int anslen=0;            //maxx为最右能到达的距离,id为对应的对称中心
    for(int i=1;i<len;++i)
    {
        if(i<maxx) p[i]=min(p[2*id-i],maxx-i);
        else p[i]=1;
        while(str[i-p[i]]==str[i+p[i]]) p[i]++;
        if(maxx<i+p[i])                             //能到达最远的id不一定是半径最大的中心
        {
            maxx=i+p[i];
            id=i;
        }
        anslen=max(anslen,p[i]);


    }
   return anslen-1;
}

 

int geth(int start,int end)    //把左树和右树分离出来,高度较大值加1
{
    num++;
    int i,j;
    for(i=start;i<end;++i)
        if(b[i]==a[num])
            break;
    if(i==end) return 0;
    int left=0,right=0;
    if(start<i) left=geth(start,i);
    if(i+1<end) right=geth(i+1,end);
    return left>right?left+1:right+1;
}

 

it=v.begin();
while(v.size()>1)   //猴子选大王
{
    for(int i=1;i<=2;++i)
    {
        ++it;
        if(it==v.end()) it=v.begin();
    }
   it= v.erase(it);
    if(it==v.end()) it=v.begin();

}

新浪微博热门话题

for(int k=0;k<len;++k)
        {
            if(str[k]=='#'&&l1==-1) l1=k;
            else if(str[k]=='#'&&l1!=-1) l2=k;  //用# #先把字符串提取出来
            if(l2!=-1)
            {
                string tmp="";                  //没有初始化它
                for(int j=l1+1;j<l2;++j)
                {
                    if(isalpha(str[j])||isdigit(str[j]))
                    {
                        if(isupper(str[j]))
                            str[j]+=32;
                        if(str[j-1]==' ')          //如果自己不是空格而前面一个是空格,把空格加上去
                            tmp+=str[j-1];
                        tmp+=str[j];
                    }
                    else str[j]=' ';             //非数字和字母都处理成空格
                }
                mp[tmp].insert(i);
                l1=l2=-1;
            }
        }

 

        while(cin>>id>>state)
        {
            if(!id)
            {
                cin>>s[id];
                memset(flag,0,sizeof(flag));//有开始没结束的不能留到第二天去祸害别人
                break;
            }

            if(state=='S')
            {
                flag[id]=1;
                cin>>s[id];
            }
            else if(state=='E')
            {
                cin>>t[id];
                if(flag[id])                //有开始的情况下有结束才算数
                {
                    ++cnt;
                    tt+=caltt(s[id],t[id]);
                    flag[id]=0;                 //没被开始读     //这句话不应该放在外面 麻蛋
                }

            }
        }
        if(cnt==0) cout<<"0 0"<<endl;               //没加这个导致除零错误  养成习惯:当做除法的时候,是否可能除0
        else
          cout<<' '<<cnt<<' '<<(tt+cnt-1)/cnt<<endl;    //平均时间向上取整
    }

//词频相似度

map<int,set<string> >mp;
string tmp="";
scanf("\n");
for(int i=1;i<=n;++i)
{
    while(true)
    {
        char ch=getchar();
        if(ch=='#')
            break;
        
        if(isalpha(ch))
        {
            if(isupper(ch))
                ch+=32;
            tmp+=ch;
        }
        else
        {
            if(tmp.size()>=3)
            {
                if(tmp.size()>10)
                    tmp=tmp.substr(0,10);
                mp[i].insert(tmp);
                
            }
            tmp="";   //不是放在上一个if里面,有分隔的时候要立刻清空  脑子不清醒就会考虑错qwq
        }
    }
}

#include<iomanip>

#include<iostream>
#include<cstring>
using namespace std;
const int N=10;
struct node
{
    char data;
    int lchild;
    int rchild;
}T1[N],T2[N];
int n,check[N];
int build(struct node T[])
{
    int n,root;
    cin>>n;
    if(!n) return -1;               //空树 根为-1
    memset(check,0,sizeof(check));
    for(int i=0;i<n;++i)
    {
        char l,r;
        cin>>T[i].data>>l>>r;
        if(l!='-')
        {
            T[i].lchild=l-'0';
            check[T[i].lchild]=1;  //用check数组找到根结点,根结点是唯一一个没有作为子节点出现的节点
        }
        else T[i].lchild=-1;
        if(r!='-')
        {
            T[i].rchild=r-'0';
            check[T[i].rchild]=1;
        }
        else T[i].rchild=-1;
    }
    int ind;
    for(ind=0;ind<N;++ind)
        if(!check[ind]) break;
    return root=ind;
}

bool ok(int root1,int root2)                          //判断两棵树是否是镜像树,即左右孩子交换位置
{
    if(root1==root2&&root1==-1) return true; //都是空树
   // if(root1!=root2) return false;
    if(root1*root2<0) return false;          //说明一个非空一个空
    if(T1[root1].data!=T2[root2].data)       return false;
    if(T1[root1].lchild==-1&&T2[root2].lchild==-1) return ok(T1[root1].rchild,T2[root2].rchild);
    if(T1[root1].lchild!=-1&&T2[root2].lchild!=-1&&T1[T1[root1].lchild].data==T2[T2[root2].lchild].data)  //都有左孩子且左孩子根相同
        return (ok(T1[root1].lchild,T2[root2].lchild)&&ok(T1[root1].rchild,T2[root2].rchild));
    else                                                                                                //都有左孩子但是左孩子的根不同或者一个有左孩子另一个没有左孩子
        return (ok(T1[root1].lchild,T2[root2].rchild)&&ok(T1[root1].rchild,T2[root2].lchild));

}
int main()
{
    int root1,root2;
    root1=build(T1);
    root2=build(T2);
    if(ok(root1,root2))
        cout<<"Yes\n";
    else cout<<"No\n";
    return 0;
}
 

struct node
{
    int data;
    node* lc;
    node* rc;
};
node* newnode(int x)
{
    node* Node=new node;
    Node->data=x;
    Node->lc=NULL;
    Node->rc=NULL;
    return Node;
}
void insert(node* &rt,int x)
{
    if(rt==NULL)
    {
        rt=newnode(x);
        return;
    }
    if(rt->data==x) return;
    else if(rt->data<x)
        insert(rt->lc,x);
    else
        insert(rt->rc,x);
}
node* create(int n)
{
    node* root=NULL;
    for(int i=0;i<n;++i)
    {
        cin>>x;
        insert(root,x);
    }
    return root;
}
bool same(node* rt1,node *rt2)
{
    if(rt1==NULL&&rt2==NULL) return true;
    else if((rt1==NULL&&rt2!=NULL)||(rt1!=NULL&&rt2==NULL)) return false;
    if(rt1->data!=rt2->data) return false;
    return same(tr1->lc,rt2->lc)&&same(tr1->rc,tr2->rc);
}

 

void dfs(int x)
{
    cout<<x<<endl;
    for(int i=0;i<g[x].size();++i)
    {
        if(!vis[g[x][i])
        {
            dfs(g[x][i]);
            cout<<x<<endl;                    //倒序输出牛逼  1 2 3 2 1
        }
    }
}

主要是记得要dp[s]=1, c[s]=a[s];

 

for(int i=head[u];i!=-1;i=e[i].next)
        {
            int v=e[i].v;
            if(d+e[i].w<dist[v])
            {
                dist[v]=d+e[i].w;
                c[v]=c[u]+a[v];  q.push(pii(dist[v],v));
                dp[v]=dp[u];
                pre[v]=u;
            }
            else if(d+e[i].w==dist[v])
            {
                dp[v]+=dp[u];
                if(c[u]+a[v]>c[v])
                {
                    c[v]=c[u]+a[v];
                    pre[v]=u;
                }


                //q.push(pii(dist[v],v));
            }
        }

 

void inorder(int root)
{
    inorder(root->lc);
    v.push_back(root->data);
    inorder(root->rc);
}
void isheap(int rt)//判断想不想等的时候才是那个样子
{
    if(tr[rt].lc!=-1)
    {
        if()
            judge=0,return ;
        isheap(rt.lc);
    }
}

while(n)
{
    cur=n%10;
    n/=10;
    bitnum++;
    if(cur)
    {
        if(bitnum>1) result[k++]=unit[bitnum];
        result[k++]=num[cur];
    }
    else
    {
        if(bitnum==5) result[k++]=unit[bitnum];
        else if(pre!=0&&bitnum!=4&&bitnum!=1) result[k++]=num[cur];
    }
    pre=cur;
}

 

for(int i=0;i<n;++i)
    for(int j=0;j<n-i-1;++j)
    {
        if(a[j]>a[j+1])
            swap(a[j],a[j+1]);
    }

while(i=a.find(b)!=string::npos)
    a.replace(i,b.size(),"");

 

 

void dfs(len,sum,next)
{
    if(sum+next>n) return ;
    else if(sum+next==n)
    {
        a[len++]=next;
        cout<<n<<"=";
        for(i=0;i<len;++i)
            cout<<a[i];

        return;
    }
    else
    {
        a[len++]=next;
        sum+=next;
        for(int i=next;i<=n-pos;++i)
            dfs(len,sum,i);
    }
}

int main()
{
    cin>>n;
    for(int i=1;i<=n/2;++i)
        dfs(0,0,i);            //    以i开始
    dfs(0,0,n);

}

cin>>a>>n;
    for(int i=0;i<n;++i)
    {
        arr[i]+=a*(n-i);                        //必须是+=
        arr[i+1]+=arr[i]/10;                    //+=
        arr[i]%=10;
    }
    if(n==0) {cout<<0<<endl;return 0;}
    if(arr[n]) cout<<arr[n];                    
    for(int i=n-1;i>=0;--i)
        cout<<arr[i];

int maxx=0,id=0,anslen=0;
for(int i=0;i<str.size();++i)
{
	if(i<maxx) p[i]=min(p[2*id-i],maxx-i);
	else p[i]=1;
	while(str[i-p[i]]==str[i+p[i]]) p[i]++;
	if(i+p[i]>maxx)
	{
		id=i;
		maxx=p[i];
	}
	anslen=max(anslen,p[i]);
}

int gcd(int a,int b)
{
	if(!b) return a;
	else return (b,a%b); 
}

s.erase(s.end()-1); //删除最后一个
if(b<0.05&&b>-0.05) //认为b是0

//给出先序和中序,还原二叉树高度
int num=-1;
int geth(int start,int end)
{
	num++;
	for(int i=start;i<end;++i)
		if(b[i]==a[num])
			break;
    if(i==end) return 0;
    if(start<i)
	    left=geth(start,i);
    if(i+1<end)
        right=geth(i+1,end);
	return (left>right?left:right)+1;
}

//猴子选大王
std::vector<int>:: iterator it;

struct edge
{
	int v,w,next,cost;
	edge(){}
	edge(int v,int w,int next,int cost):v(v),w(w),next(next),cost(cost){}
};
void addedge(int u,int v,int w,int c)
{
	e[cnt]=edge(v,w,head[u],c);
	head[u]=e[cnt++];
}
priority_queue<pii,vector<pii>,greater<pii> >q;
dist[s]=0;
q.push(pii(dist[s],s));
while(!q.empty())
{
	pii p=q.top();
	q.pop();
	int d=p.first,u=p.second;
	if(dist[u]<d) continue;
	for(int i=head[u];i!=-1;i=e[i].next)
	{
		int v=e[i].v;
		if(dist[v]>dist[u]+e[i].w)
	}
}

int k=n-u;
if(k<0) cout<<1<<endl;
int cnt=(k+u-d-1)/(u-d);
int ans=2*cnt+1;

bool dfs(int u)
{
	vis[u]=-1;		//表明正在访问
	for(int i=0;i<g[u].size();++i)
	{
		int v=g[u][i];
		if(vis[v]<0) return false;	//v也正在访问,形成huan
		else if(!vis[v]&&!dfs(v)) return false;
	}
	vis[u]=1;
}
bool topo_sort()
{
	for(int i=0;i<n;++i)
	{
		if(!vis[i])
			if(!dfs(i))
				return false;
	}
	return true;
}

//天梯赛座位分配
for(int j=0;j<maxx;++j)
{
	for(int i=1;i<=n;++i)
	{
		if(!mp[i][j]) continue;
		else if(mp[i][j])
		{
			if(flag!=i)
			{
				a[i][j]=++cnt;
				flag=i;
			}
			else
			{
				++cnt;
				a[i][j]=++cnt;
				flag=i;
			}
			
		}
	}
}

map<int,set<string> >mp;
string tmp="";
scanf("\n");
for(int i=1;i<=n;++i)
{
	while(true)
	{
		char ch=getchar();
		if(ch=='#')
			break;
		
		if(isalpha(ch))
		{
			if(isupper(ch))
				ch+=32;
			tmp+=ch;
		}
		else
		{
			if(tmp.size()>=3)
			{
				if(tmp.size()>10)
					tmp=tmp.substr(0,10);
				mp[i].insert(tmp);
				
			}
			tmp="";
		}
	}
}

for(int i=2;i<=n;++i)
{
	if(dp[i-1]>0)
		dp[i]+=dp[i-1];

}

bool ok(int root1,int root2)
{
	if(root1==-1&&root2==-1) return true;
	else if(root1*root2<0) return false;
	else if(tr[root1].data!=tr[root2].data) return false;
	都没有左孩子  return ok(tr[root1].rc,tr[root2].rc);
	else if(tr[root1].lc!=1&&tr[root2].lc!=-1&&左孩子根结点相同) 
		return 左孩子对左孩子&&右孩子对右孩子
	else 
		return 左孩子对右孩子&&右孩子对左孩子
}
struct  node
{
	char data;
	int lc;
	int rc;
}tr1[N],tr2[N];
void build(struct node T[])
{
	cin>>T[i].data>>l>>r;

}

struct node
{
	int data;
	node* lc;
	node* rc;
};
node* newnode(int x)
{
	node* Node=new node;
	Node->data=x;
	Node->lc=NULL;
	Node->rc=NULL;
	return Node;
}
void insert(node* &rt,int x)
{
	if(rt==NULL)
	{
		rt=newnode(x);
		return;
	}
	if(rt->data==x) return;
	else if(rt->data<x)
		insert(rt->lc,x);
	else
		insert(rt->rc,x);
}
node* create(int n)
{
	node* root=NULL;
	for(int i=0;i<n;++i)
	{
		cin>>x;
		insert(root,x);
	}
	return root;
}
bool same(node* rt1,node *rt2)
{
	if(rt1==NULL&&rt2==NULL) return true;
	else if((rt1==NULL&&rt2!=NULL)||(rt1!=NULL&&rt2==NULL)) return false;
	if(rt1->data!=rt2->data) return false;
	return same(tr1->lc,rt2->lc)&&same(tr1->rc,tr2->rc);
}

void adjust(int x)
{
	
	while(x!=1)
	{
		int fa=x/2;
		if(heap[fa]>heap[x])
		{
			swap(heap[fa],heap[x]);
		}
		x=fa;
	}
}
for(int i=1;i<=n;++i)
{
	cin>>heap[i];
	adjust(i);
}


void dfs(int x)
{
	cout<<x<<endl;
	for(int i=0;i<g[x].size();++i)
	{
		if(!vis[g[x][i])
		{
			dfs(g[x][i]);
			cout<<x<<endl;					//倒序输出牛逼  1 2 3 2 1
		}
	}
}

//走最短路要用bfs而不是dfs

//floyd
for(int k=1;k<=n;++k)
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			if(d[i][k]+d[k][j]<d[i][j])
				d[i][j]=d[i][k]+d[k][j];

//最短路的条数
新的最短路 					dp[v]=dp[u];
和最短路一样长			    dp[v]+=dp[u];

void dijkstra(int s)
{
	priority_queue<pii,vector<pii>,greater<pii> >q;
	memset(dp,0,sizeof(dp));
	memset(dist,INF,sizeof(dist));
	dp[s]=1;
	dist[s]=0;
	q.push(pii(dist[s],s));
	while(!q.empty())
	{
		pii p=q.top();
		int u=p->second,d=p->first;
		if(dist[u]<d) continue;
		for(int i=head[u];i!=-1;i=e[i].next)
		{
			int v=e[i].v;
			if(dist[v]>dist[u]+e[i].w)
			{
				dist[v]=dist[u]+e[i].w;
				dp[v]=dp[u];
				c[v]=c[u]+a[v];
			}
			else if(==)
			{
				dp[v]+=dp[u];
				if(c[u]+a[v]>c[v])
					c[v]=c[u]+a[v];
			}
		}
	}
}


 while(pp!=s)							//完全okk
    {
        v.push_back(pp);
        pp=pre[pp];
        cnt++;
    }
    cout<<s;
    for(int i=cnt-1;i>=0;--i)
        cout<<' '<<v[i];
    cout<<endl;


在Kruscal里面
edge(u,v,w);
在dijkstra里面
edge(v,w,next);
还可以用vector<int> g[N];存相邻节点的编号 需要用到权重的话就struct 或pair<int,int>
没事就都开LL
每个操作占一行
void han(int n,char a,char b,char c)
{
	if(n==1) printf("%c -> %c\n",a,c);
	else
	{
		han(n-1,a,c,b);					//a
		printf("%c -> %c\n",a,c);
		han(n-1,b,a,c);
	}
}

void inorder(int root)
{
	inorder(root->lc);
	v.push_back(root->data);
	inorder(root->rc);
}
void isheap(int rt)
{
	if(tr[rt].lc!=-1)
	{
		if()
			judge=0,return ;
		isheap(rt->lc);
	}
}

while(right-left>1e-3)
{
	middle=(right+left)/2;
	if(f(mid)==0) break;
	else if(f(left)*f(mid)<0)right=mmid;
	else left=mid;
}
if(right-left<1e-3) (right+left)/2;

while(n)
{
	cur=n%10;
	n/=10;
	bitnum++;
	if(cur)
	{
		if(bitnum>1) result[k++]=unit[bitnum];
		result[k++]=num[cur];
	}
	else
	{
		if(bitnum==5) result[k++]=unit[bitnum];
		else if(pre!=0&&bitnum!=4&&bitnum!=1) result[k++]=num[cur];
	}
	pre=cur;
}

跳过空格的方式有两种,如果是字母,且前面是空格,就把该空格记录下来--------需要存空格的时候
每读一个字母,长度++。当遇到0的时候,长度清零。如果遇到空格长度为0,就不用记录,不用输出  ---------只是想排除空格干扰的时候

for(int i=0;i<n;++i)
	for(int j=0;j<n-i-1;++j)
	{
		if(a[j]>a[j+1])
			swap(a[j],a[j+1]);
	}

while(i=a.find(b)!=string::npos)
	a.replace(i,b.size(),"");

void dfs(len,sum,next)
{
	if(sum+next>n) return ;
	else if(sum+next==n)
	{
		a[len++]=next;
		cout<<n<<"=";
		for(i=0;i<len;++i)
			cout<<a[i];
		return;
	}
	else
	{
		a[len++]=next;
		sum+=next;
		for(int i=next;i<=n-pos;++i)
			dfs(len,sum,i);
	}
}

int main()
{
	cin>>n;
	for(int i=1;i<=n/2;++i)
		dfs(0,0,i);			//	以i开始
	dfs(0,0,n);
}

for(int i=0;i<n;++i)
{
	arr[i]+=a*(n-i);
	arr[i+1]+=arr[i]/10;
	arr[i]%=10;
}
if(arr[n]) cout

int maxx=0,id=0,anslen=0;
for(int i=0;i<str.size();++i)
{
    if(i<maxx) p[i]=min(p[2*id-i],maxx-i);
    else p[i]=1;
    while(str[i-p[i]]==str[i+p[i]]) p[i]++;
    if(i+p[i]>maxx)
    {
        id=i;
        maxx=p[i];
    }
    anslen=max(anslen,p[i]);
}

 

s.erase(s.end()-1); //删除最后一个
if(b<0.05&&b>-0.05) //认为b是0

//给出先序和中序,还原二叉树高度
int num=-1;
int geth(int start,int end)
{
    num++;
    for(int i=start;i<end;++i)
        if(b[i]==a[num])
            break;
    int left=geth(start,i);
    int right=geth(i+1,end);
    return (left>right?left:right)+1;
}

//猴子选大王
std::vector<int>:: iterator it;

struct edge
{
    int v,w,next,cost;
    edge(){}
    edge(int v,int w,int next,int cost):v(v),w(w),next(next),cost(cost){}
};
void addedge(int u,int v,int w,int c)
{
    e[cnt]=edge(v,w,head[u],c);
    head[u]=e[cnt++];
}
priority_queue<pii,vector<pii>,greater<pii> >q;
dist[s]=0;
q.push(pii(dist[s],s));
while(!q.empty())
{
    pii p=q.top();
    q.pop();
    int d=p.first,u=p.second;
    if(dist[u]<d) continue;
    for(int i=head[u];i!=-1;i=e[i].next)
    {
        int v=e[i].v;
        if(dist[v]>dist[u]+e[i].w)
    }
}

int k=n-u;
if(k<0) cout<<1<<endl;
int cnt=(k+u-d-1)/(u-d);
int ans=2*cnt+1;

bool dfs(int u)
{
    vis[u]=-1;        //表明正在访问
    for(int i=0;i<g[u].size();++i)
    {
        int v=g[u][i];
        if(vis[v]<0) return false;    //v也正在访问,形成huan
        else if(!vis[v]&&!dfs(v)) return false;
    }
    vis[u]=1;
}
bool topo_sort()
{
    for(int i=0;i<n;++i)
    {
        if(!vis[i])
            if(!dfs(i))
                return false;
    }
    return true;
}

//天梯赛座位分配
for(int j=0;j<maxx;++j)
{
    for(int i=1;i<=n;++i)
    {
        if(!mp[i][j]) continue;
        else if(mp[i][j])
        {
            if(flag!=i)
            {
                a[i][j]=++cnt;
                flag=i;
            }
            else
            {
                ++cnt;
                a[i][j]=++cnt;
                flag=i;
            }
            
        }
    }
}

map<int,set<string> >mp;
string tmp="";
scanf("\n");
for(int i=1;i<=n;++i)
{
    while(true)
    {
        char ch=getchar();
        if(ch=='#')
            break;
        
        if(isalpha(ch))
        {
            if(isupper(ch))
                ch+=32;
            tmp+=ch;
        }
        else
        {
            if(tmp.size()>=3)
            {
                if(tmp.size()>10)
                    tmp=tmp.substr(0,10);
                mp[i].insert(tmp);
                
            }
            tmp="";
        }
    }
}

for(int i=2;i<=n;++i)
{
    if(dp[i-1]>0)
        dp[i]+=dp[i-1];

}

bool ok(int root1,int root2)
{
    if(root1==-1&&root2==-1) return true;
    else if(root1*root2<0) return false;
    else if(tr[root1].data!=tr[root2].data) return false;
    都没有左孩子  return ok(tr[root1].rc,tr[root2].rc);
    else if(tr[root1].lc!=1&&tr[root2].lc!=-1&&左孩子根结点相同) 
        return 左孩子对左孩子&&右孩子对右孩子
    else 
        return 左孩子对右孩子&&右孩子对左孩子
}
struct  node
{
    char data;
    int lc;
    int rc;
}tr1[N],tr2[N];
void build(struct node T[])
{
    cin>>T[i].data>>l>>r;

}

struct node
{
    int data;
    node* lc;
    node* rc;
};
node* newnode(int x)
{
    node* Node=new node;
    Node->data=x;
    Node->lc=NULL;
    Node->rc=NULL;
    return Node;
}
void insert(node* &rt,int x)
{
    if(rt==NULL)
    {
        rt=newnode(x);
        return;
    }
    if(rt->data==x) return;
    else if(rt->data<x)
        insert(rt->lc,x);
    else
        insert(rt->rc,x);
}
node* create(int n)
{
    node* root=NULL;
    for(int i=0;i<n;++i)
    {
        cin>>x;
        insert(root,x);
    }
    return root;
}
bool same(node* rt1,node *rt2)
{
    if(rt1==NULL&&rt2==NULL) return true;
    else if((rt1==NULL&&rt2!=NULL)||(rt1!=NULL&&rt2==NULL)) return false;
    if(rt1->data!=rt2->data) return false;
    return same(tr1->lc,rt2->lc)&&same(tr1->rc,tr2->rc);
}

void adjust(int x)
{
    
    while(x!=1)
    {
        int fa=x/2;
        if(heap[fa]>heap[x])
        {
            swap(heap[fa],heap[x]);
        }
        x=fa;
    }
}
for(int i=1;i<=n;++i)
{
    cin>>heap[i];
    adjust(i);
}


void dfs(int x)
{
    cout<<x<<endl;
    for(int i=0;i<g[x].size();++i)
    {
        if(!vis[g[x][i])
        {
            dfs(g[x][i]);
            cout<<x<<endl;                    //倒序输出牛逼  1 2 3 2 1
        }
    }
}

//走最短路要用bfs而不是dfs

//floyd
for(int k=1;k<=n;++k)
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            if(d[i][k]+d[k][j]<d[i][j])
                d[i][j]=d[i][k]+d[k][j];

//最短路的条数
新的最短路                     dp[v]=dp[u];
和最短路一样长                dp[v]+=dp[u];

void dijkstra(int s)
{
    priority_queue<pii,vector<pii>,greater<pii> >q;
    memset(dp,0,sizeof(dp));
    memset(dist,INF,sizeof(dist));
    dp[s]=1;
    dist[s]=0;
    q.push(pii(dist[s],s));
    while(!q.empty())
    {
        pii p=q.top();
        int u=p->second,d=p->first;
        if(dist[u]<d) continue;
        for(int i=head[u];i!=-1;i=e[i].next)
        {
            int v=e[i].v;
            if(dist[v]>dist[u]+e[i].w)
            {
                dist[v]=dist[u]+e[i].w;
                dp[v]=dp[u];
                c[v]=c[u]+a[v];
            }
            else if(==)
            {
                dp[v]+=dp[u];
                if(c[u]+a[v]>c[v])
                    c[v]=c[u]+a[v];
            }
        }
    }
}


 while(pp!=s)                            //完全okk
    {
        v.push_back(pp);
        pp=pre[pp];
        cnt++;
    }
    cout<<s;
    for(int i=cnt-1;i>=0;--i)
        cout<<' '<<v[i];
    cout<<endl;


在Kruscal里面
edge(u,v,w);
在dijkstra里面
edge(v,w,next);
还可以用vector<int> g[N];存相邻节点的编号
没事就都开LL
每个操作占一行
void han(int n,char a,char b,char c)
{
    if(n==1) printf("%c -> %c\n",a,c);
    else
    {
        han(n-1,a,c,b);                    //a
        printf("%c -> %c\n",a,c);
        han(n-1,b,a,c);
    }
}

void inorder(int root)
{
    inorder(root->lc);
    v.push_back(root->data);
    inorder(root->rc);
}
void isheap(int rt)
{
    if(tr[rt].lc!=-1)
    {
        if()
            judge=0,return ;
        isheap(rt->lc);
    }
}

while(right-left>1e-3)
{
    middle=(right+left)/2;
    if(f(mid)==0) break;
    else if(f(left)*f(mid)<0)right=mmid;
    else left=mid;
}
if(right-left<1e-3) (right+left)/2;

while(n)
{
    cur=n%10;
    n/=10;
    bitnum++;
    if(cur)
    {
        if(bitnum>1) result[k++]=unit[bitnum];
        result[k++]=num[cur];
    }
    else
    {
        if(bitnum==5) result[k++]=unit[bitnum];
        else if(pre!=0&&bitnum!=4&&bitnum!=1) result[k++]=num[cur];
    }
    pre=cur;
}

跳过空格的方式有两种,如果是字母,且前面是空格,就把该空格记录下来--------需要存空格的时候
每读一个字母,长度++。当遇到0的时候,长度清零。如果遇到空格长度为0,就不用记录,不用输出  ---------只是想排除空格干扰的时候

for(int i=0;i<n;++i)
    for(int j=0;j<n-i-1;++j)
    {
        if(a[j]>a[j+1])
            swap(a[j],a[j+1]);
    }

while(i=a.find(b)!=string::npos)
    a.replace(i,b.size(),"");

void dfs(len,sum,next)
{
    if(sum+next>n) return ;
    else if(sum+next==n)
    {
        a[len++]=next;
        cout<<n<<"=";
        for(i=0;i<len;++i)
            cout<<a[i];
        return;
    }
    else
    {
        a[len++]=next;
        sum+=next;
        for(int i=next;i<=n-pos;++i)
            dfs(len,sum,i);
    }
}

int main()
{
    cin>>n;
    for(int i=1;i<=n/2;++i)
        dfs(0,0,i);            //    以i开始
    dfs(0,0,n);
}

for(int i=0;i<n;++i)
{
    arr[i]+=a*(n-i);
    arr[i+1]+=arr[i]/10;
    arr[i]%=10;
}
if(arr[n]) cout

map<string,string> fa;
string last[N];
int main()
{
    for(int i=1;i<=n;++i)
    {
        string ss;
        getline(cin,ss);
        int k=count(ss.begin(),ss.end(),' ');
        if(!k)
        {
            fa[ss]=-1;
            last[0]=ss;
        }
        else
        {
            ss=ss.substr(k);
            fa[ss]=last[k/2-1];
            last[k/2]=ss;
        }
    }
    cin>>a>>d>>d>>b>>d>>c;
    const char* T="True";
    const char* F="False";
    switch(b[0])
    {
        case 'p':                //a是c的爸爸
            cout<<(fa[c]==a?T:F)<<endl;break;        //a是c的孩子
        case 'c':
            cout<<(fa[a]==c?T:F)<<endl;break;
        case 'a':            //a是c的祖先
            while(fa[c]!=a&&fa[c]!=-1) c=fa[c];
            cout<<fa[c]==a?T:F<<endl;
        case 'd':            //a是c的子孙

    }
}

int find(int x)
{
    if(x==fa[x]) return x;
    else
    {
        int tmp=find(fa[x]);    ///不这样写会wa
        val[x]=(val[x]+val[fa[x]])%2;
        return fa[x]=tmp;

    }
}


if(fx==fy)
    if(val[x]==val[y]) flag=true;
else
{
    fa[fy]=fx;  rootx->rooty=rootx->x+x->y+y->rooty
    val[fy]=(val[x]+1+val[y])%2;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值