[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条电话 ...
随机推荐
- Unity下的ECS框架 Entitas简介
最近随着守望先锋制作组在gdc上发布的一个关于ecs的talk,ecs这个架构算是得到了一定的曝光度. 在这之前,github上就一直有一个C#的ecs框架名为Entitas,截止现在已经有1300+ ...
- SQL Server Delete Duplicate Rows
There can be two types of duplication of rows in a table 1. Entire row getting duplicated because th ...
- 伪病毒 Rp_test
第一个写的对电脑有破坏性的程序= =,然后发现写system的copy的时候不会用字符串替代路径,然后就萎了= =,只能写一个没有自身复制的伪病毒了,坑到了好多同学的电脑,23333.... //By ...
- bzoj 1854 游戏 二分图匹配 || 并查集
题目链接 Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的 ...
- Python脚本 - 常用单位转换
测试系统为:Centos 6.7 Python版本为: 3.6.4 脚本功能:常用单位的转换,这里用内存来模拟 import pstuil def bytes2human(n): symbols = ...
- Professional Linux Kernel Architecture 笔记 —— 中断处理(Part 2)【转】
转自:http://blog.163.com/vic_kk/blog/static/494705242010719483774/ Table of Contents 1 中断 1.1 中断的类型 1. ...
- Makefile系列之三 : 变量
一.变量的基础 变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来.如果你要使用真实的“$”字符,那么你需要用“$$”来表示 ...
- web中的CSS、Xpath等路径定位方法学习
今天不到八点就到公司了,来的比较早,趁着有点时间,总结下web中的CSS.Xpath等路径定位定位的方式吧! 简单的介绍下xpath和css的定位 理论知识就不罗列了 还是利用博客园的首页.直接附上代 ...
- C#面向对象(OOP)入门—第一天—多态和继承(方法重载)
面向对象是什么 面向对象是一种基于对象的编程方法,它取代了仅仅依靠方法和流程的编程方式.面向对象的编程语言中,对象(object)其实就是指特定类型.或某个类的实例.面向对象使得编程人员更容易组织和管 ...
- linux命令(49):wget命令
Linux wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器.如果我们使用虚拟主机,处理这样的 ...