2015 ACM/ICPC Asia Regional Shenyang Online题解

本文提供了多个ACM竞赛中的经典题目解决方案,涵盖状压DP、分块打表、线段树、字典树、最小割等算法,通过具体题目的解析,深入探讨算法的应用与实践。

以下所有AC题解程序来自“仙客传奇”团队。 AC题数:7/13 ABCFGJL


A. Traversal

AC的C++语言程序:

#include <bits/stdc++.h>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define scd(x) scanf("%d", &x)
#define clr(a, b) memset((a), (b), sizeof(a))
using namespace std;

const int LIM = 110;
const int MOD = 10007;
int dp[2][531441];    // 531441 is pow(3, 12)
int inval[LIM];
int state[LIM], dir[3] = {1};
int ts = 0;
int T, n, p, k, t, len, lim;

// state compressing
inline int code() {
    int ret = 0;
    lo(i, 0, len) ret = ret * 3 + state[i];
    return ret;
}

// state decompressing
inline void rcode(int cd) {
    rlo(i, len, 0) state[i] = cd % 3, cd /= 3;
}

// erase the state of (i-p-2)th point which is useless for point (i + 1)
inline void evolution() {
    rlo(i, len, 1) state[i] = state[i - 1];
    state[0] = 0;
}

int main() {
    scd(T);
    loe(_, 1, T) {
        ++ts;
        scd(n), scd(p), scd(k);
        dir[1] = p, dir[2] = p + 2;
        lo(i, 0, k) scd(t), inval[t] = ts;
        len = p + 3;
        lo(i, 0, len) state[i] = 2;
        int _pos = 0;
        clr(dp[_pos], 0);
        dp[_pos][lim = code()] = 1;
        lo(i, 0, n) {
            clr(dp[1 - _pos], 0);
            loe(j, 0, lim) {
                if (!dp[_pos][j]) continue;
                rcode(j);
                evolution();
                if (inval[i + 1] == ts) {
                    // if i + 1 is the invalid point
                    state[0] = 2;
                    if (state[p + 2] == 2) t = code(), dp[1 - _pos][t] = (dp[1 - _pos][t] + dp[_pos][j]) % MOD;
                } else {
                    // if i + 1 is an exist point
                    // try to create no edge
                    state[0] = 0;
                    if (state[p + 2] == 2) t = code(), dp[1 - _pos][t] = (dp[1 - _pos][t] + dp[_pos][j]) % MOD;
                    // try to create one edges
                    state[0] = 1;
                    lo(k, 0, 3) {
                        if (state[dir[k]] == 2) continue;
                        ++state[dir[k]];
                        if (state[p + 2] == 2) t = code(), dp[1 - _pos][t] = (dp[1 - _pos][t] + dp[_pos][j]) % MOD;
                        --state[dir[k]];
                    }
                    // try to create two edges
                    state[0] = 2;
                    lo(k, 0, 2) lo(w, k + 1, 3) {
                        if (state[dir[k]] == 2 || state[dir[w]] == 2) continue;
                        ++state[dir[k]], ++state[dir[w]];
                        if (state[p + 2] == 2) t = code(), dp[1 - _pos][t] = (dp[1 - _pos][t] + dp[_pos][j]) % MOD;
                        --state[dir[k]], --state[dir[w]];
                    }
                }
            }
            _pos = 1 - _pos;
        }
        printf("Case #%d: %d\n", _, dp[_pos][lim]);
    }
    return 0;
}
// 参考了:https://blog.youkuaiyun.com/johsnows/article/details/77511974
// 定义集合S的元素为二元组(x, y),其中x表示公园的标识,y表示这个点的度
// (之后将使用dp(i, S)来表示一个状态)
// 显然最后构成的结果要求所有点的度都是2
// 对于每个点i的度数,仅有与它距离为1、p、p + 2的点的度数与它相关,
// 如果把相关性的控制放在标识较大的点上,即点i仅影响与i - 1、i - p、i - p - 2点的度数,
// 相应地,i + 1、i + p、i + p + 2来控制对i点度数的影响。
// 对于点i,使用集合S来存储从i - p - 2到i点的度数,考虑点i + 1,
// 对于i + 1,集合S应当去掉i + 1 - p - 3这个点(因为点i + 1不会影响到这个点的度数,且对之后的点也没有影响)
// 相应地添加上i + 1这个点,此时S调整成对应到i + 1这个点的S,
// 先忽略题目中关于无效点的描述,则对于i + 1这个点它有三种选择:
// 暂时不进行连边、添加1条边、添加2条边,(特别地,应当约束一下添加上边后没有点的度数会超过2)。
// 这样就可以完成dp计数,接着考虑添加上无效的点。
// 对于无效的点,不进行连边,但是假设它的度数为2(防止因为它的缘故被漏记一些合法情况)。

题解链接:
hdu 5450 Traversal(状压dp)
hdu 5450 Traversal(状压dp)



B. Best Solver
AC的C++语言程序:

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e7 + 2;

typedef long long ll;
ll x , m;
ll f[MAXN + 3], p, emmm[MAXN + 3];

ll pow(ll x , ll n, ll mo) {
	if (n == 0) return 1;
	ll t = pow(x , n/2, mo);
	if (n & 1) return t * t % mo * x % mo;
	else return t * t % mo;
}

int main() {
	int T;
	scanf("%d", &T);
	memset(emmm, -1, sizeof(emmm));
	for (int cas = 1; cas <= T; cas++) {
		scanf("%lld%lld", &x, &m);
		f[0] = 2 % m;
		f[1] = 10 % m;
		if (emmm[m] == -1) {
			for (int i = 2;; i++) {
				f[i] = (f[i-1] * 10 % m- f[i -2] % m + m) % m;
				if (f[i] == f[1] && f[i-1] == f[0]) {
					p = i - 1;
					break;
				}
			}
			emmm[m] = p;
			//cout << "HERE" << endl;
		}
		p = emmm[m];
		ll r = ((pow(2, x, p) + 1) %p + p) %p;
		f[0] = 2 % m;
		f[1] = 10 % m;
		for (int i = 2; i <= r; i++) {
			f[i] = (f[i-1] * 10 % m- f[i -2] % m + m) % m;
		}
		//cout << "HERE" << endl;
		ll ans =( (f[r] - 1) % m + m ) % m;
		printf("Case #%d: %lld\n", cas, ans );
	}
}



C. Minimum Cut
AC的C++语言程序:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e4 + 2;
const int MAXM = 2e5 + 2;
int dutr[MAXN] , dug[MAXN];
const int INF  =0x3f3f3f3f;
int ans;
int main() {
	int T;
	scanf("%d", &T);
	for (int cas = 1; cas <= T; cas++){
		memset(dutr, 0, sizeof(dutr));
		memset(dug, 0, sizeof(dug));
		int n , m;
		scanf("%d%d", &n, &m);
		for (int i = 0; i < n - 1;i++){
			int u ,v;
			scanf("%d%d", &u,&v);
			dutr[u]++;
			dutr[v]++;
		}
		for (int i =0; i < m- n+1;i++){
			int u, v;
			scanf("%d%d", &u,&v);
			dug[u]++;
			dug[v]++;
		}
		ans = INF;
		for (int i = 1; i <= n;i++){
			 if (dutr[i] == 1){
			 	ans = min(ans, dug[i] + 1);
			 }
		}
		printf("Case #%d: %d\n",cas, ans);
	}
	return 0;
}

AC的C++语言程序:

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <set>
#include <map>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define pb push_back
#define mk make_pair
#define clr(a, b) memset((a), (b), sizeof(a))
typedef long long LL;
using namespace std;
// const int INF = 0x3f3f3f3f;
const int INF = 0x7fffffff;
// const LL INF = 0x3f3f3f3f3f3f3f3f;
// const LL INF = 0x7fffffffffffffff;
const int NIL = -1;
template <class T>
inline T mx(T a, T b) {return a > b ? a : b;}
template <class T>
inline T mi(T a, T b) {return a < b ? a : b;}
template <class T>
inline void sw(T &a, T &b) {
    T t = a; a = b; b = t;
}
template <class T>
inline T mabs(T x) {return x < 0 ? -x : x;}
inline char gc() {
    char ret;
    while ((ret = getchar()) == ' ' || ret == '\n' || ret == '\t');
    return ret;
}
const int LIM = 2e4 + 10;
int deg1[LIM], deg2[LIM];

int main() {
    // ios::sync_with_stdio(false);
    // cin.tie(NULL), cout.tie(NULL);
    int t, n, m, u, v;
    scanf("%d", &t);
    loe(k, 1, t) {
        scanf("%d%d", &n, &m);
        clr(deg1, 0), clr(deg2, 0);
        lo(i, 1, n) scanf("%d%d", &u, &v), deg1[u]++, deg1[v]++;
        loe(i, n, m) scanf("%d%d", &u, &v), deg2[u]++, deg2[v]++;
        int ans = INF;
        loe(i, 1, n) if (deg1[i] == 1) ans = mi(ans, 1 + deg2[i]);
        printf("Case #%d: %d\n", k, ans);
    }
    return 0;
}



D. Dividing This Product
题解链接:
hdu 5453 Dividing This Product(分块打表)



E. Excited Database
题解链接:
HDU 5454 Excited Database (2015年沈阳赛区网络赛E题)
HDU 5454 Excited Database【线段树】
hdu 5454 Excited Database(线段树)



F. Fang Fang
AC的C++语言程序:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<ctime>
#include<ctype.h>
#include<stdlib.h>
#include<bitset>
#include<algorithm>
#include<numeric> //accumulate
#define endl "\n"
#define fi first
#define se second
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)
#define mem(a,b) memset(a,b,sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
using namespace std;
const int maxn=2000000+5;
int n;
char s[maxn];
int check()
{
    int pos=0;
    while(s[pos]=='f')
        pos++;
    int st=pos;
    while(pos--)
    {
        s[n++]='f';
    }
    int ans=0;
    for(int i=st; i<n; i++)
    {

        if(s[i]=='f')
        {
            int j=i+1;
            while(j<n&&s[i]==s[j])
                j++;
            ans+=(j-i)/2;
            if((j-i)&1)
                ans++;
            i=j-1;
        }
        else if(s[i]=='c')
        {
            int j=i+1;
            if(s[j]!='f')
                return -1;
            while(j<n&&s[i+1]==s[j])
                j++;
            if(j-i<3)
                return -1;
            ans++;
            i=j-1;
        }
        else
            return -1;
    }
    return ans;
}
int main()
{
    //cin.tie(0);
    //cout.tie(0);
    //ios_base::sync_with_stdio(false);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int cas=0;
    rush()
    {
        scanf(" %s",s);
        int cnt=0;
        n=strlen(s);
        printf("Case #%d: %d\n",++cas,check());
    }
    return 0;
}




/*
int read()
{
    char c = getchar();
    int x = 0;
    for (; (c < 48 || c>57); c = getchar());
    for (; c > 47 && c < 58; c = getchar())
    {
        x = (x << 1) + (x << 3) + c - 48;
    }
    return x;
}
*/

AC的C++语言程序:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
char a[MAXN];
int cntf, ans;
int main() {
	int n;
	cin >> n;
	getchar();
	for (int i = 0; i< n;i++){
		printf("Case #%d: ", i + 1);
		gets(a);
		int flag1 = 1;
		for (int j = 0; j < strlen(a); j++)
			if (a[j] != 'c' && a[j] != 'f'){
				puts("-1");
				flag1 = 0;
				break;
			}
		if (!flag1) continue;
		int j= 0;
		while (a[j] == 'f' && j < strlen(a)) j++;
		if (j == strlen(a) && a[j-1] != 'c') {
			printf("%d\n", strlen(a) / 2 + strlen(a) % 2);
			continue;
		}
		int pos = j, flag = 1;
		j++;
		if (j == strlen(a)) j = 0;
		cntf = 0;ans = 0;
		while (j != pos){
			if (a[j] == 'c'){
				if (cntf < 2) {
					flag = 0; 
					break;
				}else ans++;
				cntf = 0;
			}else cntf++;
			j++;
			if (j == strlen(a)) j = 0;
		}
		if (cntf >= 2) ans++;
		else flag = 0;
		if (flag) printf("%d\n", ans);
		else printf("-1\n");
	}
	return 0;
} 

AC的C++语言程序:

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <set>
#include <map>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define pb push_back
#define mk make_pair
#define clr(a, b) memset((a), (b), sizeof(a))
typedef long long LL;
using namespace std;
// const int INF = 0x3f3f3f3f;
// const int INF = 0x7fffffff;
// const LL INF = 0x3f3f3f3f3f3f3f3f;
// const LL INF = 0x7fffffffffffffff;
const int NIL = -1;
template <class T>
inline T mx(T a, T b) {return a > b ? a : b;}
template <class T>
inline T mi(T a, T b) {return a < b ? a : b;}
template <class T>
inline void sw(T &a, T &b) {
    T t = a; a = b; b = t;
}
template <class T>
inline T mabs(T x) {return x < 0 ? -x : x;}
inline char gc() {
    char ret;
    while ((ret = getchar()) == ' ' || ret == '\n' || ret == '\t');
    return ret;
}

const int LIM = 1e6 + 10;
char str[LIM];

int main() {
    // ios::sync_with_stdio(false);
    // cin.tie(NULL), cout.tie(NULL);
    int n;
    scanf("%d", &n);
    getchar();
    loe(k, 1, n) {
        // scanf("%s", str);
        gets(str);
        int len = strlen(str);
        if (!len) {
            printf("Case #%d: ", k);
            printf("0\n");
            continue;
        }
        bool flag = true;
        lo(i, 0, len) if (str[i] != 'c' && str[i] != 'f') {flag = false; break;}
        if (!flag) {
            printf("Case #%d: ", k);
            printf("-1\n");
            continue;
        }
        flag = true;
        lo(i, 0, len) if (str[i] == 'c') {flag = false; break;}
        printf("Case #%d: ", k);
        if (flag) {
            printf("%d\n", len / 2 + len % 2);
        } else {
            flag = true;
            int cnt = 0;
            int cur = 0, ans = 0;
            lo(i, 0, len) if (str[i] == 'c') {cur = i; break;}
            cur = (cur + 1) % len;
            lo(i, 0, len) {
                if (str[cur] == 'c') {
                    if (cnt < 2) {
                        flag = false;
                        break;
                    }
                    cnt = 0;
                    ans++;
                } else if (str[cur] == 'f') {
                    cnt++;
                }
                cur++;
                if (cur >= len) cur -= len;
            }
            // cout << flag << endl;
            printf("%d\n", flag ? ans : -1);
        }
    }
    return 0;
}



G. Matches Puzzle Game
AC的C++语言程序:

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <set>
#include <map>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define pb push_back
#define mk make_pair
#define clr(a, b) memset((a), (b), sizeof(a))
typedef long long LL;
using namespace std;
// const int INF = 0x3f3f3f3f;
// const int INF = 0x7fffffff;
// const LL INF = 0x3f3f3f3f3f3f3f3f;
// const LL INF = 0x7fffffffffffffff;
const int NIL = -1;
template <class T>
inline T mx(T a, T b) {return a > b ? a : b;}
template <class T>
inline T mi(T a, T b) {return a < b ? a : b;}
template <class T>
inline void sw(T &a, T &b) {
    T t = a; a = b; b = t;
}
template <class T>
inline T mabs(T x) {return x < 0 ? -x : x;}
inline char gc() {
    char ret;
    while ((ret = getchar()) == ' ' || ret == '\n' || ret == '\t');
    return ret;
}
typedef unsigned int UI;
const int LIM = 510;
int mod;
int cost[] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
UI dp[LIM][2][2][2];
bool vis[LIM][2][2][2];

UI dfs(int r, int bv, int cv, int cr) {
    if (r < 0) return 0;
    if (r == 0 && (!cv || !bv)) return 0;
    if (vis[r][bv][cv][cr]) return dp[r][bv][cv][cr];
    UI &t = dp[r][bv][cv][cr];
    t = 0;
    if (bv && cv) {
        if (!cr && !r) return t = 1;
        else if (cr && r == 2) return t = 1;
        return t = 0;
    } else if (bv && !cv) {
        loe(i, 0, 9) {
            int sum = i + cr;
            int dig = sum % 10;
            if (i) t = (t + dfs(r - cost[dig] - cost[i], bv, 1, sum / 10)) % mod;
            t = (t + dfs(r - cost[dig] - cost[i], bv, 0, sum / 10)) % mod;
        }
    } else if (!bv && cv) {
        loe(i, 0, 9) {
            int sum = i + cr;
            int dig = sum % 10;
            if (i) t = (t + dfs(r - cost[dig] - cost[i], 1, cv, sum / 10)) % mod;
            t = (t + dfs(r - cost[dig] - cost[i], 0, cv, sum / 10)) % mod;
        }
    } else {
        loe(i, 0, 9) loe(j, 0, 9) {
            int sum = i + j + cr;
            int dig = sum % 10;
            if (i && j) t = (t + dfs(r - cost[dig] - cost[i] - cost[j], 1, 1, sum / 10)) % mod;
            if (i) t = (t + dfs(r - cost[dig] - cost[i] - cost[j], 1, 0, sum / 10)) % mod;
            if (j) t = (t + dfs(r - cost[dig] - cost[i] - cost[j], 0, 1, sum / 10)) % mod;
            t = (t + dfs(r - cost[dig] - cost[i] - cost[j], 0, 0, sum / 10)) % mod;
        }
    }
    vis[r][bv][cv][cr] = true;
    return t;
}

int main() {
    // ios::sync_with_stdio(false);
    // cin.tie(NULL), cout.tie(NULL);
    int t;
    scanf("%d", &t);
    loe(k, 1, t) {
        clr(vis, false);
        int n;
        scanf("%d%u", &n, &mod);
        printf("Case #%d: %u\n", k, dfs(n - 3, 0, 0, 0));
    }
    return 0;
}
//



H. Hold Your Hand
题解链接:
HDU 5457 Hold Your Hand【最小割+字典树】
HDU - 5457 Hold Your Hand (Trie + 最小割)
hdoj 5457 Hold Your Hand 【字典树 + 最小割】



I. Stability

树链剖:HDU 5458 Stability (2015 ACM/ICPC Asia Regional Shenyang Online)
Tarjan缩点+树剖+LCA+线段树:2015 ACM/ICPC Asia Regional Shenyang OnlineHDU-5458 Stability



J. Jesus Is Here
AC的C++语言程序:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<ctime>
#include<ctype.h>
#include<stdlib.h>
#include<bitset>
#include<algorithm>
#include<numeric> //accumulate
#define endl "\n"
#define fi first
#define se second
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)
#define mem(a,b) memset(a,b,sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
using namespace std;
const int maxn=201314+5;
const int MOD=530600414;
int n;
long long ans[maxn];
long long len[maxn],cnt[maxn],sum[maxn];
int main()
{
    //cin.tie(0);
    //cout.tie(0);
    //ios_base::sync_with_stdio(false);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    len[3]=3,len[4]=5;
    cnt[3]=cnt[4]=1;
    sum[3]=1,sum[4]=3;
    for(int i=5;i<=201314;i++)
    {
        len[i] = (len[i-1] + len[i-2])%MOD;
        cnt[i] = (cnt[i-1] + cnt[i-2])%MOD;
        sum[i] = (sum[i-1] + sum[i-2]+(len[i-2]*cnt[i-1])%MOD)%MOD;
        ans[i] = (ans[i-1] + ans[i-2]+(((len[i-2]*cnt[i-2]-sum[i-2])%MOD)*cnt[i-1])%MOD+(sum[i-1]*cnt[i-2])%MOD)%MOD;
    }
    int cas=0;
    rush()
    {
        cin>>n;
        printf("Case #%d: %lld\n",++cas,(ans[n]+MOD)%MOD);
    }
    return 0;
}




/*
int read()
{
    char c = getchar();
    int x = 0;
    for (; (c < 48 || c>57); c = getchar());
    for (; c > 47 && c < 58; c = getchar())
    {
        x = (x << 1) + (x << 3) + c - 48;
    }
    return x;
}
*/

AC的C++语言程序:

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e6;
const int N = 201314;
typedef long long ll;
const ll mod = 530600414;

ll len[MAXN], cnt[MAXN], sumpre[MAXN], sumaft[MAXN], ans[MAXN];
int main() {
	len[1] = 1; len[2] = 2;len[3] = 3,len[4] = 5;
	//ans[3] = 1;
	cnt[3] = 1,cnt[4] = 1;
	sumpre[3] = 0;
	sumaft[3] = 3;
	ans[4] = 0;
	for (int i = 4; i <= N;i++){
		len[i] = len[i-1] + len[i-2]; len[i] =len[i] % mod;
		cnt[i] = cnt[i-1] + cnt[i-2]; cnt[i] =cnt[i] % mod;
		sumpre[i] = sumpre[i-2] % mod+ sumpre[i-1] % mod +(len[i-2] %mod * cnt[i-1] % mod)%mod;
		sumpre[i] =sumpre[i] %  mod;
		sumaft[i] = sumaft[i-1] % mod + sumaft[i-2] % mod + (len[i-1] % mod *cnt[i-2] % mod) % mod;
		sumaft[i] =sumaft[i] % mod;
		ans[i] = sumpre[i-1] * cnt[i - 2] + sumaft[i-2] * cnt[i-1] + ans[i-1] + ans[i-2];
		ans[i] = ans[i] % mod;
	}
/*	for (int i = 1; i < 10;i++){
		cout << i << ": " << len[i] << " " << cnt[i] << " " << sumpre[i] << " " << sumaft[i] << " " << ans[i] << endl;
	}*/
	int T;
	cin >> T;
	for (int cas = 1; cas <= T; cas++){
		int i;
		cin >> i;
		printf("Case #%d: %lld\n",cas, ans[i]);
		//cout << ans[i] << endl;
	}
	return 0;
}

AC的C++语言程序:

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <set>
#include <map>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define pb push_back
#define mk make_pair
#define clr(a, b) memset((a), (b), sizeof(a))
typedef long long LL;
using namespace std;
// const int INF = 0x3f3f3f3f;
// const int INF = 0x7fffffff;
// const LL INF = 0x3f3f3f3f3f3f3f3f;
// const LL INF = 0x7fffffffffffffff;
const int NIL = -1;
template <class T>
inline T mx(T a, T b) {return a > b ? a : b;}
template <class T>
inline T mi(T a, T b) {return a < b ? a : b;}
template <class T>
inline void sw(T &a, T &b) {
    T t = a; a = b; b = t;
}
template <class T>
inline T mabs(T x) {return x < 0 ? -x : x;}
inline char gc() {
    char ret;
    while ((ret = getchar()) == ' ' || ret == '\n' || ret == '\t');
    return ret;
}
const int LIM = 201314 + 10;
const LL MOD = 530600414;
LL ans[LIM], pre[LIM], suf[LIM], cnt[LIM], len[LIM];

int main() {
    // ios::sync_with_stdio(false);
    // cin.tie(NULL), cout.tie(NULL);
    // build
    cnt[3] = 1, cnt[4] = 1;
    pre[3] = 0, pre[4] = 2;
    suf[3] = 3, suf[4] = 3;
    len[3] = 3, len[4] = 5;
    for (int i = 5; i < LIM; i++) {
        ans[i] = (ans[i - 2] + ans[i - 1] + pre[i - 1] * cnt[i - 2] % MOD + suf[i - 2] * cnt[i - 1] % MOD) % MOD;
        pre[i] = (pre[i - 1] + len[i - 2] * cnt[i - 1] % MOD + pre[i - 2]) % MOD;
        suf[i] = (suf[i - 1] + len[i - 1] * cnt[i - 2] % MOD + suf[i - 2]) % MOD;
        cnt[i] = (cnt[i - 1] + cnt[i - 2]) % MOD;
        len[i] = (len[i - 1] + len[i - 2]) % MOD;
    }
    int t;
    scanf("%d", &t);
    loe(k, 1, t) {
        int n;
        scanf("%d", &n);
        printf("Case #%d: ", k);
        printf("%lld\n", ans[n]);
    }
    return 0;
}



K. Poker
题解链接:
hdu 5460 Poker(暴力)
2015沈阳网络赛K hdu5460(二进制枚举)



L. Largest Point
AC的C++语言程序:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<ctime>
#include<ctype.h>
#include<stdlib.h>
#include<bitset>
#include<algorithm>
#include<numeric> //accumulate
#define endl "\n"
#define fi first
#define se second
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)
#define mem(a,b) memset(a,b,sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
using namespace std;
const int maxn=5000000+5;
int n;
int a,b;
int t[maxn];
vector<int> ans;
int main()
{
    //cin.tie(0);
    //cout.tie(0);
    //ios_base::sync_with_stdio(false);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int cas=0;
    rush()
    {
        cin>>n>>a>>b;
        ans.clear();
        for(int i=0; i<n; i++)
        {
            scanf("%d",&t[i]);
        }
        sort(t,t+n);
        ans.push_back(0),ans.push_back(n-1);
        ans.push_back(1),ans.push_back(n-2);
        int m1=0,m2=0;
        for(int i=2; i<n-2; i++)
        {
            if(abs(t[i])<=abs(t[m1]))
            {
                m1=i;
            }
            else if(abs(t[i])<=abs(t[m2]))
            {
                m2=i;
            }
        }
        ans.push_back(m1);
        ans.push_back(m2);
        sort(ans.begin(),ans.end());
        ans.erase(unique(ans.begin(),ans.end()),ans.end());
        int sz=ans.size();
        long long mx=1ll*t[0]*t[0]*a+1ll*t[1]*b;
        for(int i=0; i<1<<sz; i++)
        {
            int cnt=0;
            int x1=-1,x2=-1;
            for(int j=0; j<sz; j++)
            {
                if(i>>j&1)
                    cnt++;
            }
            if(cnt==2)
            {
                for(int j=0; j<sz; j++)
                    if(i>>j&1)
                    {
                        if(x1==-1)
                            x1=j;
                        else
                            x2=j;
                    }
                mx=max(mx,1ll*t[ans[x1]]*t[ans[x1]]*a+1ll*t[ans[x2]]*b);
                mx=max(mx,1ll*t[ans[x2]]*t[ans[x2]]*a+1ll*t[ans[x1]]*b);
            }
        }
        printf("Case #%d: %lld\n",++cas,mx);
    }
    return 0;
}




/*
int read()
{
    char c = getchar();
    int x = 0;
    for (; (c < 48 || c>57); c = getchar());
    for (; c > 47 && c < 58; c = getchar())
    {
        x = (x << 1) + (x << 3) + c - 48;
    }
    return x;
}
*/

AC的C语言程序:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 5*1e6;

long long A[N + 10],B[N + 10],C[N + 10];

int main()
{
	int T;
	
	cin>>T;
	for(int t = 1;t <= T;++t)
	{
		int n,a,b;
		long long ans;
		
		cin>>n>>a>>b;
		for(int i = 0;i < n;++i)
		{
			scanf("%lld",&A[i]);
			B[i] = a * A[i] * A[i];
			C[i] = b * A[i];
		}
		
		sort(B,B + n);
		sort(C,C + n);
		
		if((!a||!b)||(B[n - 1]/a == C[n - 1]/b*C[n - 1]/b))
			ans = max(B[n - 2] + C[n - 1],B[n - 1] + C[n - 2]);
		else
			ans = B[n - 1] + C[n - 1];
			
		printf("Case #%d: %lld\n",t,ans);	
	}
	
	return 0;
}

AC的C语言程序:

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <set>
#include <map>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define pb push_back
#define mk make_pair
#define clr(a, b) memset((a), (b), sizeof(a))
typedef long long LL;
using namespace std;
// const int INF = 0x3f3f3f3f;
// const int INF = 0x7fffffff;
// const LL INF = 0x3f3f3f3f3f3f3f3f;
// const LL INF = 0x7fffffffffffffff;
const int NIL = -1;
template <class T>
inline T mx(T a, T b) {return a > b ? a : b;}
template <class T>
inline T mi(T a, T b) {return a < b ? a : b;}
template <class T>
inline void sw(T &a, T &b) {
    T t = a; a = b; b = t;
}
template <class T>
inline T mabs(T x) {return x < 0 ? -x : x;}
inline char gc() {
    char ret;
    while ((ret = getchar()) == ' ' || ret == '\n' || ret == '\t');
    return ret;
}
struct Node {
    int first, second;
};
const int LIM = 5e6 + 10;
Node l[LIM];
LL a, b;

inline bool cmp1(const Node &u, const Node &v) {
    return a * u.first * u.first > a * v.first * v.first;
}
inline bool cmp2(const Node &u, const Node &v) {
    return b * u.first > b * v.first;
}
inline LL sq(LL x) {return x * x;}
int main() {
    // ios::sync_with_stdio(false);
    // cin.tie(NULL), cout.tie(NULL);
    int t, n;
    scanf("%d", &t);
    loe(k, 1, t) {
        scanf("%d%lld%lld", &n, &a, &b);
        lo(i, 0, n) scanf("%d", &l[i].first), l[i].second = i;
        sort(l, l + n, cmp1);
        int l1 = l[0].first, p1 = l[0].second, l2 = l[1].first;
        sort(l, l + n, cmp2);
        int r1 = l[0].first, p3 = l[0].second, r2 = l[1].first;
        printf("Case #%d: ", k);
        if (p1 != p3) printf("%lld", a * sq(l1) + b * r1);
        else printf("%lld", mx(a * sq(l2) + b * r1, a * sq(l1) + b * r2));
        putchar('\n');
    }
    return 0;
}



M. Manors
题解链接:
hdu 5462 Manors(半平面交)
Manors HDU - 5462

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值