中间值

两个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. UNP学习 多播

    一.概述 单播地址标识单个接口,广播地址标识子网上的所有接口,多播地址标识一组接口. 单播和广播是编址方案的两个极端,多播的目的就在于提供一种折衷的方案. 二.多播地址 我们必须区分IPv4多播地址和 ...

  2. AcWing 226. 233矩阵 (矩阵快速幂+线性递推)打卡

    题目:https://www.acwing.com/problem/content/228/ 题意:有一个二维矩阵,这里只给你第一行和第一列,要你求出f[n][m],关系式有    1,  f[0][ ...

  3. ALAsset和ALAssetRepresentation详解

    ALAsset类代表相册中的每个资源文件,可以通过它获取资源文件的相关信息还能修改和新建资源文件,ALAssetRepresentation类代表相册中每个资源文件的详细信息,可以通过它获取资源的大小 ...

  4. Windows 08 R2_NLB负载均衡(图文详解)

    目录 目录 Load Balance 使用NLB来部署Web Farm集群 环境准备 在Win08r2pc1中配置DNS服务 在Win08r2pc1中部署File Service文件服务 在Win08 ...

  5. Java输入/输出教程

    Java输入/输出(I/O)处理从源读取数据并将数据写入目标.通常,读取存储在文件中的数据或使用I/O将数据写入到文件中. java.io和java.nio包中包含处理输入/输出的Java类.java ...

  6. 利用URL Protocol实现网页调用本地应用程序

    http://blog.csdn.net/zssureqh/article/details/25828683

  7. css篇-简化版

    [CSS篇]简化版 (1)     CSS盒模型 CSS盒模型 题目:谈谈你对CSS盒模型的认识 1)       基本概念:标准模型+IE模型 2)       标准模型和IE模型的区别 计算宽度和 ...

  8. Spring学习笔记(9)——注入参数

    集合类型属性 1.Set类型 private Set<String> sets=new HashSet<String>(); //我们需要给它添加set方法 public Se ...

  9. android中的ContentProvider实现数据共享

    为了在应用程序之间交换数据,android中提供了ContentProvider,ContentProvider是不同应用程序之间进行数据交换的标准API.当一个应用程序需要把自己的数据暴露给其他程序 ...

  10. JS数组中Array.of()方法的使用

    Array.of()方法的使用: Array.of()方法用于将一组数值转换为数组,举例: const a = Array.of(2,4,6,8); console.log(a); // [2,4,6 ...