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. HDU 1070 Milk (模拟)

    题目链接 Problem Description Ignatius drinks milk everyday, now he is in the supermarket and he wants to ...

  2. 将资源文件夹中的文件通过流的方式写入到应用的File文件夹中

    //1.在Files文件夹中创建同名的数据库文件 File files = getFilesDir(); File file = new File(files, DBName); if(file.ex ...

  3. 分类算法:决策树(C4.5)(转)

    C4.5是机器学习算法中的另一个分类决策树算法,它是基于ID3算法进行改进后的一种重要算法,相比于ID3算法,改进有如下几个要点: 1)用信息增益率来选择属性.ID3选择属性用的是子树的信息增益,这里 ...

  4. centos_7.1.1503_src_6

    http://vault.centos.org/7.1.1503/os/Source/SPackages/ perl-Test-MockObject-1.20120301-3.el7.src.rpm ...

  5. Oracle with重用子查询

    --with 重用子查询对于多次使用相同子查询的复杂查询语句来说,用户可能会将查询语句分成两条语句执行.第一条语句将子查询结果存放到临时表,第二条查询语句使用临时表处理数据.从 Oracle 9i 开 ...

  6. git subtree:无缝管理通用子项目

    移动互联网的爆发以及响应式页面的尴尬症,开发web和mobile项目成为了标配,当然实际情况下,会有更多的项目. 多项目开发对于前端来说是个很大的挑战✦ 重复,重复的前端架构,重复的前端依赖,重复的工 ...

  7. vue的data用到this问题

    问题:在vue中用vue-awesome-swiper,在data中初始化,用到swiper一个方法onTap,然后再调vue的一个函数,用到this,可是... data() { return { ...

  8. Activiti如何替换已部署流程图

    首先交代下背景:我们有一个已经上线的activiti工作流系统,对于流程图的操作已经封装好部署,查看,删除的接口.此时客户提出要修改个别流程图里的节点名称. 我的第一个想法就是本地修改流程图bpmn文 ...

  9. Rotate Image——数学相关

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  10. 走进 Akka.NET

    官方文档:https://getakka.net/index.html 官网:https://petabridge.com/ 一.Akka.NET 是什么? Akka 是一个构建高并发.分布式和弹性消 ...