HZNU Dec. Team Training 2题解

HZNU Dec. Team Training 2

A - Amateur Chess Players(Gym - 102606A)

题意:一个棋盘,Cuber QQ有n个棋和Quber CC有m个棋,没人可以拿同一条直线的棋子,每次至少拿一个,Cuber QQ先手,谁拿不了谁就输。
要想赢,每次只拿一个,就比较n,m。

代码:

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x&-x)
#define debug cout<<"What fuck!!"<<endl
#define fcio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
int main(){
	int n,m;
	while(cin>>n){
		string s;
		for(int i=1;i<=n;++i)cin>>s;
		cin>>m;
		for(int i=1;i<=m;++i)cin>>s;
		if(n>m)cout<<"Cuber QQ"<<endl;
		else cout<<"Quber CC"<<endl;
	} 
	return 0;
}

B - Position in Fraction(CodeForces - 900B )

题意:找到a/b小数点后第一次出现c的位置

代码:

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x&-x)
#define debug cout<<"What fuck!!"<<endl
#define fcio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
map<int,int>mp;
int main(){
	int a,b,c;
	while(cin>>a>>b>>c){
		int now=0,cnt=0;
		a*=10;
		while(1){
			mp[a]++;
			if(a<b){
				cnt++;
				if(a==0)a=10;
				else a*=10;
				now=0;
			}
			else{
				now=a/b;
				a=a%b;
				cnt++;
				a*=10;
			}
			if(now==c){
				cout<<cnt<<endl;
				break;
			}
			if(mp[a]){
				cout<<-1<<endl;
				break;
			}
		}
	}
	return 0;
}

C - LIKE vs CANDLE (HDU - 4799)

题意:若干微博账户形成了一个转发树(即一个有根树)。每个账户有自己的价值,每个账户也有自己的态度(赞或蜡烛)。如果一个账户的态度是“赞”,它的价值就会被加到“赞”的一边,反之亦然。Edward可以从“赞”的一边拿出X 的价值去翻转一个账户,即把它的态度换到相反的一边。但是Edward 发现,有的账户已经被别人翻转过了,对于这些账户,Edward就要花费Y的价值去翻转它们。一旦一个账户被翻转了一次,它的所有子账户也会被翻转一次。求“赞”的一边的价值总数与“蜡烛”一边的价值总数的最大差值。若最大差值为负数则输出“HAHAHAOMG”。

代码:

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x&-x)
#define debug cout<<"What fuck!!"<<endl
#define fcio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=50010;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
int dp[maxn][2];
//dp[][0]---不翻转的最大值 
//dp[][1]---翻转的最大值 
int n,x,y;
int v[maxn],s[maxn];
//v---得分,正数支持like,负数支持candle
//s---标记是否翻转,0为没翻转,1为翻转 
int f,p; 
bool vis[maxn],flag;
vector<int>eg[maxn];
void init(){
	for(int i=0;i<=n;++i)eg[i].clear();
	memset(vis,false,sizeof vis);
	memset(dp,0,sizeof dp);
	flag=false;
}
void dfs(int u){
	vis[u]=true;
	if(s[u])flag^=1;
	if(flag)v[u]=-v[u];
	dp[u][0]=v[u];
	dp[u][1]-=v[u];
	for(int i=0;i<eg[u].size();++i){
		int to=eg[u][i];
		if(!vis[to]){
			dfs(to);
			if(s[to]){
				dp[u][0]=dp[u][0]+max(dp[to][0],dp[to][1]-y);
				dp[u][1]=dp[u][1]+max(dp[to][1],dp[to][0]-y);
			}
			else{
				dp[u][0]=dp[u][0]+max(dp[to][0],dp[to][1]-x);
				dp[u][1]=dp[u][1]+max(dp[to][1],dp[to][0]-x);
			}
		}
	}
	if(s[u])flag^=1;
}
int main(){
	fcio;
	while(cin>>n>>x>>y){
		init();
		for(int i=1;i<=n;++i){
			cin>>v[i]>>f>>s[i]>>p;
			if(p)v[i]=-v[i];
			eg[f].push_back(i);
		}
		dfs(0);
		if(dp[0][0]<0)cout<<"HAHAHAOMG"<<endl;
		else cout<<dp[0][0]<<endl;
	}
	return 0;
}


D - Idiotic Suffix Array (Gym - 102606I)

题意:构造一个字符串,使本身在所有后缀字符串中从小到大排序为k,比较字符串时,第一个不相等的字符按字母表排序。并且当a是b的前缀是,a<b.
例如:a<aba

代码

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x&-x)
#define debug cout<<"What fuck!!"<<endl
#define fcio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
int main(){
	fcio;
	int n,k;
	while(cin>>n>>k){
		for(int i=1;i<=n;++i){
			if(i==n-k+1)cout<<'b';
			else cout<<'a';
		}
		cout<<endl;
	}
	return 0;
}

E - Find / -type f -or -type d (Gym - 102606F)

代码:

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x&-x)
#define debug cout<<"What fuck!!"<<endl
#define fcio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n;
string s[maxn];
map<string,int>vis;
set<string>se;
int main(){
	while(cin>>n){
		for(int i=1;i<=n;++i)cin>>s[i];
		for(int i=1;i<=n;++i){
			string tmp;
			for(int j=0;j<s[i].length();){
				if(s[i][j]=='/'){
					tmp=tmp+'/';
					j++;
					while(j<s[i].length()&&s[i][j]!='/'){
						tmp=tmp+s[i][j];
						j++;
					}
					se.insert(tmp);//每个目录或文件名字 
					if(j<s[i].length())//将目录标记 
						vis[tmp]=1;
				}
			}
		}
		int cnt=0;
		for(auto it:se){
			if(!vis[it]){
				int len=it.length();
				if(it.length()>=5&&it[len-1]=='j'&&it[len-2]=='o'&&it[len-3]=='e'&&it[len-4]=='.')//符合条件 
					cnt++;
			}
		}
		cout<<cnt<<endl;
	}
	return 0;
}

F - Even Degree (Gym - 102606E)

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x&-x)
#define debug cout<<"What fuck!!"<<endl
#define fcio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=5e5+10;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
vector<pair<int,int> >vec[maxn];
pair<int,int>f[maxn];
bool vis[maxn],used[maxn];
int now[maxn],ans[maxn],cnt,res[maxn],tot;
int n,m;
void dfs(int u){
	used[u]=1;
	while(now[u]<vec[u].size()){
		int v=vec[u][now[u]].first;
		int id=vec[u][now[u]].second;
		now[u]++;
		if(vis[id])continue;
		vis[id]=1;
		dfs(v);
		ans[++cnt]=id;
	}
}
int ano(int x,int id){
	return f[id].first^f[id].second^x;
}
int main(){
	fcio;
	while(cin>>n>>m){
		for(int i=1;i<=m;++i){
			int u,v;
			cin>>u>>v;
			f[i]=make_pair(u,v);
			vec[u].push_back(make_pair(v,i));
			vec[v].push_back(make_pair(u,i));
		}
		for(int i=1;i<=n;++i){
			if(!vec[i].size())continue;
			if(!used[i]){
				cnt=0;
				dfs(i);
				int now=i;
				int nex=ano(i,ans[1]); 
				res[++tot]=ans[1];
				for(int j=2;j<cnt;++j){
					if(ano(nex,ans[j])==now){
						res[++tot]=ans[j+1];
						res[++tot]=ans[j];
						nex=ano(now,ans[j+1]);
						j++;
					}
					else{
						res[++tot]=ans[j];
						nex=ano(nex,ans[j]);
					}
				}
			}
		}
		cout<<tot<<endl;
		for(int i=1;i<=tot;++i){
			cout<<res[i];
			if(i==tot)cout<<endl;
			else cout<<" ";
		}
	}
	return 0;
}

G - Invitation Cards (POJ - 1511)

#include <iostream>
#include <cmath>
#include <string>
#include <queue>
#include <cstring>
#include <list>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <fstream>
#include <cstdlib>
#include <sstream>
#include <stack>
#define fcio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define eps 1e-12
#define MEM(a,b) memset(a,b,sizeof a)
using namespace std;
typedef long long ll;
const int maxn = 1000010;
const ll inf = 0x3f3f3f3f3f3f3f3f;
ll dis[2][maxn];
int n, m, x, len, px;
class node {
public:
	int n;
	ll v;
	node() {}
	node(int x, ll y) :n(x), v(y) {}
	bool operator<(const node& a)const {
		return v == a.v ? n > a.n : ( !px ? v<a.v : v > a.v);
	}
};
class edge {
public:
	int to;
	int next;
	ll cost;
	edge() {}
	edge(int x,int y, ll z) :to(x),next(y), cost(z) {}
};
edge G[maxn*2];
int head[2][maxn];
bool vis[maxn];
void dijkstra(int fx) {
	priority_queue<node> que;
	dis[fx][1] = 0;
	que.push(node(1, 0)); //把起点推入队列
	MEM(vis, 0);
	while (!que.empty())
	{
		node p = que.top(); que.pop();
		int v = p.n; //顶点的编号
		if (vis[v]) continue;//d[v]可能经过松弛后变小了,原压入堆中的路径失去价值
		vis[v] = 1;
		for (int i = head[fx][v];i;i = G[i].next) {//利用最短边进行松弛
			int to = G[i].to;
			ll w = dis[fx][v] + G[i].cost;
			if (dis[fx][to] > w) {
				dis[fx][to] = w;
				que.push(node(to, dis[fx][to]));
			}
		}
	}
}
void init() {
	MEM(dis, inf);
	len = 1;
	MEM(head,0);
}
void add(int fx, int u, int v, ll w) {
	G[len].cost = w;
	G[len].to = v;
	G[len].next = head[fx][u];
	head[fx][u] = len++;
}
int main()
{
	fcio;
	int t;
	scanf("%d", &t);
	while (t--) {
		scanf("%d%d", &n, &m);
		init();
		ll c;
		for (int i = 0, a, b; i < m; i++)
			scanf("%d%d%lld", &a, &b, &c), add(0, a, b, c), add(1, b, a, c);
		px = 0;
		dijkstra(0);
		px = 1;
		dijkstra(1);
		ll maxx = 0;
		for (int i = 1; i <= n; i++)
			maxx += dis[0][i] + dis[1][i];
		printf("%lld\n", maxx);
	}
	return 0;
}

H - Thanos’s snap (Gym - 102409I )
在这里插入图片描述
代码:

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x&-x)
#define debug cout<<"What fuck!!"<<endl
#define fcio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=5e6+10;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
ll fac[maxn],inv[maxn],dp[maxn];
ll fun(int m,int n){
	if(n==m||m==0)return 1;
	return fac[n]*inv[m]%mod*inv[n-m]%mod;
} 
ll qpow(ll a, ll b) {
    ll res = 1;
    while (b) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
void init(){
	fac[0]=1;
	for(int i=1;i<=5000000;++i)fac[i]=(fac[i-1]*i)%mod;
	inv[5000000]=qpow(fac[5000000],mod-2);
	for(int i=4999999;i>=0;--i)inv[i]=(inv[i+1]*(i+1))%mod;
	dp[5000000]=195206359;
	dp[0]=1;
	for(int i=4999999;i>=0;--i)dp[i]=(dp[i+1]+fun(i,5000000)*195206359)%mod;
}
int main(){
	fcio;
	int T;
	init();
	while(cin>>T){
		while(T--){
			int n;
			cin>>n;
			cout<<dp[n]<<endl;
		}
	}
	return 0;
}

I - Heat Pipes (Gym - 102606H)
题解博客:https://blog.csdn.net/qq_41552508/article/details/107831363

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值