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;
}
#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;
}
#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;
}