[USACO 2017 Jan Gold] Tutorial
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的更多相关文章
- [USACO 2018 Jan Gold] Tutorial
Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...
- [USACO 2017 Dec Gold] Tutorial
Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...
- [USACO 2017 Open Gold] Tutorial
Link: 传送门 A: 由于每个颜色只染色一次就确定了所有要染色的区间 要求染色的次数其实就是求区间最多嵌套多少层,如果有区间相交则无解 以上操作明显可以将左端点排序后用栈来维护 #include ...
- [USACO 2017 Feb Gold] Tutorial
Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h> using namespace std; #define X ...
- [USACO 2018 Feb Gold] Tutorial
Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...
- bzoj258 [USACO 2012 Jan Gold] Bovine Alliance【巧妙】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=111 传送门2:http://www.lydsy.com/JudgeOn ...
- 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 ...
- USACO 2017 February Gold
那天打cf前无聊练手 T1.Why Did the Cow Cross the Road 题目大意:N*N的矩阵,从左上角走到右下角,走一步消耗T,每走3步消耗当前所在位置上的权值,求最小消耗 思路: ...
- BZOJ1785[USACO 2010 Jan Gold 3.Cow Telephones]——贪心
题目描述 奶牛们建立了电话网络,这个网络可看作为是一棵无根树连接n(1 n 100,000)个节点,节点编号为1 .. n.每个节点可能是(电话交换机,或者电话机).每条电话线连接两个节点.第i条电话 ...
随机推荐
- 大聊Python----json与pickle数据序列化
用于序列化的两个模块 ☆json,用于字符串和python数据类型间进行转换 ☆pickle,用于python特有的类型和python的数据类型间进行转换 Json模块提供了四个功能:dumps.du ...
- Spring Boot提供的特性
一.导览 本文主要按以下模块介绍spring Boot(1.3.6.RELEASE)提供的特性. SpringApplication类 外部化配置 Profiles 日志 开发WEB应用 Securi ...
- 【转】gif文件格式详解
1.概述 ~~~~~~~~ GIF(Graphics Interchange Format,图形交换格式)文件是由 CompuServe公司开发的图形文件格式,版权所有,任何商业目的使用均须 Comp ...
- perl HTML::LinkExtor模块(1)
use LWP::Simple; use HTML::LinkExtor; $html = get("http://www.baidu.com"); $link = HTML::L ...
- uoj#35 后缀排序(后缀数组模版)
#include<bits/stdc++.h> #define N 100005 using namespace std; char s[N]; int a[N],c[N],t1[N],t ...
- 【LabVIEW技巧】工厂模式_简单工厂
前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...
- 使用js创建select option
var v_select = document.getElementById("selectA"); var v_option = document.createElement( ...
- debian下没有公钥解决办法
debian下没有公钥解决办法 执行命令:apt-get update 出现如下错误 正在读取软件包列表... 完成 W: 以下 ID 的密钥没有可用的公钥: 8B48AD6246925 ...
- javascript 实现图片放大镜功能
淘宝上经常用到的一个功能是利用图片的放大镜功能来查看商品的细节 下面我们来实现这样一个功能吧,原理很简单: 实现一个可以随鼠标移动的虚框 在另外一个块中对应显示虚框中的内容 实现思路: 虚框用css中 ...
- 《java并发编程实战》读书笔记12--原子变量,非阻塞算法,CAS
第15章 原子变量与非阻塞同步机制 近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令(例如比较并交换指令)代替锁老确保数据在并发访问中的一致性. 15.1 锁的劣势 ...