[ZROI 9.15模拟赛] Tutorial
Link:
可能要补一补之前的题了
题目名字天(Sky)的(De)炭(C)好评啊……
A:
从买/卖物品的配对来考虑:
可以发现如果当前物品为卖,肯定从之前选最小的(无论其为买/卖),因为贡献都是差值!
如果要买的物品当前状态为卖,那么相当于将那条匹配链的卖的那一端转换
用优先队列维护$pair(w[i],0/1)$,0/1分别表示当前为卖/买的状态即可
#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+;
int T,n,cnt,dat[MAXN];ll res=;
priority_queue<P,vector<P>,greater<P> > q; int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&dat[i]);
res=;cnt=;
while(!q.empty()) q.pop(); q.push(P(dat[],));
for(int i=;i<=n;i++)
{
P t=q.top();
if(dat[i]>t.X)
{
res+=dat[i]-t.X;
cnt+=t.Y;q.pop();
if(!t.Y) q.push(P(t.X,));
q.push(P(dat[i],));
}
else q.push(P(dat[i],));
}
printf("%lld %d\n",res,cnt*);
}
return ;
}
Problem A
考场上写的$O(n^2)$ $dp$发现并不能优化……
其实已经想到用匹配来做,但没发现那条可反悔贪心的性质
一般需要优化的匹配问题除了网络流,都是顺序考虑每一个数而非整体考虑
这里还要注意必须将卖设为0,因为在$w[i]$相同时要先将卖转移
(如果优先队列中放的是结构体,注意每个维度的顺序!)
B:
关键要将上下边界也看成大的障碍点
考虑长度$d$不能通过的条件:
将所有长度小于$d$的连边后上下边界连通,这样一定无法通过这道屏障
用类似$Kruskal$的方法将所有边排序后用并查集维护连通性即可
#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=2e5+;
P dat[MAXN];
int n,l,f[MAXN],tot;
struct edge{int x,y;double w;}e[MAXN]; double sqr(double a){return a*a;}
bool cmp(edge a,edge b){return a.w<b.w;}
void add_edge(int x,int y,double w)
{e[++tot]=(edge){x,y,w};}
int find(int x)
{return f[x]==x?x:f[x]=find(f[x]);}
double dist(int x,int y)
{return sqrt(sqr(dat[x].X-dat[y].X)+sqr(dat[x].Y-dat[y].Y));} int main()
{
scanf("%d%d",&n,&l);
for(int i=;i<=n;i++)
scanf("%d%d",&dat[i].X,&dat[i].Y);
for(int i=;i<=n+;i++) f[i]=i; for(int i=;i<=n;i++)
add_edge(,i,dat[i].Y),add_edge(i,n+,l-dat[i].Y);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
add_edge(i,j,dist(i,j)); sort(e+,e+tot+,cmp);
for(int i=;i<=tot;i++)
{
int px=find(e[i].x),py=find(e[i].y);
if(px==py) continue;f[px]=py;
if(find()==find(n+)) return printf("%.3lf",e[i].w),;
}
return ;
}
Problem B
C:
将0/1分别看作-1/1的贡献
发现一个区间需要的最小修改次数为最大的不相交前/后缀和的和
感性证明:
最值:只要某位的前/后缀和大于零该位就一定要删除,因此该值为下界
可行性:如果后面还有大于零的点则一定会向后拓展
两种实现方式:
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
#define mid ((l+r)>>1)
#define lc k<<1,l,mid
#define rc k<<1|1,mid+1,r
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=2e5+;
int n,m,l,r;char s[MAXN];
struct node{int sum,lmx,rmx,mx;}seg[MAXN<<];
node operator + (node a,node b)
{
node ret;
ret.sum=a.sum+b.sum;
ret.lmx=max(a.lmx,a.sum+b.lmx);
ret.rmx=max(b.rmx,b.sum+a.rmx);
ret.mx=max(a.lmx+b.rmx,max(a.sum+b.mx,b.sum+a.mx));
return ret;
} void build(int k,int l,int r)
{
if(l==r)
{
if(s[l]=='') seg[k]=(node){-,,,};
else seg[k]=(node){,,,};
return;
}
build(lc);build(rc);
seg[k]=seg[k<<]+seg[k<<|];
}
node Query(int a,int b,int k,int l,int r)
{
if(a<=l&&r<=b) return seg[k];
node ret=(node){,,,};
if(a<=mid) ret=Query(a,b,lc);
if(b>mid) ret=ret+Query(a,b,rc);
return ret;
} int main()
{
scanf("%d%d%s",&n,&m,s+);
build(,,n);
for(int i=;i<=m;i++)
scanf("%d%d",&l,&r),printf("%d\n",Query(l,r,,,n).mx);
return ;
}
Solution A
如果求$pre+suf$的最值要注意将区间向外拓展1
(可能取$pre[l-1]$,也就是前缀不选)
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
#define mid ((l+r)>>1)
#define lc k<<1,l,mid
#define rc k<<1|1,mid+1,r
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=8e5+,INF=<<;
char s[MAXN];
int res,lft;
int n,q,l,r,pre[MAXN],suf[MAXN];
int mx[MAXN],lmx[MAXN],rmx[MAXN]; void pushup(int k)
{
lmx[k]=max(lmx[k<<],lmx[k<<|]);
rmx[k]=max(rmx[k<<],rmx[k<<|]);
mx[k]=max(mx[k<<],max(mx[k<<|],lmx[k<<]+rmx[k<<|]));
} void build(int k,int l,int r)
{
if(l==r)
{
lmx[k]=pre[l],rmx[k]=suf[l];
mx[k]=-INF;return;
}
build(lc);build(rc);
pushup(k);
} void Query(int a,int b,int k,int l,int r)
{
if(a<=l&&r<=b)
{
if(lft==-INF)
res=max(res,mx[k]),lft=lmx[k];
else
res=max(res,max(mx[k],lft+rmx[k])),
lft=max(lft,lmx[k]);
return;
}
if(a<=mid) Query(a,b,lc);
if(b>mid) Query(a,b,rc);
} int main()
{
scanf("%d%d%s",&n,&q,s+);
for(int i=;i<=n;i++)
pre[i]=pre[i-]+(s[i]==''?-:);
for(int i=n;i>=;i--)
suf[i]=suf[i+]+(s[i]==''?-:);
build(,,n+); while(q--)
{
scanf("%d%d",&l,&r);
res=lft=-INF;l--;r++;
Query(l,r,,,n+);
printf("%d\n",res-pre[l]-suf[r]);
}
return ;
}
Solution B
针老师题解里的树上倍增可能不太懂啊……
[ZROI 9.15模拟赛] Tutorial的更多相关文章
- [ZROI 9.16模拟赛] Tutorial
Link: 传送门 A: 套路题结果想了好久…… 排序二叉树的性质就是中序遍历单调递增 于是只考虑当前树的中序遍历的序列即可,与树的形态无关 将序列改成严格单调增想到最大化不变的数,但直接LIS求的是 ...
- ZROI提高组模拟赛05总结
ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ...
- ZROI 普及组模拟赛02总结
ZROI 普及组模拟赛02总结 先放[网址][http://zhengruioi.com/contest/96] 可能是有一段时间没有打这种正式的比赛了,今天打的很奇怪... T1 模拟水题 既然是普 ...
- 2014.8.15模拟赛【公主的工作】&&bzoj1046[HAOI2007]上升序列
bzoj题目是这样的 Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm ...
- NOIP2017提高组 模拟赛15(总结)
NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...
- ZROI 19.08.07模拟赛
传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. "正睿从来没有保证,模拟赛的题目必须原创." "文案不是我写的,有问题找喵老师去."--蔡老师 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 小奇模拟赛9.13 by hzwer
2015年9月13日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...
随机推荐
- 【CodeForces】708 C. Centroids 树的重心
[题目]C. Centroids [题意]给定一棵树,求每个点能否通过 [ 移动一条边使之仍为树 ] 这一操作成为树的重心.n<=4*10^5. [算法]树的重心 [题解]若树存在双重心,则对于 ...
- 商城项目(ssm+dubbo+nginx+mysql统合项目)总结(4)
我不会在这里贴代码和详细步骤什么的,我觉得就算我把它贴出来,你们照着步骤做还是会出很多问题,我推荐你们去看一下黑马的这个视频,我个人感觉很不错,一步一步走下来可以学到很多东西.另外,视频和相关文档的话 ...
- python基础之内置异常对象
前言 什么叫异常?简单来说就是程序运行发生了预计结果之外的情况从而导致程序无法正常运行.而python解释器将一些常见的异常情况在它发生时打包成一个异常对象,我们可以通过捕捉这些异常对象从而进行处理, ...
- rabbitmq和kafka怎么选?【转】
MQ框架非常之多,今天简单说一下有代表性的两个MQ(rabbitmq和kafka).经常会有人问rabbitmq和kafka到底哪个好呢?其实没有好与不好之分,只有哪个更合适,首先要根据自己项目的业务 ...
- ios 不支持iframe 解决方案
在iframe外层在包一层,通过appendChild()把内容增加到容器中,完整代码如下: @section Css { <link href="@ViewHelper.Conten ...
- Xcode及模拟器SDK下载
http://blog.csdn.net/zhangao0086/article/details/38491271 吐槽下,百度打着无限分享的旗号,却又让分享资源过期,让分享者持续维护 如果你嫌在Ap ...
- HDU 2544 最短路(floyd+bellman-ford+spfa+dijkstra队列优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找点1到点n的最短路(无向图) 练一下最短路... dijkstra+队列优化: #i ...
- LightOJ - 1179 Josephus Problem(约瑟夫环)
题目链接:https://vjudge.net/contest/28079#problem/G 题目大意:约瑟夫环问题,给你n和k(分别代表总人数和每次要数到k),求最后一个人的位置. 解题思路:因为 ...
- TCP封包解包---如有错误,请纠正!
最近遇见很多的关于TCP中封包解包的数据,在TCP节点之间的信息传递,每次传送的内容是结构体,所以每次在传送的时候,要将结构体中的数据进行封包,然后当一端接收到数据之后,要对接收到的buf参数中的数据 ...
- 20165301陈潭飞2017-2018-2 20165301 实验三《Java面向对象程序设计》实验报告
2017-2018-2 20165301 实验三<Java面向对象程序设计>实验报告 一.敏捷开发与XP实践-1 实验要求: 在IDEA中使用工具(Code->Reformate C ...