[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 2730 割点
			
首先我们知道,对于这张图,我们可以枚举坍塌的是哪个点,对于每个坍塌的点,最多可以将图分成若干个不连通的块,这样每个块我们可能需要一个出口才能满足题目的要求,枚举每个坍塌的点显然是没有意义的,我们只需要 ...
 - GBK UTF-16 UTF-8 编码表
			
GBK UTF-16 UTF-8 ================== D2BB 4E00 E4 B8 80 一 B6A1 4E01 E4 B8 81 丁 C6DF 4E03 E4 ...
 - mysql执行load_fle返回NULL的解决方法
			
mysql 版本: 5.7.18 问题: 在执行mysql 函数load_file时,该函数将加载指定文件的内容,存储至相应字段.如: SELECT LOAD_FILE("D:\aa.txt ...
 - deepin安装metasploit
			
[1]安装metasploit 1.curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/tem ...
 - CiteSeer统计的计算机领域的期刊和会议的影响因子(2005)
			
产生自CiterSeer 2005数据库,实际的影响因子可能更高.仅供参考使用.真实的IF还需去官网查看 . OSDI: 3.31 (top 0.08%) . USENIX Symposium on ...
 - Linux内核【链表】整理笔记(2) 【转】
			
转自:http://blog.chinaunix.net/uid-23069658-id-4725279.html 关于链表我们更多时候是对其进行遍历的需求,上一篇博文里我们主要认识了一下和链表操作比 ...
 - Oracle 获取ddl语句
			
--得到所有表空间的ddl语句 SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name)FROM DBA_TABLESPACES T ...
 - 【bzoj4373】算术天才⑨与等差数列
			
同之前那道由乃题,可以认为由乃题是这题的特殊情况…… 维护方法是同样的,维护区间和,区间平方和即可. 注意特判一个数(其实没有必要) #include<bits/stdc++.h> ; u ...
 - C基础 多用户分级日志库 sclog
			
引言 - sclog 总的设计思路 sclog在之前已经内置到simplec 简易c开发框架中一个日志库. 最近对其重新设计了一下. 减少了对外暴露的接口. 也是C开发中一个轮子. 比较简单, 非常适 ...
 - Can't load standard profile: GRAY.pf
			
报错: java.lang.IllegalArgumentException: Can't load standard profile: GRAY.pf at java.awt.color.ICC_P ...