中间值

两个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)的更多相关文章

  1. NOIp2018集训test-9-22(am/pm) (联考三day1/day2)

    szzq学长出的题,先orz一下. day1 倾斜的线 做过差不多的题,写在我自己的博客里,我却忘得一干二净,反而李巨记得清清楚楚我写了的. 题目就是要最小化这个东西 $|\frac{y_i-y_j} ...

  2. 六省联考2017 Day2

    目录 2018.3.27 Test 总结 T1 T2 T3 BZOJ.4873.[六省联考2017]寿司餐厅(最小割ISAP 最大权闭合子图) 考试代码 T1 T2 T3 2018.3.27 Test ...

  3. NOIp2018集训test-10-21 (联考六day1)

    今天被高一狂踩,两个手抖,t1一个1写成2,t3一个+=写成=,所谓失之毫厘谬以千里,直接丢了50分. 完全背包 看到背包体积如此之大物品体积如此之小容易很想到贪心,肯定要先加很多很多的性价比最高的最 ...

  4. NOIp2018集训test-9-16(联考二day2)

    T1旋转子段 一开始脑袋抽了花了近一个小时写了个跟这题毫无关系的莫名其妙的代码,一急代码就各种bug,最后t1就花了一个半小时多,然后后面时间不太够了,考得稀烂. 因为每个数存在唯一的中心使得绕这个中 ...

  5. NOIp2018集训test-9-8(pm) (联考一day2)

    把T1题读错了,想了一个多小时发现不可做.然后打了t2,常数不优秀.然后去打t3,lct,结果打挂爆0了. 然后今天就爆炸了. 如果这是noip我今年就可以直接回去学常规了.学常规多好,多开心. 今天 ...

  6. [NOIP2018模拟赛10.22]咕咕报告

    闲扯 这是篇咕咕了的博客 考场上码完暴力后不知道干什么,然后忽然发现这个T1好像有点像一道雅礼集训时讲过的CF题目 Rest In Shades ,当时那道题还想了挺久不过思路比较妙,于是我就也\(y ...

  7. NOIp2018集训test-9-15(联考二day1)

    T1.矩阵游戏 水题.每一行最后乘的数为x[i],每一列为y[i],暴力算第一行的列的贡献,每一行的列的贡献是公差为所有列的贡献之和的等差数列,然后每一行再乘上行的贡献求和即为答案. //Achen ...

  8. bzoj千题计划265:bzoj4873: [六省联考2017]寿司餐厅

    http://www.lydsy.com/JudgeOnline/problem.php?id=4873 选a必选b,a依赖于b 最大权闭合子图模型 构图: 1.源点 向 正美味度区间 连 流量为 美 ...

  9. [BZOJ4873][六省联考2017]寿司餐厅(最大权闭合子图)

    4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 490  Solved: 350[Submit][Status ...

随机推荐

  1. Mavlink_main.cpp源码学习

    int mavlink_main(int argc, char *argv[]) { if (argc < 2) { usage();                               ...

  2. stat函数学习

    stat函数组 前面介绍的通过ls命令查看到的文件信息,都可以使用stat函数组提取出来• stat函数组– 使用命令man stat查看相关文档• 函数int stat(const char *pa ...

  3. 【Flutter学习】可滚动组件之SingleChildScrollView

    一,概述 SingleChildScrollView类似于Android中的ScrollView,它只能接收一个子Widget.定义如下: 二,构造函数 const SingleChildScroll ...

  4. jmeter 基础介绍

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域.它可以用于对静态的和动态的资源(文件,Se ...

  5. BZOJ 4421: [Cerc2015] Digit Division(思路)

    传送门 解题思路 差点写树套树...可以发现如果几个数都能被\(m\)整除,那么这几个数拼起来也能被\(m\)整除.同理,如果一个数不能被\(m\)整除,那么它无论如何拆,都无法拆成若干个可以被\(m ...

  6. windows环境下如何安装memcached教程

    Memcached 是一个开源免费高性能的分布式内存对象缓存系统,能够加快网站访问速度和减轻数据库压力,本文向大家介绍下windows环境下如何安装memcached. 工具/原料   memcach ...

  7. PHP 3DES 加解密(CBC模式,pkcs5padding填充)

    1.前言:项目中接入第三方支付遇到3DES加密,以前也没用过,搜了好多,都不适用,各种不对,后来自己结合搜到的终于弄正确了,检测地址:http://tool.chacuo.net/crypt3des. ...

  8. Linux折腾

    安装了一圈发行版,最后发现还是Fedora最稳定 debian安装后无法启动 openSUSE源不完善 manjaro重启就进不去

  9. Javascript连续赋值

    Javascript对象属于引用类型,将对象赋值给变量相当于将对象地址赋值给变量 let a = {n: 1}; let b = a; a.x = a = {n: 2}; //运算符的优先级 cons ...

  10. Zabbix当内存剩余不足10%的时候触发报警

    zabbix默认的剩余内存报警: Average Lack of available memory on server {HOST.NAME}{Template OS Linux:vm.memory. ...