[USACO 2018 Open Gold] Tutorial
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的更多相关文章
- [USACO 2018 Feb Gold] Tutorial
Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...
- [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 2017 Jan Gold] Tutorial
Link: 传送门 A: 按值大小插入后用树状数组统计两边个数 #include <bits/stdc++.h> using namespace std; #define X first ...
- [USACO 2016 Dec Gold] Tutorial
Link: 传送门 A: 贪心从小到大插入,用并查集维护连通性 #include <bits/stdc++.h> using namespace std; #define X first ...
- 【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348
目录 Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 MEA ...
- USACO 2006 November Gold Corn Fields
USACO 2006 November Gold Corn Fields 题目描述: Farmer John has purchased a lush new rectangular pasture ...
随机推荐
- 【BZOJ】3895: 取石子
[算法]博弈论+记忆化搜索 [题意]给定n堆石子,两人轮流操作,每个人可以合并两堆石子或拿走一个石子,不能操作者输,问是否先手必胜 [题解] 首先,若所有石子堆的石子数>1,显然总操作数为(石子 ...
- UIAlertView---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 UIAlertView //转载请注明出处--本文永久链接:http://ww ...
- idea编写的java代码,在cmd运行乱码解决方案
1.解决方案 使用txt打开,另存为的时候选择编码为ANSI 即可.
- JavaScript字符串逆序
如何对字符串进行倒序呢?你首先想到的方法就是生成一个栈,从尾到头依次取出字符串中的字符压入栈中,然后把栈连接成字符串. var reverse = function( str ){ var stack ...
- 使用JQGrid 问题汇总 不定时更新
jqgrid左下角的复杂搜索框显示为下拉框样式searchoptions: { value: ": 全部; 1: 在用; 2: 报废", sopt: ['eq'] } jqgrid ...
- socket编程中write、read和send、recv之间的区别~转载
socket编程中write.read和send.recv之间的区别 http://blog.csdn.net/petershina/article/details/7946615 一旦,我们建立 ...
- device tree --- #interrupt-cells property
device tree source Example1 interrupt-controller@e000e100 { ... ... #interrupt-cells = <0x1>; ...
- linux===给新手的 10 个有用 Linux 命令行技巧(转)
本文转自:http://www.codeceo.com/article/10-linux-useful-command.html?ref=myread 仅用作学习交流使用.如有侵权,立删 我记得我第一 ...
- 开源网络准入系统(open source Network Access Control system)
开源网络准入系统(open source Network Access Control system) http://blog.csdn.net/achejq/article/details/5108 ...
- x64dbg
https://x64dbg.com/ https://github.com/x64dbg/x64dbg https://sourceforge.net/projects/x64dbg/files/s ...