2020HDU多校第三场

1004 DP

#include<bits/stdc++.h>
using namespace std;
#define N 100000
int ch[N+10],sh[N+10],uh[N+10],mh[N+10];
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        memset(ch,0,sizeof(ch));
        memset(sh,0,sizeof(sh));
        memset(uh,0,sizeof(uh));
        memset(mh,0,sizeof(mh));
        int n,p;
        sh[0]=0;
        scanf("%d%d",&n,&p);
        for(int i=1;i<=n;i++){
            scanf("%d",ch+i);
            sh[i]=(sh[i-1]+ch[i])%p;
        }
        uh[0]=0;
        for(int i=1;i<=n;i++){
            int u=sh[i];
            if(u==0){
                int t=uh[u];
                mh[i]=max(mh[t]+1,mh[i-1]);
                uh[u]=i;
            }
            else{
                int t=uh[u];
                if(t==0){
                    uh[u]=i;
                    mh[i]=mh[i-1];
                }
                else{
                    int y=uh[u];
                    uh[u]=i;
                    mh[i]=max(mh[y]+1,mh[i-1]);
                }
            }
        }
        printf("%d\n",mh[n]);
    }
}

1005 并查集,公式

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<ll, ll> pll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int INF = 0x3f3f3f3f;
ll qpow(ll base, ll n){ll ans = 1; while (n){if (n & 1) ans = ans * base % mod; base = base * base % mod; n >>= 1;} return ans;}
ll gcd(ll a, ll b){return b ? gcd(b, a % b) : a;}
ll a[N][2];
int fa[N];
int find(int x){
	return x == fa[x] ? x : fa[x] = find(fa[x]);
}
int main()
{
	int t;
	cin >> t;
	ll inv2 = qpow(2, mod - 2);
	ll inv6 = qpow(6, mod - 2);
	while (t --){
		int n;
		scanf("%d", &n);
		ll num1 = 0, num2 = 0, x;
		for(int i = 1; i <= n; ++ i) {
			scanf("%lld", &x);
			if (x == 1) ++ num1;
			else ++ num2;
			-- x;
			a[i][x] = 1;
			a[i][x ^ 1] = 0;
			fa[i] = i;
		}

		ll ans = num2 * (num2 - 1) % mod * inv2 % mod * num1 % mod;
		ans = (ans + num2 * (num2 - 1) % mod * (num2 - 2) % mod * inv6 % mod) % mod;
		printf("%lld\n", ans);
		int u, v;
		for (int i = 1; i < n; ++ i) {
			scanf("%d %d", &u, &v);
			u = find(u);
			v = find(v);
			if (u == v) continue;
			ll res = 0;
			ll lef1 = num1 - a[u][0] - a[v][0];
			ll lef2 = num2 - a[u][1] - a[v][1];
			ll lef3 = (lef1 + lef2) % mod;
			res = (res + a[u][0] * a[v][1] % mod * lef2 % mod) % mod;
			res = (res + a[u][1] * a[v][0] % mod * lef2 % mod) % mod;
			res = (res + a[u][1] * a[v][1] % mod * lef3 % mod) % mod;
			ans = (ans - res + mod) % mod;
			printf("%lld\n", ans);
			fa[v] = u;
			a[u][0] += a[v][0];
			a[u][1] += a[v][1];
		}
	}
	return 0;
}

1009 贪心

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define INF 0x3f3f3f3f
#define pi 3.141592654
typedef long long ll;
const int N = 1e5+5;
char s[N];
int pos[N];
int main(){
    int t;scanf("%d",&t);
    while(t--){
        scanf("%s",s);
        int l = strlen(s),f=1;
        int num1=0,num2=0,cnt=0,tot=0;///£¨£¬*±ä£©
        for(int i = 0 ; i < l ; i++){
            if(s[i] == '(') num1++;
            else if(s[i] == '*'){
                num2++;pos[++cnt] = i;
            }
            else{
                if(num1>0)  num1 --;
                else if(num2>0){
                    num2--;//printf("??");
                    s[pos[++tot]] = '(';
                }
                else{
                    f=0;break;
                }
            }
        }//printf("%d %d %d %d\n",num1,num2,cnt,tot);
        if(!f){  printf("No solution!\n");continue;}
        if(num1>0){///£¨Ì«¶à
            num1=0,num2=0,cnt=0,tot=0;
            for(int i = l-1 ; i>=0 ; i--){
                if(s[i] == '*'){
                    num2++,pos[++cnt] = i;
                }else if(s[i] == ')'){
                    num1++;
                }
                else if(s[i] == '('){
                    if(num1>0)  num1 --;
                    else if(num2>0){
                        num2--;//printf("??");
                        s[pos[++tot]] = ')';
                    }
                    else{
                        f=0;break;
                    }
                }
            }
        }
        if(!f)   printf("No solution!\n");
        else{//printf("??\n");
            for(int i = 0 ; i < l ; i++){
                if(s[i] =='*')  continue;
                printf("%c",s[i]);
            }printf("\n");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值