Codeforces Round #346 (Div. 2)

10 篇文章 0 订阅
7 篇文章 0 订阅

A. Round House

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#define inf (1<<28)
#define mod 1000000007
#define MAXN 100000
#define MAXM 100000
using namespace std;
typedef long long LL;

int n;

int main()
{
	int i,j,k;
	int a,b;

	while(~scanf("%d%d%d",&n,&a,&b))
	{
		cout<<((a-1+b)%n+n)%n+1<<endl;
	}

	return 0;
}


B - Qualifying Contest

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#define inf (1<<28)
#define mod 1000000007
#define MAXN 100000
#define MAXM 100000
using namespace std;
typedef long long LL;

int n,m;

int main()
{
	int i,j,k;
	int a,b;
	string s;

	vector<pair<int,string> > mp[MAXN];

	while(cin>>n>>m)
	{
		for(i=1;i<=n;i++)
			cin>>s>>a>>b,mp[a].push_back({-b,s});

		for(i=1;i<=m;i++)
		{
			sort(mp[i].begin(),mp[i].end());
			if(mp[i].size() > 2 && mp[i][1].first == mp[i][2].first)
				cout<<"?"<<endl;
			else
				cout<<mp[i][0].second<<" "<<mp[i][1].second<<endl;
		}
	}

	return 0;
}


C - Tanya and Toys


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#define inf (1<<28)
#define mod 1000000007
#define MAXN 100000
#define MAXM 100000
using namespace std;
typedef long long LL;
#pragma comment(linker, "/STACK:10240000")
int n,m;

int main()
{
	int i,j,k;
	int a,b;
	
	cin>>n>>m;
	map<int,int> mp;
	vector <int> vv;

	for(i=1;i<=n;i++)
	{
		cin>>k;
		mp[k] = 1;
	}
	
	int sum;
	sum = m;
	for(i=1;i<=m;i++)
	{
		if(!mp[i])
		{
			sum -= i;
			if(sum < 0)
			  break;
			vv.push_back(i);
		}
	}
	  
	cout<<vv.size()<<endl;
	for(i=0;i<vv.size();i++)
	  cout<<vv[i]<<" ";
	cout<<endl;

	return 0;
}


D - Bicycle Race

根据最高点的走向来判断河相对于路偏向于左还是右,然后遍历边,判断走的方向是不是指向河,指向就危险

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#define inf (1<<28)
#define mod 1000000007
#define MAXN 1000 + 10
#define MAXM 100000
using namespace std;
typedef long long LL;
int n,m;

//只和最高点有关 
int x[MAXN],y[MAXN];
int dir;
int ans;

inline int check(int a)
{
	int aa = x[a] - x[a-1];
	int bb = y[a] - y[a-1];
	if(aa > 0 && !bb)
	  return 2;
	if(!aa && bb > 0)
	  return 1;
	if(!aa && bb < 0)
	  return 3;
	if(!bb && aa < 0)
	  return 4;
}

int main()
{
	int i,j,k;
	
	cin>>n;
	x[0] = y[0] = 0;

	for(i=1;i<=n+1;i++)
	{
		cin>>x[i]>>y[i];
		if(y[i] >= y[0])
		{
		   dir =( x[i] >= x[0] ) ? 1: -1;
		   x[0] = x[i],y[0] = y[i];
        }
	}
	
	for(i=2,ans=0;i<=n;i++)
	{
		int a = check(i);
		int b = ((check(i+1)-1 + dir)%4+4)%4+1;
		//cout<<a<<" "<<b<<endl;
		if(a == b)
		  ans++;
	}

    cout<<ans<<endl;
    
	return 0;
}

E - New Reform

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#define met(a,b) memset(a,b,sizeof(a))
#define inf (1<<28)
#define mod 1000000007
#define MAXN 100000 + 10
#define MAXM 100000
using namespace std;
typedef long long LL;

int n,m;
int ans;

//存在环入度不为0,与环相连入度也不为0 
//链存在一个入度为0
int ff[MAXN],flag[MAXN];

int find(int x) { return ff[x] == x ? x : ff[x] = find(ff[x]);}

void fun(int a,int b)
{
	int x = find(a);
	int y = find(b);
	
	if(x != y)
	{
		ff[x] = y;
		flag[y] |= flag[x];
	}
	else
	   flag[x] = flag[y] = 1;
}

int main()
{
	int i,j,k;
	int a,b;
	
	cin>>n>>m;
	met(flag,0);
	for(i=1;i<=n;i++)
	  ff[i] = i;
	  
	for(i=1;i<=m;i++)
	{
		cin>>a>>b;
		fun(a,b);
	}
    
    for(i=1,ans = 0;i<=n;i++)
    {
    	int t = find(i);
    	if(t == i && !flag[t])
    	  ans++;
	}
	
	cout<<ans<<endl;
	return 0;
}

F - Polycarp and Hay

DFS

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#define met(a,b) memset(a,b,sizeof(a))
#define inf (1<<28)
#define mod 1000000007
#define MAXN 1000100
#define MAXM 100000
using namespace std;
typedef long long LL;

int n,m;
LL k;
int ans;
int ary[1110][1110];
int pri[1110][1110];
int vis[1110][1110];
int sort_ary[MAXN];
LL cnt;
LL cishu;
int find_num;

void dfs(int x,int y)
{
	if(pri[x][y] || ary[x][y] < find_num || x > n || x < 1 || y > m || y < 1)
	  return ;
	if(cnt == cishu)
	  return ;
	if(ary[x][y] >= find_num)
	{
		vis[x][y] = 1;
		 cnt++;
		 pri[x][y] = find_num;
	}
	
	dfs(x-1,y);
	dfs(x+1,y);
	dfs(x,y-1);
	dfs(x,y+1);
}

void printout()
{
   for(int i=1;i<=n;i++)
   {
     for(int j=1;j<=m;j++)
        cout<<pri[i][j]<<" ";
     cout<<endl;
   }
}

int solve(int x)
{
	int i,j;
	memset(pri,0,sizeof(pri));
	memset(vis,0,sizeof(vis));
	find_num = x;
	
	for(i=1;i<=n;i++)//判断联通 
	{
		for(j=1;j<=m;j++)
		{
			if(!vis[i][j] && ary[i][j] == x)
			{
				cnt = 0;
				dfs(i,j);
				if(cnt == cishu)
				{
				    cout<<"YES"<<endl;
				    printout();
				    return 1;
				}
				else
				  met(pri,0);
			}
		}
	}
	
	return 0;
}

int main()
{
	int i,j,t;
	int a,b,res;
	
	cin>>n>>m>>k;
	
	for(i=1,t=0;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
		    cin>>ary[i][j];
		    sort_ary[t++] = ary[i][j];
		}
	}
	
	sort(sort_ary,sort_ary+t);
	  
	for(i=0;i<t;i++)
	{
		if(k < sort_ary[i])
		  break;
		if(sort_ary[i] == sort_ary[i-1])
		  continue;
		if(k % sort_ary[i] == 0)
		{
			cishu = k / sort_ary[i];
			if(cishu <= n*m-i)
			{
				res = solve(sort_ary[i]);
				if(res)
				  return 0;
			}
		}
	}
	
	cout<<"NO"<<endl;
	
	return 0;
}
BFS
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#define met(a,b) memset(a,b,sizeof(a))
#define inf (1<<28)
#define mod 1000000007
#define MAXN 1000100
#define MAXM 100000
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;

int n,m;
LL k;
int ans;
int ary[1110][1110];
int pri[1110][1110];
int vis[1110][1110];
int mp[2][4]={{1,-1,0,0},{0,0,1,-1}};
LL cnt;
LL cishu;
int find_num;

int bfs(pii pa)
{
	find_num = ary[pa.first][pa.second];
	memset(vis,0,sizeof(vis));
	queue<pii> qq;
	qq.push(pa);
	vis[pa.first][pa.second] = 1;
	pii pt;
	while(!qq.empty())
	{
		pt = qq.front();
		qq.pop();
		if(cnt == cishu)
		  return 1;
		for(int i=0;i<4;i++)
		{
			int xx = pt.first + mp[0][i];
			int yy = pt.second + mp[1][i];
			if(pri[xx][yy] || vis[xx][yy] || ary[xx][yy] < find_num || xx>n || xx<1 || yy > m || yy < 1)
			  continue;
			if(ary[xx][yy] == find_num ) pri[xx][yy] = 1;
			cnt++;
			vis[xx][yy] = 1;
		    if(cnt == cishu)
		       return 1;
			qq.push({xx,yy});
		}
	}
	
	return 0;
}

void printout(int num)
{
   for(int i=1;i<=n;i++)
   {
     for(int j=1;j<=m;j++)
        if(vis[i][j])
          cout<<num<<" ";
        else
          cout<<"0 ";
     cout<<endl;
   }
}

int solve()
{
	memset(pri,0,sizeof(pri));
	int i,j;
	for(i=1;i<=n;i++)//判断联通 
	{
		for(j=1;j<=m;j++)
		{
			if(pri[i][j])
			  continue;
			cishu = k / ary[i][j];
			if(k % ary[i][j] == 0 && cishu <= n*m)
			{
				
				cnt = 1;
				if(bfs(pii(i,j)))
				{
				    cout<<"YES"<<endl;
				    return 1;
				}
			}
		}
	}
	
	return 0;
}

int main()
{
	int i,j,t;
	int a,b,res;
	
	cin>>n>>m>>k;
	
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
		    cin>>ary[i][j];
		    
    res = solve();
	
	if(res)
	  printout(find_num);
	else
    	cout<<"NO"<<endl;
	
	return 0;
}

G - Fence Divercity

可以看成三个部分,前面的不包含i列的总情况,第i列单独的情况,和第i列组成的情况再乘以min(h[i],h[i-1])

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#define met(a,b) memset(a,b,sizeof(a))
#define inf (1<<28)
#define mod 1000000007
#define MAXN 1000000 + 10
#define MAXM 100000
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;

int n;
LL h[MAXN];
LL dp[MAXN][2] = {0};

int main()
{
	int i,j,t;
	
	cin>>n;
	
	for(i=1;i<=n;i++)
		scanf("%I64d",&h[i]),h[i]--;
	
	for(i=1;i<=n;i++)
	{
		dp[i][0] = (dp[i-1][0] + dp[i-1][1]*min(h[i],h[i-1]) + h[i] ) % mod;
		dp[i][1] = (min(h[i+1],h[i]) + min(min(h[i-1],h[i]),h[i+1]) * dp[i-1][1]) % mod;
	}
	
	cout<<dp[n][0]<<endl;
	return 0;
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值