Link:

传送门

A:

按值大小插入后用树状数组统计两边个数

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+;
P dat[MAXN];
int n,bit[MAXN],dsp[MAXN],l[MAXN],r[MAXN],res,tot; void Update(int x)
{while(x<=n) bit[x]++,x+=x&(-x);}
int Query(int x)
{
int ret=;
while(x) ret+=bit[x],x-=x&(-x);
return ret;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&dat[i].X),dsp[++tot]=dat[i].X,dat[i].Y=i;
sort(dsp+,dsp+n+);tot=unique(dsp+,dsp+n+)-dsp-;
for(int i=;i<=n;i++)
dat[i].X=lower_bound(dsp+,dsp+tot+,dat[i].X)-dsp;
sort(dat+,dat+n+,greater<P>()); for(int i=;i<=n;i++)
{
l[i]=Query(dat[i].Y-);
r[i]=i--l[i];Update(dat[i].Y);
if(max(l[i],r[i])>min(l[i],r[i])*) res++;
}
printf("%d",res);
return ;
}

Problem A

B:

$dp[i][j][k]$表示前$i$项换$j$次末状态为$k$的最优解

每次分换或不换转移即可

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+;
char s[];int res=;
int n,m,dat[MAXN],dp[MAXN][][]; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%s",s+);
if(s[]=='H') dat[i]=;
else if(s[]=='P') dat[i]=;
else dat[i]=;
}
dp[][][dat[]]=;
for(int i=;i<n;i++)
for(int j=;j<=m;j++)
for(int k=;k<;k++)
{
dp[i+][j][k]=max(dp[i+][j][k],dp[i][j][k]+(k==dat[i+]));
for(int l=;l<;l++)
if(l!=k) dp[i+][j+][l]=max(dp[i+][j+][l],dp[i][j][k]+(l==dat[i+]));
}
for(int i=;i<=m;i++)
for(int j=;j<;j++)
res=max(res,dp[n][i][j]);
printf("%d",res);
return ;
}

Problem B

C:

一开始看到数据范围$n<20$感觉就是暴力……

最后发现用一个6维数组记录当前两点位置和朝向$bfs$就行了……

注意:

1、一个点到终点后就不再移动了!

2、学会用函数返回引用来简化代码,这样就不用每次写6维的数了……

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=;
char s[MAXN];
struct node{int x1,y1,d1,x2,y2,d2;};
queue<node> q;int res=<<;
int n,dat[MAXN][MAXN],d[][][][][][]; int dx[]={-,,,};
int dy[]={,,,-}; int nxt(int x){return (x+)%;}
int pre(int x){return (x+)%;}
void update(node x,node y)
{
int &a=d[x.x1][x.y1][x.d1][x.x2][x.y2][x.d2];
int &b=d[y.x1][y.y1][y.d1][y.x2][y.y2][y.d2];
if(a>b+) a=b+,q.push(x);
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s",s+);
for(int j=;j<=n;j++)
dat[i][j]=(s[j]=='E');
}
memset(d,0x3f,sizeof(d));
//注意一个点到终点后就不动了
d[n][][][n][][]=;
q.push((node){n,,,n,,});
while(!q.empty())
{
node t=q.front();q.pop();
node a=t,b=t,c=t;
if(!(t.x1==&&t.y1==n)) a.d1=nxt(a.d1),b.d1=pre(b.d1);
if(!(t.x2==&&t.y2==n)) a.d2=nxt(a.d2),b.d2=pre(b.d2); update(a,t);update(b,t); int fx1=c.x1+dx[c.d1],fx2=c.x2+dx[c.d2];
int fy1=c.y1+dy[c.d1],fy2=c.y2+dy[c.d2];
if(fx1>=&&fy1<=n&&dat[fx1][fy1]&&!(c.x1==&&c.y1==n)) c.x1=fx1,c.y1=fy1;
if(fx2>=&&fy2<=n&&dat[fx2][fy2]&&!(c.x2==&&c.y2==n)) c.x2=fx2,c.y2=fy2;
update(c,t);
} for(int i=;i<;i++)
for(int j=;j<;j++)
res=min(res,d[][n][i][][n][j]);
printf("%d",res);
return ;
}

Problem C

[USACO 2017 Jan Gold] Tutorial的更多相关文章

  1. [USACO 2018 Jan Gold] Tutorial

    Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...

  2. [USACO 2017 Dec Gold] Tutorial

    Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...

  3. [USACO 2017 Open Gold] Tutorial

    Link: 传送门 A: 由于每个颜色只染色一次就确定了所有要染色的区间 要求染色的次数其实就是求区间最多嵌套多少层,如果有区间相交则无解 以上操作明显可以将左端点排序后用栈来维护 #include ...

  4. [USACO 2017 Feb Gold] Tutorial

    Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h> using namespace std; #define X ...

  5. [USACO 2018 Feb Gold] Tutorial

    Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...

  6. bzoj258 [USACO 2012 Jan Gold] Bovine Alliance【巧妙】

    传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=111 传送门2:http://www.lydsy.com/JudgeOn ...

  7. bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】

    传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=110 传送门2:http://www.lydsy.com/JudgeOn ...

  8. USACO 2017 February Gold

    那天打cf前无聊练手 T1.Why Did the Cow Cross the Road 题目大意:N*N的矩阵,从左上角走到右下角,走一步消耗T,每走3步消耗当前所在位置上的权值,求最小消耗 思路: ...

  9. BZOJ1785[USACO 2010 Jan Gold 3.Cow Telephones]——贪心

    题目描述 奶牛们建立了电话网络,这个网络可看作为是一棵无根树连接n(1 n 100,000)个节点,节点编号为1 .. n.每个节点可能是(电话交换机,或者电话机).每条电话线连接两个节点.第i条电话 ...

随机推荐

  1. Computer(HDU2196+树形dp+树的直径)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 题目: 题意:有n台电脑,每台电脑连接其他电脑,第i行(包括第一行的n)连接u,长度为w,问你每 ...

  2. Codeforces Round #482 (Div. 2) B题

    题目链接:http://codeforces.com/contest/979/problem/B B. Treasure Hunt time limit per test1 second memory ...

  3. perl HTML::HeadParser获取html头部信息

    use LWP::Simple; use HTML::HeadParser; use utf8; binmode(STDOUT, ":encoding(gbk)"); #设置win ...

  4. 比 file_get_contents() 更优的 cURL 详解(附实例)

    PHP 可以使用 file_get_content() 函数抓取网页内容,但却无法进行更复杂的处理,譬如文件的上传或下载. Cookie 操作等等.而 cURL 提供了这些功能. 一.cURL简介 在 ...

  5. Linux I2C(一)之常用的几种实例化(i2c_client ) 【转】

    转自:http://blog.csdn.net/lugandong/article/details/48092397 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 前言 方式 ...

  6. 给windows设置隐藏文件夹的方法

    cls @ECHO OFF title Folder Private if EXIST "HTG Locker" goto UNLOCK if NOT EXIST Private ...

  7. 自动化测试===Macaca环境搭建和说明书

    https://www.cnblogs.com/tim2016/p/6400326.html http://www.cnblogs.com/fnng/p/5873878.html https://ww ...

  8. python基础===open()文件处理使用介绍

    本文转自:Python open()文件处理使用介绍 1. open()语法open(file[, mode[, buffering[, encoding[, errors[, newline[, c ...

  9. Linux(Unix)密码策略问题导致root密码不能修改

    Linux(Unix)密码策略问题导致root密码不能修改 发布时间:  2016-01-19 浏览次数:  1034 下载次数:  5 用户修改了密码配置文件,导致root账户修改密码时报如下错误: ...

  10. 【hihocoder】sam-3

    把Parent Tree拓扑排序下,然后从下往上合并. 具体的看官方题解啦~ #include<bits/stdc++.h> #define N 1000010 using namespa ...