zoukankan      html  css  js  c++  java
  • GDKOI 2021 Day2 PJ 去世记

    比赛时和昨天一样困,后面的大奆打代码的速度简直了

    T1

    用 2、4、6、8 来与 5 抵消掉末尾的 0 ,然后用周期问题的方法直接乘起来并取个位

    #include<bits/stdc++.h>
    using namespace std;
    const int tw[4]={6,2,4,8};
    const int th[4]={1,3,9,7};
    const int fr[4]={6,4};
    const int sv[4]={1,7,9,3};
    const int gi[4]={6,8,4,2};
    const int nn[4]={1,9};
    int ans=1,x[15];
    int main() {
    	freopen("math.in","r",stdin);
    	freopen("math.out","w",stdout);
    	for(int i=1;i<11;i++)scanf("%d",&x[i]);
    	if(x[2]>x[5])x[2]-=x[5],x[5]=0;
    	else x[5]-=x[2],x[2]=0;
    	if(x[4] && x[5]) {
    		if(x[4]>x[5])ans*=tw[x[5]%4],x[4]-=x[5],x[5]=0;
    		else ans*=tw[x[4]%4],x[5]-=x[4],x[4]=0;		
    	}
    	if(x[6] && x[5]) {
    		if(x[6]>x[5])ans*=th[x[5]%4],x[6]-=x[5],x[5]=0;
    		else ans*=th[x[6]%4],x[5]-=x[6],x[6]=0;		
    	}
    	if(x[8] && x[5]) {
    		if(x[8]>x[5])ans*=fr[x[5]%4],x[8]-=x[5],x[5]=0;
    		else ans*=fr[x[8]%4],x[5]-=x[8],x[8]=0;		
    	}
    	if(x[2])ans*=tw[x[2]%4];
    	if(x[3])ans*=th[x[3]%4];
    	if(x[4])ans*=fr[x[4]&1];
    	if(x[6])ans*=6;
    	if(x[7])ans*=sv[x[7]%4];
    	if(x[8])ans*=gi[x[8]%4];
    	if(x[9])ans*=nn[x[9]&1];
    	if(x[5])ans*=5;
    	printf("%d",ans%10);
    }
    

    T2

    用 Bfs 维护每一个点管理的值域和它在原数组中的下标,模拟即可

    #include<bits/stdc++.h>
    using namespace std;
    struct rg {
    	int l,r,p;
    	rg(int x,int y,int z):
    		l(x),r(y),p(z) { }
    }u(0,0,0);
    int T,n,k,x[100005];
    queue<rg>q;
    inline bool Bfs() {
    	q.push(rg(1,n,1)),k=1;
    	while(!q.empty()) {
    		u=q.front(),q.pop();
    		if(x[k+1]<x[u.p] && x[k+2]>x[u.p])
    			if(x[k+1]>=u.l && x[k+1]<=u.r && x[k+2]>=u.l && x[k+2]<=u.r) {
    				q.push(rg(u.l,x[u.p]-1,k+1)),q.push(rg(x[u.p]+1,u.r,k+2)),k+=2;
    			}
    	}
    }
    int main() {
    	freopen("tree.in","r",stdin);
    	freopen("tree.out","w",stdout);
    	scanf("%d",&T);
    	while(T--) {
    		scanf("%d",&n);
    		for(int i=1;i<=n;i++)
    			scanf("%d",&x[i]);
    		Bfs();
    		if(k<n)puts("NO");
    		else puts("YES");
    	}
    }
    

    T3

    倍增。还要打人工栈
    不会

    T4

    直接把原图限平分可以得到一个 0/1 的图,发现部分分中有这一等,
    可以建边然后二分图匹配,本蒟蒻学奆佬打 Dinic 结果 Wa 40
    望大神指正

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=2005,M=2010000;
    int n,cnt=1,S,T,dep[N],vis[N],lst[N],cur[N],nxt[M],to[M];
    LL qz[M],x[N][N],y[N][N],fl[M],R[N],C[N];
    queue<int>q;
    inline void Ae(int fr,int go,int vl) {
    	to[++cnt]=go,qz[cnt]=vl,nxt[cnt]=lst[fr],lst[fr]=cnt;
    }
    inline bool Bfs() {
    	for(int i=1;i<=T;i++)cur[i]=lst[i];
    	memset(dep,0,sizeof(dep));
    	memset(vis,0,sizeof(vis));
    	q.push(S),vis[S]=1;
    	while(!q.empty()) {
    		register int u=q.front(); q.pop();
    		for(int i=lst[u],v;i;i=nxt[i])
    			if(!vis[v=to[i]] && qz[i]>fl[i]){
    				dep[v]=dep[u]+1;
    				q.push(v),vis[v]=1;
    			}
    	} return dep[T];
    }
    LL Dfs(int u,LL low){
        if(u==T||low==0) return low;
        register LL use=0,rl;
        for(int &i=cur[u],v;i;i=nxt[i])
            if(dep[u]+1==dep[v=to[i]]) {
                if(rl=Dfs(v,min(low,qz[i]-fl[i]))) {
                    fl[i]+=rl,fl[i^1]-=rl,use+=rl,low-=rl;
                    if(!low) break;
                }
            }
        return use;
    }
    inline void Dinic() {
    	while(Bfs()) {
    		while(Dfs(S,10000000000000000ll));
    	}
    }
    int main() {
    //	freopen("matrix.in","r",stdin);
    //	freopen("matrix.out","w",stdout); 
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++) {
    			scanf("%lld",&x[i][j]);
    			C[j]+=x[i][j];
    			R[i]+=x[i][j];
    		}
    	S=n*2+1,T=n*2+2;
    	for(int i=1;i<=n;i++) {
    		Ae(S,i,R[i]/2),Ae(i,S,0);
    		Ae(i+n,T,C[i]/2),Ae(T,i+n,0);
    	}
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++) {
    			Ae(i,j+n,x[i][j]),Ae(j+n,i,0);
    		}
    	Dinic();
    	for(int i=1;i<=n;i++)
    		for(int j=lst[i];j;j=nxt[j])  {
    			y[i][to[j]-n]=fl[j^1]>0?fl[j^1]:-fl[j^1];
    		}
    	for(int i=1;i<=n;i++) {
    		for(int j=1;j<=n;j++)
    			printf("%lld ",y[i][j]);
    		putchar(10);
    	}
    	for(int i=1;i<=n;i++) {
    		for(int j=1;j<=n;j++)
    			printf("%lld ",x[i][j]-y[i][j]);
    		putchar(10);
    	}
    	return 0;
    }
    

    总结

    今天爆零,我不禁担忧自己的提高组,
    正好今天听了高嘉煊的讲话,希望我注意一下自己的训练方式

  • 相关阅读:
    PHP 输出图像
    js 获取元素
    js 获取 坐标
    【javascript】ajax 基础 --本文转载
    JS获取当前时间
    如何安装win10和linux 双系统
    自动验证是ThinkPHP
    thinkphp 动态验证码 ------控制器传输到html 数据时间转换处理
    thinkphp 验证
    软件测试-测试开发需要学习的知识结构
  • 原文地址:https://www.cnblogs.com/KonjakLAF/p/14336888.html
Copyright © 2011-2022 走看看