NOIp2018集训test-10-22 (联考六day2)
中间值

两个log肯定会被卡。我用的第一种做法,就是要各种特判要在两个序列都要二分比较麻烦。
//Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=1e6+;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,a[N],b[N]; template<typename T> void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} #define ANS
int main() {
#ifdef ANS
freopen("median.in","r",stdin);
freopen("median.out","w",stdout);
#endif
read(n); read(m);
For(i,,n) read(a[i]);
For(i,,n) read(b[i]);
For(cs,,m) {
int o,x,y,z,l1,r1,l2,r2;
read(o);
if(o==) {
read(x); read(y); read(z);
if(!x) a[y]=z;
else b[y]=z;
}
else {
read(l1); read(r1);
read(l2); read(r2);
int len=r1-l1++r2-l2+;
int tot=len/+;
int l=,r=min(tot,r1-l1+),rs=-;
while(l<=r) {
int mid=((l+r)>>);
int cnt=tot-mid;
if(cnt>r2-l2+) l=mid+;
else {
if((cnt==||b[l2+cnt-]<=a[l1+mid-])&&(l2+cnt>r2||b[l2+cnt]>=a[l1+mid-])) {
rs=a[l1+mid-]; break;
}
if(cnt!=&&b[l2+cnt-]>a[l1+mid-]) l=mid+;
else r=mid-;
}
}
if(rs==-) {
swap(l1,l2); swap(r1,r2);
l=,r=min(tot,r1-l1+),rs=-;
while(l<=r) {
int mid=((l+r)>>);
int cnt=tot-mid;
if(cnt>r2-l2+) l=mid+;
else {
if((cnt==||a[l2+cnt-]<=b[l1+mid-])&&(l2+cnt>r2||a[l2+cnt]>=b[l1+mid-])) {
rs=b[l1+mid-]; break;
}
if(cnt!=&&a[l2+cnt-]>b[l1+mid-]) l=mid+;
else r=mid-;
}
}
}
printf("%d\n",rs);
}
}
Formylove;
}
最小值
dp[i]表示以前i个已经区间分割好了的答案。新加入一个i+1,设i-1前面第一个不大于它的位置为j。
要么i+1单独分割一个区间,这个区间的左端点可以选择从j+1~i+1,从这一段中选择一个pos使dp[pos-1]最大,用dp[pos-1]+f(a[i+1])来更新dp[i+1]
要么i+1和之前的一个数为一个区间,那么这个区间的左端点一定在j或者j之前,也就是i+1没有贡献,直接用dp[j]更新dp[i+1]
我前面不大于我的第一个数用单调栈维护,求dp最大值时用线段树维护即可。
最大值
我觉得略有点神仙啊。。一道题改了一下午。。。大半个下午都在:题解在说啥???它说的是中文???喵喵喵??
倒是码出来(虽然比std长了一倍)就直接过了,比较开心。
题解翻译:
$E(x)=\sum_{i=1}^\infty P(x=i)*i$
$E(x)=\sum_{i=1}^\infty P(x \geq i)$
$Ans(l,r)=\sum_{x=1}^\infty P((Max_{i=l}^r v_i) \geq x)$
$\because Max_{i=l}^r v_i=y_1/y_2/y_3……y_m$
$\therefore \forall x\in (y_{i-1}+1,y_i)\ \ P((Max_{i=l}^r v_i) \geq x)=P((Max_{i=l}^r v_i) \geq y_i)$
$\therefore Ans=\sum_{x=1}^m (y_x-y_{x-1})*P((Max_{i=l}^r v_i) \geq y_x)$
$P((Max_{i=l}^r v_i) \geq x)=1-P((Max_{i=l}^r v_i) < x)=1-\prod_{i=l}^rP(v_i<x)$
$=1-\prod_{i=l}^r(1-P(v_i\geq x))$
$\therefore Ans=\sum_{x=1}^m (y_x-y_{x-1})*[1-\prod_{i=l}^r(1-P(v_i\geq y_x))]$
当x从x变到x+1时,只有i中包含能量为$y_{x+1}$的魔法石的i的$P(v_i\geq y_x)$会发生改变,故x从1~m改变总次数为魔法石的总个数。
又因为询问区间互相不包含,把询问区间的(l,r)按l排序,包含i的(l,r)一定是一段连续的区间,那么用线段树维护对于当前的x,每个询问区间的$\prod_{i=l}^r(1-P(v_i\geq y_x))$
每次维护区间乘一个数的操作,因为$1-P(v_i\geq y_x)$会变成0,$y_x$要按从大到小枚举
//Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=2e5+,mod=1e9+;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,q,ls[N],sz;
LL ans,now[N]; template<typename T> void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} LL ksm(LL a,LL b) {
LL rs=,bs=a%mod;
while(b) {
if(b&) rs=rs*bs%mod;
bs=bs*bs%mod;
b>>=;
}
return rs;
} struct stone {
int y,p;
friend bool operator <(const stone &A,const stone &B) {
return A.y<B.y;
}
stone(int y,int p):y(y),p(p){}
};
vector<stone>vc[N]; struct node {
int i,p;
node(int i,int p):i(i),p(p){}
};
vector<node>v2[N]; struct sgtree {
LL sg[N<<],lz[N<<];
#define lc (x<<1)
#define rc ((x<<1)|1)
#define mid ((l+r)>>1)
void down(int x,int l,int r) {
if(lz[x]==) return;
sg[lc]=sg[lc]*lz[x]%mod; lz[lc]=lz[lc]*lz[x]%mod;
sg[rc]=sg[rc]*lz[x]%mod; lz[rc]=lz[rc]*lz[x]%mod;
lz[x]=;
} void build(int x,int l,int r) {
lz[x]=;
if(l==r) { sg[x]=1LL; return; }
build(lc,l,mid); build(rc,mid+,r);
sg[x]=(sg[lc]+sg[rc])%mod;
} void upd(int x,int l,int r,int ql,int qr,LL v) {
if(l>=ql&&r<=qr) {
sg[x]=sg[x]*v%mod; lz[x]=lz[x]*v%mod; return;
}
down(x,l,r);
if(ql<=mid) upd(lc,l,mid,ql,qr,v);
if(qr>mid) upd(rc,mid+,r,ql,qr,v);
sg[x]=(sg[lc]+sg[rc])%mod;
}
}T; int opl[N],opr[N],qql[N],qqr[N]; #define ANS
int main() {
#ifdef ANS
freopen("max.in","r",stdin);
freopen("max.out","w",stdout);
#endif
read(n); read(m); read(q);
For(i,,m) {
int x,y,p;
read(x); read(y); read(p);
vc[x].push_back(stone(y,p));
ls[++ls[]]=y;
}
int nl=,nowp=;
For(i,,q) {
read(qql[i]); read(qqr[i]);
while(qql[i]>nowp) {
while(nl<i&&qqr[nl]<nowp) nl++;
opl[nowp]=nl; opr[nowp]=i-;
nowp++;
}
while(nl<i&&qqr[nl]<nowp) nl++;
opl[nowp]=nl; opr[nowp]=i;
}
while(nowp<=n) {
while(nl<=q&&qqr[nl]<nowp) nl++;
opl[nowp]=nl; opr[nowp]=q; nowp++;
} sort(ls+,ls+ls[]+);
sz=unique(ls+,ls+ls[]+)-(ls+);
For(i,,n) sort(vc[i].begin(),vc[i].end());
For(i,,n) {
int up=vc[i].size();
LL pr=,tp=;
For(j,,up-) tp=(1LL-vc[i][j].p+mod)%mod*tp%mod;
For(j,,up-) {
LL px=(pr-tp+mod)%mod;
pr=(1LL-vc[i][j].p+mod)%mod*pr%mod;
int y=lower_bound(ls+,ls+sz+,vc[i][j].y)-ls;
v2[y].push_back(node(i,px));
}
} For(i,,n) now[i]=;
T.build(,,q);
ls[]=;
Rep(x,sz,) {
LL tpp=(ls[x]%mod-ls[x-]%mod+mod)%mod;
int up=v2[x].size();
For(i,,up-) {
int pos=v2[x][i].i,tp=(1LL-v2[x][i].p+mod)%mod;
if(now[pos]==) continue;
if(opl[pos]&&opl[pos]<=opr[pos]) {
T.upd(,,q,opl[pos],opr[pos],tp*ksm(now[pos],mod-)%mod);
now[pos]=tp;
}
}
ans=(ans+(q-T.sg[]+mod)%mod*tpp%mod)%mod;
}
printf("%lld\n",ans);
Formylove;
}
NOIp2018集训test-10-22 (联考六day2)的更多相关文章
- NOIp2018集训test-9-22(am/pm) (联考三day1/day2)
szzq学长出的题,先orz一下. day1 倾斜的线 做过差不多的题,写在我自己的博客里,我却忘得一干二净,反而李巨记得清清楚楚我写了的. 题目就是要最小化这个东西 $|\frac{y_i-y_j} ...
- 六省联考2017 Day2
目录 2018.3.27 Test 总结 T1 T2 T3 BZOJ.4873.[六省联考2017]寿司餐厅(最小割ISAP 最大权闭合子图) 考试代码 T1 T2 T3 2018.3.27 Test ...
- NOIp2018集训test-10-21 (联考六day1)
今天被高一狂踩,两个手抖,t1一个1写成2,t3一个+=写成=,所谓失之毫厘谬以千里,直接丢了50分. 完全背包 看到背包体积如此之大物品体积如此之小容易很想到贪心,肯定要先加很多很多的性价比最高的最 ...
- NOIp2018集训test-9-16(联考二day2)
T1旋转子段 一开始脑袋抽了花了近一个小时写了个跟这题毫无关系的莫名其妙的代码,一急代码就各种bug,最后t1就花了一个半小时多,然后后面时间不太够了,考得稀烂. 因为每个数存在唯一的中心使得绕这个中 ...
- NOIp2018集训test-9-8(pm) (联考一day2)
把T1题读错了,想了一个多小时发现不可做.然后打了t2,常数不优秀.然后去打t3,lct,结果打挂爆0了. 然后今天就爆炸了. 如果这是noip我今年就可以直接回去学常规了.学常规多好,多开心. 今天 ...
- [NOIP2018模拟赛10.22]咕咕报告
闲扯 这是篇咕咕了的博客 考场上码完暴力后不知道干什么,然后忽然发现这个T1好像有点像一道雅礼集训时讲过的CF题目 Rest In Shades ,当时那道题还想了挺久不过思路比较妙,于是我就也\(y ...
- NOIp2018集训test-9-15(联考二day1)
T1.矩阵游戏 水题.每一行最后乘的数为x[i],每一列为y[i],暴力算第一行的列的贡献,每一行的列的贡献是公差为所有列的贡献之和的等差数列,然后每一行再乘上行的贡献求和即为答案. //Achen ...
- bzoj千题计划265:bzoj4873: [六省联考2017]寿司餐厅
http://www.lydsy.com/JudgeOnline/problem.php?id=4873 选a必选b,a依赖于b 最大权闭合子图模型 构图: 1.源点 向 正美味度区间 连 流量为 美 ...
- [BZOJ4873][六省联考2017]寿司餐厅(最大权闭合子图)
4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 490 Solved: 350[Submit][Status ...
随机推荐
- Nacos 1.1.4 发布,业界率先支持 Istio MCP 协议
Nacos是阿里巴巴开源的服务发现与配置管理项目,本次发布的1.1.4版本,主要带来的是与Istio的对接功能,使用的是Istio最新的MCP协议.本文将介绍包括这个功能在内的新版本发布的功能. 升级 ...
- Python--模块之time、random、os、hashlib
今天开始模块. 首先补充 __init__.py 在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中 ...
- Service系统服务(六):rsync基本用法、rsync+SSH同步、配置rsync服务端、访问rsync共享资源、使用inotifywait工具、配置Web镜像同步、配置并验证Split分离解析
一.rsync基本用法 目标: 本例要求掌握远程同步的基本操作,使用rsync命令完成下列任务: 1> 将目录 /boot 同步到目录 /todir 下 2> 将目录 /boot 下的 ...
- php对象方法链式调用编程
E:\html\tproject\framework\modules\common\classes\Common\CURL.php <?php /** * 同步发起请求 * 针对http协议的8 ...
- js事件---同一个事件实现全选与反选功能
背景: 点击头部按钮,实现全选与反选功能 1.绑定事件,把当前勾选状态传递给方法 $event <el-checkbox v-model="ModelCheckAll" cl ...
- 自定义缓存管理器 或者 Spring -- cache
Spring Cache 缓存是实际工作中非常常用的一种提高性能的方法, 我们会在许多场景下来使用缓存. 本文通过一个简单的例子进行展开,通过对比我们原来的自定义缓存和 spring 的基于注释的 c ...
- ROS的使用
1.输入roscore时出现错误:Unable to contact my own server at 修改: 在.bashrc文件中添加以下内容: export ROS_HOSTNAME=local ...
- mysql定时任务(数据库管理工具and 纯命令行)
1.工具:Navicat 2.通过下列语句l爱查询event是否开启 打开Navicat命令列界面(点击工具可以看到或按F6) 输入下面命令 show variables like '%sche%'; ...
- angular-file-upload插件的使用简单介绍
参考博客: https://www.cnblogs.com/jarson-7426/p/5191156.html angular-file-upload 最近一段时间用了一下angular-file- ...
- JS检查断网
window.addEventListener('load', function() { function updateOnlineStatus(event) { var condition = na ...