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. GitLab 迁移与升级

    参考: [ 博客园 BigBao ] 环境说明: OS: CentOS 7.x gitlab-ce 初始版本: 8.8.5 gitlab-ce 升级到版本: 11.2.3 升级方式: rpm 安装升级 ...

  2. (转)matlab练习程序(HOG方向梯度直方图)

    matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...

  3. 【转】使用SQL语句创建和删除约束

    转自http://blog.csdn.net/hamber_bao/article/details/6504905 约束的目的就是确保表中的数据的完整性. 常用的约束类型如下: 主键约束:(Prima ...

  4. 命令行创建KVM虚拟机

    qemu命令创建虚拟机: qemu-img create -f qcow2 /home/ubuntu.img 20G   qemu-system-x86_64 -m 2048 -enable-kvm ...

  5. ASP.NET MVC 文件上传

    如果想要用HTML表单实作文件上传的功能,那么必须在输出的<form>表单标签加上一个enctype属性,且内容必须设定为multipart/form-data,要通过Html.Begin ...

  6. unbutu下Io language的解释器安装

    今晚看Io,然后要安装解释器,然后就记录下来了... 首先去官网下载 http://iolanguage.com 在页面下方的binaries那里找到自己系统对应的版本,我的是x64deb的,本来是下 ...

  7. 2017多校第6场 HDU 6097 Mindis 计算几何,圆的反演

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6097 题意:有一个圆心在原点的圆,给定圆的半径,给定P.Q两点坐标(PO=QO,P.Q不在圆外),取圆 ...

  8. android 图片透明

    在ImageButton中载入图片后,图片周围会存在一圈白边,会影响到美观,其实解决这个问题有两种方法 一种方法是将ImageButton的背景改为所需要的图片.如:android:backgroun ...

  9. U43597 积木

    题目背景 小 XX 感到很无聊,从柜里翻出了小时候玩的积木. 题目描述 这套积木里共有 \(n\) 块,每块积木都是一个长方体. 小 X 想知道这些积木拼成一个积木塔(不必每一块 积木都使用). 所谓 ...

  10. PHP定界符出现错误

    Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or heredoc end (T ...