2019 JUST Programming Contest 题解

2019 JUST Programming Contest 题解
#还行

A:还行

#include <bits/stdc++.h>
 
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int M=2e5+10;
int head[N],cnt=1,tot,dfn[N],low[N],num,n,m,c_id[N],head1[N],res[N];
ll ans;
bool qi[N],zhong[N],bridge[M<<1];
char s[N];
struct edge{
    int next,to,w;
}e[M<<2];
void add(int u,int v,int w){
    e[++cnt].next=head[u];
    e[cnt].to=v;
    e[cnt].w=w;
    head[u]=cnt;
}
void tarjan(int u,int in_edge){
    dfn[u]=low[u]=++num;
    for(int i=head[u];i;i=e[i].next){
        int v=e[i].to;
        if(!dfn[v]){
            tarjan(v,i);
            low[u]=min(low[u],low[v]);
            if(dfn[u]<low[v]){
                bridge[i]=bridge[i^1]=true;
            }
        }else if(i!=(in_edge^1))
        low[u]=min(low[u],dfn[v]);
    }
}
void dfs(int u){
    c_id[u]=tot;
    if(qi[u])res[tot]++;
    else if(zhong[u])res[tot]--;
    for(int i=head[u];i;i=e[i].next){
        int v=e[i].to;
        if(c_id[v]||bridge[i])continue;
        dfs(v);
    }
}
void add_c(int u,int v,int w){
    e[++cnt].next=head1[u];
    e[cnt].to=v;
    e[cnt].w=w;
    head1[u]=cnt;
}
void dfs1(int u,int f){
    int now=0;
    for(int i=head1[u];i;i=e[i].next){
        int v=e[i].to,w=e[i].w;
        if(v==f)continue;
        dfs1(v,u);
        int x=abs(res[v]);
        ans+=w*x;now+=res[v];
    }
    res[u]+=now;
}
int main()
{
    int t;scanf("%d",&t);
    while(t--){
        scanf("%d %d",&n,&m);
        tot=num=0;cnt=1;ans=0;
        for(int i=1;i<=n;i++){
            head[i]=head1[i]=low[i]=dfn[i]=res[i]=c_id[i]=0;
            qi[i]=zhong[i]=false;
        }
        scanf(" %s",s+1);
        for(int i=1;i<=n;i++){
            if(s[i]=='H')qi[i]=true;
            else if(s[i]=='A')zhong[i]=true;
        }
        for(int i=1;i<=m;i++){
            int a,b,c;scanf("%d %d %d",&a,&b,&c);
            add(a,b,c);add(b,a,c);
        }
        for(int i=1;i<=cnt;i++)bridge[i]=false;
        for(int i=1;i<=n;i++)
            if(!dfn[i])tarjan(i,0);
        for(int i=1;i<=n;i++)
            if(!c_id[i]){
                ++tot;
                dfs(i);
            }
        int cnt1=cnt;
        for(int i=2;i<=cnt1;i+=2){
            int x=e[i^1].to,y=e[i].to,w=e[i].w;
            if(c_id[x]==c_id[y])continue;
            add_c(c_id[x],c_id[y],w);
            add_c(c_id[y],c_id[x],w);
        }
        dfs1(1,0);
        printf("%lld\n",ans);
    }
    return 0;
}

B 还行

#include <bits/stdc++.h>
 
using namespace std;
const int N=1e5+10;
int pre[N];
pair<int,int>pa[N];
bool ok[N];
int main()
{
    int t;scanf("%d",&t);
    while(t--){
        int n,m,q;scanf("%d%d%d",&n,&m,&q);
        for(int i=1;i<=m;i++)pa[i]=make_pair(-1,-1);
        for(int i=1;i<=m+1;i++)pre[i]=i-1;
        for(int i=1;i<=m;i++)ok[i]=true;
        for(int i=1;i<=n;i++){
            int l,r;scanf("%d%d",&l,&r);
            for(int j=l;j<=r;j++)ok[j]=false;
        }
        int pr=0;
        for(int i=1;i<=m;i++){
            if(ok[i])continue;
            int k=i;
            while(k<=m&&!ok[k]){
                k++;
            }
            pre[k]=i-1;
            i=k-1;
        }
        int now=pre[m+1];
        while(now>=1){
            int r=now;
            int len=0;
            for(;pre[now]==now-1&&now>=1;now=pre[now]){
                len++;
                if(pa[len].second<r)pa[len]=make_pair(now,r);
            }
            len++;
            if(now>=1&&pa[len].second<r)pa[len]=make_pair(now,r);
            now=pre[now];
        }
        while(q--){
            int k;scanf("%d",&k);
            printf("%d %d\n",pa[k].first,pa[k].second);
        }
    }
    return 0;
}

C 队友出的,不太清楚

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int T;
	cin>>T;
	while(T--){
		int n,m;
		cin>>n>>m;
		//cout<<__gcd((int)(pow(5,n)+pow(7,n)),(int)(pow(5,m)+pow(7,m)))<<endl;
		if((n%2)&&(m%2)){
			cout<<"12\n";
		}
		else {
			cout<<"2\n";
		}
	}
}

D 不太清楚

#include<bits/stdc++.h>
using namespace std;		
struct node{
	int n1,n0,id; 
	bool operator<(node b)const{
		return n1>b.n1;
	}
};
int main()
{
	int T;
	cin>>T;
	while(T--){
		string a[3];
		int cnt[3][2]{};
		node v[3];
		for(int i=0;i<3;i++){
			cin>>a[i];
			for(auto j:a[i]){
				if(j=='0')cnt[i][0]++;
				else cnt[i][1]++;
			}
			v[i]={cnt[i][1],cnt[i][0],i};
		}
		for(int i=0;i<10;i++){
			sort(v,v+3);
			char ch='1';
			if(v[0].n1&&v[1].n0&&v[2].n0){
				v[0].n1--,v[1].n0--,v[2].n0--;
			}
			else if(v[0].n1&&v[1].n1&&v[2].n1){
				v[0].n1--,v[1].n1--,v[2].n1--;
			}
			else ch='0';
			putchar(ch);
		}
		putchar('\n');
	}
}

E 母鸡

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
 
const int N = 1e4 + 10;
int t, n, m, num[30];
char s1[N], s2[N], s3[N];
 
int main()
{
    ios::sync_with_stdio(false);
    
    cin >> t;
    while (t--)
    {
        cin >> n >> m;
        cin >> s1 + 1;
        cin >> s2 + 1;
        cin >> s3 + 1;
        
        memset(num, 0x3f3f3f3f, sizeof num);
        for (int i = 1; i <= n; i++)
        num[s1[i] - 'a'] = min(num[s1[i] - 'a'], s2[i] -'0');
        
        int flag = 1, sum = 0;
        for (int i = 1; i <= m; i++)
        {
            if (num[s3[i] - 'a'] == 0x3f3f3f3f) flag = 0;
            sum += num[s3[i] - 'a'];
        }
        if (!flag) cout << -1 << endl;
        else cout << sum << endl;
    }
    
    return 0;
}

F:不知道

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
 
const int N = 1e4 + 10;
int t;
char s[N];
 
bool check1(char s)
{
    return s >= 'a' && s <= 'z';
}
 
bool check2(char s)
{
    return s >= 'A' && s <= 'Z';
}
 
int main()
{
    ios::sync_with_stdio(false);
    
    cin >> t;
    while (t--)
    {
        cin >> s + 1;
        
        int n = strlen(s + 1), flag = 1;
        for (int i = 1; i <= n; i++)
        {
            if (check1(s[i]) || check2(s[i])) continue;
            flag = 0;
        }
        if (!check1(s[1])) flag = 0;
        if (!flag) cout << "NO\n";
        else
        {
            vector<int>pos;
            pos.push_back(1);
            for (int i = 1; i <= n; i++)
                if (check2(s[i])) pos.push_back(i);
            if ((int)(pos.size()) <= 7) flag = 1;
            else flag = 0;
            
            if (!flag) cout << "NO\n";
            else cout << "YES\n";
        }
    }
    
    return 0;
}

G:签到题

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    int t;scanf("%d",&t);
    while(t--){
        int x1,y1,x2,y2;
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        printf("%d\n",abs(x1-x2)+abs(y1-y2));
    }
 
    return 0;
}

H:签到

#include <bits/stdc++.h>
 
using namespace std;
const int N=1e3+10;
char s[N];
int main()
{
    int t;scanf("%d",&t);
    while(t--){
        scanf(" %s",s);
        int len=strlen(s);
        bool f=1;
        for(int i=0;i<len;i++){
            if(s[i]=='z'){
                if(i+1<len&&s[i+1]!='a')f=0;
            }else {
                if(i+1<len&&s[i+1]!=s[i]+1)f=0;
            }
        }
        if(f)puts("YES");
        else puts("NO");
    }
 
    return 0;
}

I:签到

#include <bits/stdc++.h>
 
using namespace std;
const int N=1e4+10;
int a[N];
int main()
{
    int t;scanf("%d",&t);
    while(t--){
        int n,k;scanf("%d%d",&n,&k);
        vector<int>vt;
        int sum=0;
        int maxx=1e9;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            if(a[i]<0)vt.push_back(a[i]);
            else maxx=min(maxx,a[i]),sum+=a[i];
        }
        sort(vt.begin(),vt.end());
        for(auto it:vt){
            if(k==0)sum+=it;
            else sum+=-it,k--,maxx=min(maxx,-it);
        }
        if(k&1)sum-=2*maxx;
        printf("%d\n",sum);
    }
 
    return 0;
}

J:签到

#include <bits/stdc++.h>
 
using namespace std;
const int N=1e3+10;
map<int,int>mp[N];
int main()
{
    int t;scanf("%d",&t);
    while(t--){
        int n,m;scanf("%d %d",&n,&m);
        int ans=0;
        for(int i=1;i<=n;i++)mp[i].clear();
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            int a;scanf("%d",&a);
            if(mp[i-1][a])ans++,mp[i-1][a]--;
            mp[i][a]++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

K:听队友说是暴力

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
 
const int N = 1e5 + 10;
int t, n, a[N];
set<int>se, ans;
 
int main()
{
    scanf("%d", &t);
    while (t--)
    {
        se.clear();
        ans.clear();
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
        
        ans.insert(a[1]);
        se.insert(a[1]);
        
        for (int i = 2; i <= n; i++)
        {
            set<int>cur = se;
            se.clear();
            se.insert(a[i]);
            ans.insert(a[i]);
            for (auto it = cur.begin(); it != cur.end(); it++)
            {
                se.insert(a[i] | (*it));
                ans.insert(a[i] | (*it));
            }
        }
        
        printf("%d\n", (int)ans.size());
    }
    
    return 0;
}

L:不太清楚

#include<bits/stdc++.h>
using namespace std;		
int n,m,w,h;
const int N=2e3;
int a[N][N];
int pre[N][N];
bool check(int x){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+(a[i][j]>x);
		}
	}
	for(int i=h;i<=n;i++){
		for(int j=w;j<=m;j++){
			int sum=pre[i][j]+pre[i-h][j-w]-pre[i-h][j]-pre[i][j-w];
			if(sum<=(w*h)/2)return true;
		}
	}
	return false;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>h>>w;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	int l=1,r=n*m+1;
	int ans=0;
	while(l<r){
		int mid=(l+r)>>1;
		if(check(mid)){
			r=mid;
			ans=mid;
		}
		else {
			l=mid+1;
		}
	}
	cout<<ans;
}

发布了4 篇原创文章 · 获赞 0 · 访问量 10

猜你喜欢

转载自blog.csdn.net/WISH2LUCK/article/details/105633370