2018-2019 ACM-ICPC, Asia Shenyang Regional Contest题解

以下所有AC题解程序来自“仙客传奇”团队。


A. Sockpuppets


B. Sequences Generator


C. Insertion Sort

AC的C++语言程序:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll f(ll a,ll q)
{
    ll ret=a;
    while(--a)
    {
        ret*=a;
        ret%=q;
    }
    ret%=q;
    return ret;
}
int main()
{
    ll n,k,q;
    int T,kase=0;
    cin>>T;
    while(T--)
    {
        cin>>n>>k>>q;
        if(n<=k+1)
        {
            cout<<"Case #"<<++kase<<": "<<f(n,q)<<endl;
        }
        else
        {
            ll num=2*f(k+1,q)%q+f(k,q)%q;
            num%=q;
            ll a=2*f(k,q)%q;
            ll b=3*f(k,q)%q+f(k+1,q);
            while(n>k+2)
            {
                num+=b;
                num%=q;
                b+=a;
                b%=q;
                n--;
            }
            cout<<"Case #"<<++kase<<": "<<num<<endl;
        }
    }
    return 0;
}

AC的C++语言程序:

#include <iostream>

using namespace std;
typedef long long LL;

LL dp[51];

int main(void) {
    int t;
    LL n, k, q;
    scanf("%d", &t);
    for (int v = 1; v <= t; v++) {
        scanf("%lld%lld%lld", &n, &k, &q);
        if (k >= n - 1) {
            LL ans = 1;
            for (LL i = n; i >= 2; i--)
                ans = ans * i % q;
            printf("Case #%d: %lld\n", v, ans % q);
            continue;
        }
        dp[1] = 1;
        for (LL crse = 1, i = 2; i < 51; i++, crse += 2)
            dp[i] = (dp[i - 1] + crse) % q;
        LL ans = 1;
        if (k == 1) ans = dp[n];
        else {
            for (LL i = k; i >= 2; i--)
                ans = ans * i % q;
            ans = ans * (dp[n - k] + (k + 1) * (n - k) % q - 1) % q;
        }
        printf("Case #%d: %lld\n", v, ans % q);
    }
    return 0;
}

AC的C++语言程序:

#include<iostream>
using namespace std;
typedef long long ll;
ll dp[55][55];

ll get(int k,int mod)
{
	int b = k;
	ll res = 1;
	while(b)
	{
		res = (res * b) % mod;
		b--;
	}
	return res;
}

int main()
{
	int t,n,k,q;//
	
	dp[1][1] = dp[1][0] = 1;
	cin>>t;
	for(int test = 1;test <= t;++test)
	{
		cin>>n>>k>>q;
		for(int i = 2;i <= n;++i)
			dp[i][1] = (dp[i - 1][1] + 2 * i - 3) % q;
		if(k > n - 1)	k = n - 1;
		dp[n][k] = (get(k,q) * (dp[n - k][1] + (k + 1) * (n - k) % q - 1) % q) % q;
		cout<<"Case #"<<test<<": "<<dp[n][k]<<endl;
	}
	
	return 0;
}

D. Diameter of a Tree


E. The Kouga Ninja Scrolls


F. Counting Sheep in Ami Dongsuo


G. Best ACMer Solves the Hardest Problem

AC的C++语言程序:

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

const int maxv = 1e7 + 10;
const int maxn = 6006;
int n, m;
typedef pair<int, int> pp;
vector<pp >v[maxv],cc;
int mp[maxn][maxn];
ll lastans;
int poww[maxv];
set<pair<int,int> >cnt;
set<pair<int,int> >::iterator it;
int dir[4][2]= {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};

void init() {
	for(int i = 0; i <= 6000; i++) {
		for(int j = 0; j <= 6000; j++) {
			if(i * i + j * j <= 1e7) {
				v[i * i + j * j].push_back(make_pair(i, j));
			} else
				continue;
		}
	}
}

int judge(int x,int y) {
	if(x <= 0 || y <= 0 || x > 6000 || y > 6000)
		return 0;
	return 1;
}

int main() {
	init();
	int t;
	scanf("%d", &t);
	for(int cas = 1; cas <= t; cas++) {
		cc.clear();
		printf("Case #%d:\n", cas);
		lastans = 0;
		scanf("%d %d", &n, &m);
		for(int i = 1; i <= n; i++) {
			int x, y, w;
			scanf("%d %d %d", &x, &y, &w);
			mp[x][y] = w;
			cc.push_back(make_pair(x, y));
		}
		for(int qq = 1; qq <= m; qq++) {
			int op, x, y, w, k;
			scanf("%d", &op);
			if(op == 1) {
				scanf("%d %d %d", &x, &y, &w);
				x = (x + lastans) % 6000 + 1;
				y = (y + lastans) % 6000 + 1;
				mp[x][y] = w;
				cc.push_back(make_pair(x, y));
			} else if(op == 2) {
				scanf("%d %d", &x, &y);
				x = (x + lastans) % 6000 + 1;
				y = (y + lastans) % 6000 + 1;
				mp[x][y] = 0;
			} else if(op == 3) {
				scanf("%d %d %d %d",&x, &y, &k, &w);
				x = (x + lastans) % 6000 + 1;
				y = (y + lastans) % 6000 + 1;
				cnt.clear();
				for(int i = 0; i < v[k].size(); i++) {
					int xx = v[k][i].first;
					int yy = v[k][i].second;
					for(int j = 0; j <= 3; j++) {
						int nx = xx * dir[j][0] + x;
						int ny = yy * dir[j][1] + y;
						if(judge(nx, ny) && mp[nx][ny] != 0) {
							cnt.insert(make_pair(nx, ny));
						}
					}
				}
				for(set<pp> :: iterator it = cnt.begin(); it != cnt.end(); it++) {
					mp[it -> first][it -> second] += w;
				}
			} else {
				scanf("%d %d %d", &x, &y, &k);
				x = (x + lastans) % 6000 + 1;
				y = (y + lastans) % 6000 + 1;
				cnt.clear();
				for(int i = 0; i < v[k].size(); i++) {
					int xx = v[k][i].first;
					int yy = v[k][i].second;
					for(int j = 0; j <= 3; j++) {
						int nx = xx * dir[j][0] + x;
						int ny = yy * dir[j][1] + y;
						if(judge(nx, ny) && mp[nx][ny] != -1) {
							cnt.insert(make_pair(nx, ny));
						}
					}
				}
				ll ans = 0;
				for(set<pp>::iterator it = cnt.begin(); it != cnt.end(); it++) {
					ans += mp[it ->first][it->second];
				}
				lastans=ans;
				printf("%lld\n",ans);
			}
		}
		for(int i = 0; i < cc.size(); i++) {
			mp[cc[i].first][cc[i].second] = 0;
		}
	}
	return 0;
}

AC的C++语言程序:

#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
#include <set>

using namespace std;

typedef long long LL;
const int LIM = 6010;
const int SIZE = 10000001;
int wei[LIM][LIM];
int valid[LIM][LIM];
vector<pair<int, int>> crease[SIZE];
int dir[2][4] = {1, 1, -1, -1, 1, -1, 1, -1};
// 不要每次都memset会超时
int main(void) {
    LL lastAns;
    int t, n, m, x, y, w, op, k, cur, nx, ny;
    scanf("%d", &t);
    for (int i = 0; i <= 6000; i++)
        for (int j = 0; j <= 6000; j++)
            if ((cur = i * i + j * j) < SIZE)
                crease[cur].push_back(make_pair(i, j));
    for (int v = 1; v <= t; v++) {
        // init
        printf("Case #%d:\n", v);
        lastAns = 0;
        scanf("%d%d", &n, &m);
        for (int i = 0; i < n; i++) {
            scanf("%d%d%d", &x, &y, &w);
            wei[x][y] = w;
            valid[x][y] = v;
        }
        set<int> vis;
        while (m--) {
            scanf("%d%d%d", &op, &x, &y);
            x = (x + lastAns) % 6000 + 1;
            y = (y + lastAns) % 6000 + 1;
            switch (op) {
                case 1:
                    scanf("%d", &w);
                    wei[x][y] = w;
                    valid[x][y] = v;
                    break;
                case 2:
                    valid[x][y] = 0;
                    break;
                case 3:
                    vis.clear();
                    scanf("%d%d", &k, &w);
                    for (auto ite : crease[k]) {
                        for (int i = 0; i < 4; i++) {
                            nx = x + ite.first * dir[0][i];
                            ny = y + ite.second * dir[1][i];
                            if (nx >= 0 && nx <= 6000 && ny >= 0 && ny <= 6000
                                && valid[nx][ny] == v && !vis.count(cur = nx * 6001 + ny))
                                wei[nx][ny] += w, vis.insert(cur);
                        }
                    }
                    break;
                case 4:
                    vis.clear();
                    scanf("%d", &k);
                    LL ans = 0;
                    for (auto ite : crease[k]) {
                        for (int i = 0; i < 4; i++) {
                            nx = x + ite.first * dir[0][i];
                            ny = y + ite.second * dir[1][i];
                            // printf("x = %d, y = %d\n", nx, ny);
                            if (nx >= 0 && nx <= 6000 && ny >= 0 && ny <= 6000
                                && valid[nx][ny] == v && !vis.count(cur = nx * 6001 + ny))
                                ans += wei[nx][ny], vis.insert(cur);
                        }
                    }
                    lastAns = ans;
                    printf("%lld\n", ans);
                    break;
            }
        }
    }
    return 0;
}

H. Rainbow Graph


I. Distance Between Sweethearts


J. How Much Memory Your Code Is Using?

AC的C++语言程序:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
int main(){
	int n,t;
//	freopen("memory your code is using.txt","r",stdin);
	string name,typ;
	ios::sync_with_stdio(false);
	cin>>t;
	for(int kase=1;kase<=t;++kase){
		cin>>n;
//		cout<<n<<endl;
		long long men=0;
		for(int i=0;i<n;++i){
			cin>>typ;
			cin>>name;
	//								cout<<typ<<endl<<name<<endl;
			if(typ=="long"){
				if(name=="long") typ="ll";
				else if(name=="double") typ="ld";
				cin>>name;
			}
			long long num=0;
			for(int i=0;i<name.length();++i){
				if(name[i]=='['){
					++i;
					while(name[i]>='0' && name[i]<='9')
						num=num*10+name[i]-48,++i;
				}
			}
			if(!num) num=1;
			if(typ=="char" || typ=="bool") 
				men+=num*1;
			else if(typ=="int"  || typ=="float" )
				men+=num*4;
			else if(typ=="ll" || typ=="double")
				men+=num*8;
			else if(typ=="__int128" || typ=="ld")
				men+=num*16;
		}
		men =!(men%1024) ? men/1024 : men/1024+1 ; 
		printf("Case #%d: %d\n",kase,men);
	}
}

AC的C++语言程序:

#include <iostream>
#include <string>

using namespace std;

typedef long long LL;


/*
    int
    bool
    char
    float
    double
    __int128
    long double
    long long
*
*/

inline int getCnt(const string &s) {
    int i = 0;
    for (; i < s.size() && s[i] != '['; i++);
    if (i == s.size()) return 1;
    int ret = 0;
    for (i++; i < s.size() && s[i] != ']'; i++) {
        ret = ret * 10 + s[i] - '0';
    }
    return ret;
}

int main(void) {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    string str, var;
    int n, t, cnt;
    cin >> t;
    for (int k = 1; k <= t; k++) {
        cin >> n;
        LL ans = 0;
        while (n--) {
            cin >> str;
            if (str == "long") {
                cin >> str >> var;
                cnt = getCnt(var);
                switch (str[0]) {
                    case 'l':
                        ans += cnt * 8;
                        break;
                    case 'd':
                        ans += cnt * 16;
                        break;
                }
            } else {
                cin >> var;
                cnt = getCnt(var);
                switch (str[0]) {
                    case 'i':
                        ans += 4 * cnt;
                        break;
                    case 'b':
                        ans += cnt;
                        break;
                    case 'c':
                        ans += cnt;
                        break;
                    case 'f':
                        ans += 4 * cnt;
                        break;
                    case 'd':
                        ans += 8 * cnt;
                        break;
                    case '_':
                        ans += 16 * cnt;
                        break;
                }
            }
        }
        cout << "Case #" << k << ": " << (ans + 1023) / 1024 << '\n';
    }
    return 0;
}

AC的C++语言程序:

#include<bits/stdc++.h>
using namespace std;
int main() {
	int kase = 0;
	int T;
	cin >> T;
	while( T-- ) {
		int n;
		int ans = 0;
		int num;
		cin >> n;
		getchar();
		for(int i = 0; i < n; i++) {
			string s;
			int tmp;
			getline(cin, s);
			//cout<<s<<endl
			string str = s;
			if(s[0] == 'b') tmp = 1;
			else if(s[0] == 'c') tmp = 1;
			else if(s[0] == 'i') tmp = 4;
			else if(s[0] == 'd') tmp = 8;
			else if(s[0] == 'f') tmp = 4;
			else if(s[0] == '_') tmp = 16;
			else if(s[0] == 'l') {
				if(s[5]=='l')tmp=8;
				else if(s[5]=='d')tmp=16;
			}
			int loc1 = str.find("[");
			num = 0;
			if(loc1 != -1) {
				int loc2 = str.find("]");
				for(int i = loc1 + 1; i < loc2; i++) {
					num = num * 10 + s[i] - '0';
				}
			}
			if(num) tmp *= num;
			ans += tmp;
		}
		ans = ceil((double)ans/1024);
		cout << "Case #" << ++kase << ": " << ans << endl;
	}
	return 0;
}

AC的C++语言程序:

#include<bits/stdc++.h>

using namespace std;

map<string,int> mp;

inline void init(){
    mp.insert(make_pair("bool",1));
    mp.insert(make_pair("char",1));
    mp.insert(make_pair("int",4));
    mp.insert(make_pair("float",4));
    mp.insert(make_pair("long long",8));
    mp.insert(make_pair("double",8));
    mp.insert(make_pair("long double",16));
    mp.insert(make_pair("__int128",16));
}

int main(){
//    freopen("in.txt","r",stdin);
    int T;
//    ios::sync_with_stdio(false);
    cin>>T;
    init();
    for(int cs=1;cs<=T;cs++){
        int n;
        cin>>n;
        cin.ignore();
        string s;
        long long sum=0;
        while(n--){
            getline(cin,s);
            int id=s.find_last_of(" ");
            string ss=s.substr(0,id);
            if((id=s.find('['))!=string::npos){
                string sss=s.substr(id+1);
                long long num=0;
                for(int i=0;sss[i]!=']';i++){
                    num=num*10+sss[i]-'0';
                }
                sum+=num*mp[ss];
            }else{
                sum+=mp[ss];
            }
        }
        cout<<"Case #"<<cs<<": "<<(sum-1)/1024+1<<endl;
    }
    return 0;
}

AC的C++语言程序:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int tran=1024;
int f(string str)
{
	int len=str.size();
	int flag=0;
	int j,s_num=0;
	for(int i=0;i<len;i++)
	{
		if(str[i]==';') break;
		if(str[i]=='['){
			flag=1; 
			for(j=i+1;;j++){
				if(str[j]==']') break;
				s_num=s_num*10+str[j]-'0';
			}
			i=j+1;
		} 
	}
	if(!flag) return 1;
	else 
	return s_num;
}
int main()
{
	int t,cnt=0,n;
	scanf("%d",&t);
	string str;
	while(t--)
	{
		scanf("%d",&n);
		getchar();
		long long num=0;//字节 
		while(n--)
		{
			getline(cin,str);
			int len=str.size();
			if(str[0]=='b'||str[0]=='c')//bool 一字节 
			{
				num+=f(str); 
			}
			else if(str[0]=='i'||str[0]=='f')
			{
				num+=4*f(str);
			//	cout<<num<<endl;
			}
			else if(str[0]=='d'){
				num+=8*f(str);
			}
			else if(str[0]=='_'){
				num+=16*f(str);
			}
			else if(str[0]=='l')
			{
				if(str[5]=='d'){//long double  想用  substr   判断double 结果不对emm 
					num+=16*f(str);
				}
				else{
					num+=8*f(str);
				}
			}
			//cout<<num<<endl;
		}
		//cout<<num<<endl;
		int ans;
		if(num%tran==0) ans=num/tran;
		else ans=1+num/tran; 
		printf("Case #%d: %d\n",++cnt,ans);
	}
	return 0;
}

K. Let the Flames Begin

AC的C++语言程序:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
    int T,kase=0;
    ll n,m,k;
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld%lld%lld",&n,&m,&k);
        printf("Case #%d: ",++kase);
        if(n==1)
        {
            printf("1\n");
            continue;
        }
        if(k==1)
        {
            printf("%lld\n",m);
            continue;
        }
        ll sum=n-m+1;
        ll ans=(sum+k-1)%sum;
        while(sum<n)
        {
            if(m>k)
            {
                ll t=sum-ans;
                t/=k;
                t=min(n-sum,t);
                sum+=t;
                ans=(ans+t*k)%sum;
                if(sum==n) break;
            }
            sum++;
            ans=(ans+k)%sum;
            if(sum==n) break;
            //cout<<sum<<endl;
        }
        printf("%lld\n",ans+1);
    }
    return 0;
}

AC的C++语言程序:

#include <iostream>
#include <cmath>

using namespace std;

typedef long long LL;
// m小直接推,k小按k推,一圈都转不完不用推
int main(void) {
    LL n, m, k;
    int t;
    scanf("%d", &t);
    for (int w = 1; w <= t; w++) {
        scanf("%lld%lld%lld", &n, &m, &k);
        if (k == 1) {
            printf("Case #%d: %lld\n", w, m * k);
            continue;
        }
        LL tn, tm, fcrt;
        tn = n - m + 1, tm = 1;
        fcrt = (k - 1) % tn;
        if (m > k) {
            LL t;
            while (tm < m) {
                t = min((tn - fcrt) / k + 1, m - tm);
                // printf("tm = %lld, tn = %lld, (tn - fcrt) / k + 1 = %lld, m - tm = %lld, t is %lld\n", tm, tn, (tn - fcrt) / k + 1, m - tm, t);
                tm += t, tn += t;
                fcrt = (fcrt + t * k) % tn;
            }
            fcrt++;
        } else {
            while (tm < m) {
                tn++, tm++;
                fcrt = (fcrt + k) % tn;
            }
            fcrt++;
        }
        printf("Case #%d: %lld\n", w, fcrt);
    }
    return 0;
}

L. Machining Disc Rotors


M. Renaissance Past in Nancy

猜你喜欢

转载自blog.csdn.net/tigerisland45/article/details/89597329