Link:

传送门

A:

对于每一条分割线,设本不应在其左侧的个数为$x$

重点要发现每次一来一回的操作恰好会将一对分别应在左/右侧的一个数从右/左移过去

这样就转直接用树状数组求出最大的$x$即可

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+;
//res至少为1
int n,bit[MAXN],res=;P dat[MAXN]; 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),dat[i].Y=i;
sort(dat+,dat+n+); for(int i=;i<n;i++)
Update(dat[i].Y),res=max(res,i-Query(i));
printf("%d",res);
return ;
}

Problem A

冒泡排序相关题多考虑数与数相对位置以及每个数应在的位置

B:

发现答案具有单调性后首先想到二分答案或是直接枚举

由于不用重复建图,直接枚举看起来能更快一些,不过好像并不能在线$O(logn)$判断是否出现了环……

(按照杨主力的指示还是在google上搜到了论文,不过并不打算学,传送门

剩下就是优先队列套拓扑排序就行了

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef long long ll;
typedef pair<int,int> P;
typedef double db;
const int MAXN=1e5+;
vector<int> dat[MAXN];
struct edge{int nxt,to;}e[MAXN<<];
int n,m,num,x,head[MAXN],res[MAXN],in[MAXN],tot; void add_edge(int x,int y)
{e[++tot].nxt=head[x];e[tot].to=y;head[x]=tot;}
void build(int x)
{
tot=;
memset(in,,sizeof(in));
memset(head,,sizeof(head));
for(int i=;i<=x;i++)
for(int j=;j<dat[i].size()-;j++)
add_edge(dat[i][j],dat[i][j+]),in[dat[i][j+]]++;
}
bool check()
{
int sz=;
priority_queue<int,vector<int>,greater<int> > q;
for(int i=;i<=n;i++)
if(!in[i]) q.push(i);
while(!q.empty())
{
int t=q.top();q.pop();
res[++sz]=t;
for(int i=head[t];i;i=e[i].nxt)
{
in[e[i].to]--;
if(!in[e[i].to]) q.push(e[i].to);
}
}
return (sz==n);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d",&num);
for(int j=;j<=num;j++)
scanf("%d",&x),dat[i].pb(x);
} int l=,r=m;
while(l<=r)
{
int mid=(l+r)>>;
build(mid);
if(check()) l=mid+;
else r=mid-;
}
build(r);check();
for(int i=;i<=n;i++)
printf("%d ",res[i]);
return ;
}

Problem B

C:

明显0/1分数规划,每次$dp$找当前重量大于等于$m$的最大权值和即可

一篇很好的博客,图解0/1分数规划:传送门

顺便学了下$Dinkelbach$算法,发现就是每次找到最大值时直接跳到该方案的零点处

直到该方案的零点为当前$x$下的最大值时停止即可

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
typedef double db;
const int MAXN=1e5+;
int n,m,w[MAXN],t[MAXN];
db l,r,a[MAXN],dp[MAXN]; bool check(db x)
{
for(int i=;i<=n;i++)
a[i]=t[i]-1.0*x*w[i];
for(int i=;i<=m;i++) dp[i]=-1e9; for(int i=;i<=n;i++)
for(int j=m;j>=;j--)
dp[min(m,j+w[i])]=max(dp[min(m,j+w[i])],dp[j]+a[i]);
return dp[m]>=;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d%d",&w[i],&t[i]),r+=t[i]; while(fabs(l-r)>1e-)
{
db mid=(l+r)/2.0;
if(check(mid)) l=mid;
else r=mid;
}
printf("%d",int((l+r)*));
return ;
}

Problem C

[USACO 2018 Open Gold] Tutorial的更多相关文章

  1. [USACO 2018 Feb Gold] Tutorial

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

  2. [USACO 2018 Jan Gold] Tutorial

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

  3. [USACO 2017 Dec Gold] Tutorial

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

  4. [USACO 2017 Open Gold] Tutorial

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

  5. [USACO 2017 Feb Gold] Tutorial

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

  6. [USACO 2017 Jan Gold] Tutorial

    Link: 传送门 A: 按值大小插入后用树状数组统计两边个数 #include <bits/stdc++.h> using namespace std; #define X first ...

  7. [USACO 2016 Dec Gold] Tutorial

    Link: 传送门 A: 贪心从小到大插入,用并查集维护连通性 #include <bits/stdc++.h> using namespace std; #define X first ...

  8. 【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348

    目录 Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 MEA ...

  9. USACO 2006 November Gold Corn Fields

    USACO 2006 November Gold Corn Fields 题目描述: Farmer John has purchased a lush new rectangular pasture ...

随机推荐

  1. 【BZOJ】1724 [Usaco2006 Nov]Fence Repair 切割木板

    [算法]贪心+堆 #include<cstdio> #include<algorithm> using namespace std; ; int n,heap[maxn],sz ...

  2. UIAlertView---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址   UIAlertView   //转载请注明出处--本文永久链接:http://ww ...

  3. MSSQL备份脚本

    ) ) ) ),),':',''),' ',''),'-',''),'.','') set @name=N'DEMO'+@temp+'-完整 数据库 备份' set @disk=N'F:\Backup ...

  4. centos6.5下安装svn并且实现多项目管理配置方案

    #安装SVN服务器 yum install subversion #在home下创建svn根目录 mkdir /home/svn #在 /home/svn下创建pro1 , pro2, pro3 三个 ...

  5. 简易微信小程序签到功能

    一.效果图 点击签到后 二.数据库 用一张数据表存用户签到的信息,每次用户签到都会往表中添加一条记录了用户id和签到日期的数据,如下图 三.后端 后端写两个接口,一个用于查询用户今日是否签到和签到记录 ...

  6. TCP的3次握手/4次握手

    三次握手: 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图下所示: (1) 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SE ...

  7. monkey测试===Monkey测试结果分析(系列三)转

    Monkey测试结果分析 一. 初步分析方法: Monkey测试出现错误后,一般的差错步骤为以下几步: 1. 找到是monkey里面的哪个地方出错 2. 查看Monkey里面出错前的一些事件动作,并手 ...

  8. python写一段脚本代码自动完成输入(目录下的所有)文件的数据替换(修改数据和替换数据都是输入的)【转】

    转自:http://blog.csdn.net/lixiaojie1012/article/details/23628129 初次尝试python语言,感觉用着真舒服,简单明了,库函数一调用就OK了 ...

  9. ERROR 1682 (HY000)

    ERROR 1682 (HY000) xtrabackup 恢复数据库后,出现1682错: root@localhost [(none)]>show global variables like ...

  10. 坐标转换——GCJ-02

    WGS84(World Geodetic System 1984),是为GPS 全球定位系统 使用而建立的坐标系统GCJ-02,我国在WGS84的基础上加密得到BD-09,百度坐标在GCJ-02基础上 ...