[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条电话 ...
随机推荐
- 【NOIP】提高组2013 积木大赛
[算法]找规律(听说还有写RMQ的www) [题解]ans+=(a[i]-a[i-1]) (i=1...n)(a[i]>a[i-1]) 后面比前面大k,说明要新叠加k个区间来达到所需高度.(看 ...
- iOS多线程
iOS开发Demo(示例程序)源代码
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址(2013年12月29日更新版) iOS程序源代码下载链接:01.大任务.zip22 ...
- Go从入门到精通(持续更新)
1.0 搭建环境 由于我们 Go官方网站 在我大天朝被和谐了,所以我们只能去 Go语言中文网 来下载了.Go的安装很简单,不像Java还要配置一大堆的东西,选择自己系统的对应版本,下载安装,像安装QQ ...
- 有关计数问题的dp
问题一:划分数 问题描述 有n个去区别的物体,将它们划分成不超过m组,求出划分方法数模M的余数. 我们定义dp[i][j],表示j的i划分的总数 将j划分成i个的话,可以先取出k个,然后将剩下的j-k ...
- MSSQL DBOtherSQL
--------------------------查询表中的数据------------------------------ --1.请查询出MyStudent表中的所有数据 --下面的语句表示查询 ...
- MVC4 AspNet MVC下的Ajax / 使用JQuery做相关的Ajax请求
源码参考:链接:http://pan.baidu.com/s/1pKhHHMj 密码:mkr4 1:新建-->项目-->Web-->ASP.NET MVC 4 Web 应用程序.命 ...
- Less & Sass
CSS不是一种编程语言.它开发网页样式,但是没法用它编程.也就是说,CSS基本上是设计师的工具,它没有变量,也没有条件语句,只是一行行单纯的描述.有人就开始为CSS加入编程元素,这被叫做"C ...
- 使用BackgroundWorker
1,WPF应用程序为单线程模型(STAThread),所有UI控件都是主线程创建的,只有主线程能操作UI元素的显示. 2,其他工作线程要维护UI控件的显示,需调用主线程的Dispather,执行Inv ...
- linux下暴力破解工具hydra【转】
一.简介 Number one of the biggest security holes are passwords, as every password security study shows. ...
- Android 聊天软件客户端
1.代码架构图 2.qq.model层 3.qq.app层 4.qq.Constatnt层 5.qq.util层 6.qq.broadcast层 7.qq.control层 8.qq.view层 9. ...