题目:Subsegments
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
int a[maxn];
set<int>S;
multiset<int>M;
int main()
{
int n, k;
scanf("%d %d", &n, &k);
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
for(int i = 1; i <= k; i++)
{
int v = a[i];
if(!M.count(v))S.insert(v);
else if(S.count(v))S.erase(v);
M.insert(v);
}
if(S.size() == 0)printf("Nothing\n");
else cout<<*(--S.end())<<endl;
for(int i = k+1; i <= n; i++)
{
multiset<int>::iterator pos = M.find(a[i-k]);
M.erase(pos);
if(!M.count(a[i-k]) && S.count(a[i-k]))S.erase(a[i-k]);
else if(M.count(a[i-k]) == 1 && !S.count(a[i-k]))S.insert(a[i-k]);
if(!M.count(a[i]))S.insert(a[i]);
else if(S.count(a[i]))S.erase(a[i]);
if(S.size() == 0)printf("Nothing\n");
else cout<<*(--S.end())<<endl;
M.insert(a[i]);
}
return 0;
}
题目:Destroying Array
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
#define LL long long
LL a[maxn];
int p[maxn];
LL fa[maxn];
bool vis[maxn];
LL sum[maxn], ans[maxn];
inline int Find(int x)
{
return fa[x]==x?x:fa[x]=Find(fa[x]);
}
inline void Init(int n){
for(int i = 1; i <= n; i++)fa[i] = i;
}
int main(){
int n;
scanf("%d", &n);
Init(n);
for(int i = 1; i <= n; i++)scanf("%lld", &a[i]);
for(int i = 1; i <= n; i++)scanf("%d", &p[i]);
ans[n] = 0;
for(int i = n; i > 1; i--){
int t = p[i];
sum[t] = a[t];
if(vis[t-1]){
int f1,f2;
f1 = Find(t);
f2 = Find(t-1);
fa[f1] = f2;
sum[f2] += sum[f1];
}
if(vis[t+1]){
int f1,f2;
f1 = Find(t);
f2 = Find(t+1);
fa[f1] = f2;
sum[f2] += sum[f1];
}
ans[i-1] = max(sum[Find(t)], ans[i]);
vis[t] = true;
}
for(int i = 1; i <= n; i++){
printf("%lld\n", ans[i]);
}
return 0;
}
题目:The Two Routes
思路:仔细读题意可知,从1~n之间不是存在一条直通的铁路就是公路,然后用最短路求另外一种就可以了。
代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
#define Max 1<<20
const int Maxn = 410;
int ma1[Maxn][Maxn], dis[Maxn], ma2[Maxn][Maxn];
int vis[Maxn];
int n, m;
queue<int>q;
void SPFA(int st, int ma[Maxn][Maxn])
{
int i, j;
for(i = 1; i <= n; i++)
{
dis[i] = Max;
vis[i] = 0;
}
vis[st] = 1;
dis[st] = 0;
q.push(st);
while(!q.empty())
{
int t = q.front();
vis[t] = 1;
q.pop();
for(i = 1; i <= n; i++)
{
if(dis[i] > dis[t] + ma[t][i])
{
dis[i] = dis[t] + ma[t][i];
if(!vis[i])
{
vis[i] = 1;
q.push(i);
}
}
}
vis[t] = 0;
}
}
int main(){
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
ma1[i][j] = ma2[i][j] = Max;
}
}
for(int i = 0; i < m; i++){
int t1, t2;
cin>>t1>>t2;
ma1[t1][t2] = ma1[t2][t1] = 1;
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(ma1[i][j] == Max){
ma2[i][j] = 1;
}
}
}
int ans = 0;
if(ma1[1][n] == 1 || ma1[n][1] == 1){
SPFA(1, ma2);
}
else {
SPFA(1, ma1);
}
if(dis[n] == Max)printf("-1\n");
else printf("%d\n", dis[n]);
return 0;
}
题目:Gargari and Bishops
思路:就是求出两个斜对角线,然后你会发现,只能是在横纵角标的和奇偶中选,然后贪心一下就可以了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 2010;
int a[maxn][maxn];
LL r[maxn<<1], l[maxn<<1];
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
scanf("%d", &a[i][j]);
r[i+j] += a[i][j];
l[n+i-j] += a[i][j];
}
}
LL max1 = -1, max2 = -2;
int x1, y1, x2, y2;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
LL ret = r[i+j]+l[n+i-j]-a[i][j];
if(((i+j)&1) && ret > max1){
max1 = ret;
x1 = i;
y1 = j;
}
if(!((i+j)&1) && ret > max2 ){
max2 = ret;
x2 = i;
y2 = j;
}
}
}
printf("%lld\n", max1+max2);
printf("%d %d %d %d\n", x1, y1, x2, y2);
return 0;
}
题目:Infinite Maze
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 2000;
char mp[maxn][maxn];
int n,m;
typedef pair<int,int> pII;
const int dx[4]={1,-1,0,0};
const int dy[4]={0,0,1,-1};
pII last[maxn][maxn];
bool ans=false;
void dfs(int x,int y)
{
int mx=x%n,my=y%m;
if(mp[mx][my]=='#'||ans||last[mx][my]==pII(x,y)) return;
if(last[mx][my] != pII(0,0))
{
ans=true; return ;
}
last[mx][my]=pII(x,y);
for(int i=0;i<4;i++)
{
dfs(x+dx[i],y+dy[i]);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",mp[i]);
int st,en;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(mp[i][j]=='S')
st=i,en=j;
}
}
dfs(st+n*m,en+n*m);
if(ans) puts("Yes");
else puts("No");
return 0;
}