新机房首模拟变倒数

T1 柱状图

关于每一个点可以做出两条斜率分别为$1,-1$的直线,

然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上

二分出直线的高度,判断条件是尽量让这条直线上部的点和下部的点个数尽量相等

这一部分直接使用动态开点线段树维护即可,

具体实现是每个点左右两边分别维护一棵树,开始的时候吧所有点都放在右边树上

然后扫每一个点作为最高柱子的情况,同事把右树上的点移动到左树上

 1 #include<bits/stdc++.h>
2 #define LL long long
3 using namespace std;
4 namespace AE86{
5 inline int read(){
6 int x=0,f=1;char ch=getchar();
7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
8 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
9 }inline void write(LL x,char opt='\n'){
10 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
11 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
12 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
13 }using namespace AE86;
14
15 const int NN=1e5+5;
16 int n,h[NN];
17 int L=-1e6,R=1e9+1e6,maxn,id;
18 LL ans=1e18;
19 struct SNOWtree{
20 int ls[NN*30],rs[NN*30],seg,rt;
21 LL sum[NN*30];int siz[NN*30];
22 inline void pushup(int x){
23 sum[x]=sum[ls[x]]+sum[rs[x]];
24 siz[x]=siz[ls[x]]+siz[rs[x]];
25 return;
26 }
27 inline void insert(int &x,int l,int r,int pos,int v){
28 if(!x) x=++seg;
29 if(l==r){
30 sum[x]+=1ll*v*pos; siz[x]+=v; return;
31 } int mid=(l+r)/2; if(mid<=0 && l<0) --mid;
32 if(pos<=mid) insert(ls[x],l,mid,pos,v);
33 else insert(rs[x],mid+1,r,pos,v);
34 pushup(x);
35 }
36 inline int query_siz(int x,int l,int r,int ql,int qr){
37 if(!x) return 0;
38 if(ql<=l && r<=qr) return siz[x];
39 int mid=(l+r)/2,ans=0; if(mid<=0 && l<0) --mid;
40 if(ql<=mid) ans+=query_siz(ls[x],l,mid,ql,qr);
41 if(qr>mid) ans+=query_siz(rs[x],mid+1,r,ql,qr);
42 return ans;
43 }
44 inline LL query_sum(int x,int l,int r,int ql,int qr){
45 if(!x) return 0;
46 if(ql<=l && r<=qr) return sum[x];
47 int mid=(l+r)/2;LL ans=0; if(mid<=0 && l<0) --mid;
48 if(ql<=mid) ans+=1ll*query_sum(ls[x],l,mid,ql,qr);
49 if(qr>mid) ans+=1ll*query_sum(rs[x],mid+1,r,ql,qr);
50 return ans;
51 }
52 }le,ri;
53 inline LL get(int h,int i){
54 LL ans=0;
55 ans+=1ll*le.query_siz(le.rt,L,R,L,h-i-1)*(h-i)-le.query_sum(le.rt,L,R,L,h-i-1);
56 ans+=1ll*ri.query_siz(ri.rt,L,R,L,h+i-1)*(h+i)-ri.query_sum(ri.rt,L,R,L,h+i-1);
57 ans+=le.query_sum(le.rt,L,R,h-i+1,R)-1ll*le.query_siz(le.rt,L,R,h-i+1,R)*(h-i);
58 ans+=ri.query_sum(ri.rt,L,R,h+i+1,R)-1ll*ri.query_siz(ri.rt,L,R,h+i+1,R)*(h+i);
59 return ans;
60 }
61 namespace WSN{
62 inline short main(){
63 freopen("c.in","r",stdin);
64 freopen("c.out","w",stdout);
65 n=read(); for(int i=1;i<=n;i++){
66 h[i]=read();ri.insert(ri.rt,L,R,h[i]+i,1);
67 if(maxn<h[i]) maxn=h[i],id=i;
68 }
69 for(int i=1;i<=n;i++){
70 le.insert(le.rt,L,R,h[i]-i,1);
71 ri.insert(ri.rt,L,R,h[i]+i,-1);
72 int l=max(n-i+1,i),r=max(l,maxn+abs(id-i)),LS,RS;
73 while(l+1<r){
74 int mid=(l+r)>>1;
75 LS=le.query_siz(le.rt,L,R,L,mid-i-1)+ri.query_siz(ri.rt,L,R,L,mid+i-1);
76 RS=n-LS; if(LS<=RS) l=mid; else r=mid;
77 }
78 ans=min(ans,min(get(l,i),get(r,i)));
79 }
80 write(ans);
81 return 0;
82 }
83 }
84 signed main(){return WSN::main();}

T2 应急棍

比较烦这种为了找规律去找规律的题

安置点的规则不用说,就是模拟,然后判断点的位置的时候

我是用$(2_{i-1}+1)^2+1$算出每一层起始点的编号然后一列一列的跳

细节不少,还是模拟,还要高精,所以很烦,(但我没写高精)

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 int n,T,C;
5 double l;
6 namespace WSN{
7 inline short main(){
8 freopen("a.in","r",stdin);
9 freopen("a.out","w",stdout);
10 cin>>C>>T>>l;
11 while(T--){
12 int n; scanf("%lld",&n);
13 if(n==1) printf("0 0\n");
14 if(n==3) printf("0 %.10lf\n",l);
15 if(n==4) printf("%.10lf 0\n",l);
16 if(n==2) printf("%.10lf %.10lf\n",l,l);
17 if(n<=4) continue; int i=0;
18 while(n-((pow(2,i-1)+1)*(pow(2,i-1)+1)+1)>=0) ++i; --i;
19 n-=((pow(2,i-1)+1)*(pow(2,i-1)+1)+1);
20 double dis=l/pow(2,i);
21 if(!n){printf("%.10lf %.10lf\n",dis,dis);continue;}
22 if(n-pow(4,i-1)+1<=0){
23 double x=n/(int)pow(2,i-1)*dis*2+dis;
24 double y=n%(int)pow(2,i-1)*dis*2+dis;
25 printf("%.10lf %.10lf\n",x,y);
26 }else{
27 int tot=pow(2,i-1)*2+1; n-=pow(4,i-1);
28 // cout<<n<<endl;
29 double x=n/tot*dis*2,y=0;
30 if(n%tot<(int)pow(2,i-1)) y=dis+(n%tot)*dis*2;
31 else x+=dis,y=(n%tot-(int)pow(2,i-1))*dis*2;
32 printf("%.10lf %.10lf\n",x,y);
33 }
34 }
35 return 0;
36 }
37 }
38 signed main(){return WSN::main();}

T3 擒敌拳

李超线段树好题,在这里说一下李超线段树。

这个线段树是真的线段树,他的每个区间维护的是一段线段

$l,r,k,b$其中$k,b$是线段的信息

以维护几条线段的最大值为例来说

开始建树的时候先插入一条斜率为$0$,截距为负无穷的线段

然后要插入你需要维护的线段的时候,分几种情况

1.原来的最大值线段被完爆,直接替换

2.两个线段有交叉,就向交叉部分递归

查询的时候按照标记永久化的思想,走一步查一步

那么这道题可以先用单调栈预处理出每一个矩形为最低矩形的左右边界,

发现每个矩形再他的区间内做贡献是一个一次函数,那么直接使用李超线段树维护即可

 1 #include<bits/stdc++.h>
2 #define int long long
3 #define lid (id<<1)
4 #define rid (id<<1|1)
5 using namespace std;
6 namespace AE86{
7 inline int read(){
8 int x=0,f=1;char ch=getchar();
9 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
10 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
11 }inline void write(int x,char opt='\n'){
12 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
13 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
14 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
15 }using namespace AE86;
16
17 const int NN=200005;
18 int n,h[NN],stk[NN],top,ll[NN],rr[NN],ans[NN];
19 struct seg{
20 int l,r,k,b;
21 int calc(int x){return k*x+b;}
22 int cross(seg x){return (b-x.b)/(x.k-k);}
23 }tr[NN<<2];
24 inline void build(int id,int l,int r){
25 tr[id]=(seg){1,n,0,(int)-1e18};
26 if(l==r) return; int mid=l+r>>1;
27 build(lid,l,mid); build(rid,mid+1,r);
28 }
29 inline void insert(int id,int l,int r,seg x){
30 if(l==r){
31 if(tr[id].calc(l)<x.calc(l)) tr[id]=x;
32 return;
33 }
34 if(x.l<=l&&r<=x.r){
35 if(tr[id].calc(l)<=x.calc(l)&&tr[id].calc(r)<=x.calc(r)) tr[id]=x;
36 else if(tr[id].calc(l)<=x.calc(l)||tr[id].calc(r)<=x.calc(r)){
37 int mid=l+r>>1;
38 if(tr[id].calc(mid)<x.calc(mid)) swap(tr[id],x);
39 if(tr[id].cross(x)<=mid) insert(lid,l,mid,x);
40 if(tr[id].cross(x)>=mid) insert(rid,mid+1,r,x);
41 }
42 }
43 else{
44 int mid=l+r>>1;
45 if(x.l<=mid) insert(lid,l,mid,x);
46 if(x.r>mid) insert(rid,mid+1,r,x);
47 }
48 }
49 inline int query(int id,int l,int r,int pos){
50 if(l==r) return tr[id].calc(pos);
51 int ans=tr[id].calc(pos),mid=l+r>>1;
52 if(pos<=mid) return max(ans,query(lid,l,mid,pos));
53 else return max(ans,query(rid,mid+1,r,pos));
54 }
55 namespace WSN{
56 inline short main(){
57 freopen("b.in","r",stdin);
58 freopen("b.out","w",stdout);
59 n=read(); for(int i=1;i<=n;i++) h[i]=read();
60 build(1,1,n);
61 for(int i=1;i<=n;i++){
62 while(top && h[stk[top]]>h[i]) rr[stk[top--]]=i-1;
63 stk[++top]=i;
64 }
65 while(top) rr[stk[top--]]=n; top=0;
66 for(int i=n;i;i--){
67 while(top && h[stk[top]]>h[i]) ll[stk[top--]]=i;
68 stk[++top]=i;
69 }
70 for(int i=1;i<=n;i++){
71 insert(1,1,n,(seg){i,rr[i],h[i],-h[i]*ll[i]});
72 ans[i]=max(ans[i-1],query(1,1,n,i));
73 }
74 for(int i=1;i<=n;i++) write(ans[i],' ');cout<<endl;
75 return 0;
76 }
77 }
78 signed main(){return WSN::main();}

T4 边数

咕咕咕

Noip模拟59 2021.9.22的更多相关文章

  1. 2021.9.22考试总结[NOIP模拟59]

    T1 柱状图 关于每个点可以作出两条斜率绝对值为\(1\)的直线. 将绝对值拆开,对在\(i\)左边的点\(j\),\(h_i-i=h_j-j\),右边则是把减号换成加号. 把每个点位置为横坐标,高度 ...

  2. Noip模拟70 2021.10.6

    T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...

  3. Noip模拟76 2021.10.14

    T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...

  4. Noip模拟69 2021.10.5

    考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...

  5. Noip模拟63 2021.9.27(考场惊现无限之环)

    T1 电压机制 把题目转化为找那些边只被奇数环包含. 这样的话直接$dfs$生成一棵树,给每个点附上一个深度,根据其他的非树边都是返祖边 可以算出环内边的数量$dep[x]-dep[y]+1$,然后判 ...

  6. Noip模拟61 2021.9.25

    T1 交通 考场上想了一个$NPC$.应该吧,是要求出图里面的所有可行的不重复欧拉路 无数种做法都无法解出,时间也都耗在这个上面的,于是就考的挺惨的 以后要是觉得当前思路不可做,就试着换一换思路,千万 ...

  7. Noip模拟52 2021.9.13

    T1 异或 比较稳的切掉 观察数据范围,无法线性筛啥的,根号复杂度也会死,于是只能考虑$log$级 然后打表 发现当$n$为$2^i$时的答案是一个可递归数列: $1,3,7,15,31,63,127 ...

  8. Noip模拟51 2021.9.12

    T1 茅山道术 考场上卡在了一个恶心的地方, 当时以为每次施法都会产生新的可以施法的区间,然后想都没细想, 认为不可做,甚至$dfs$也无法打,考后一问发现是自己想多了.. 新产生的区间对答案根本没有 ...

  9. Noip模拟50 2021.9.10

    已经好长时间没有考试不挂分的良好体验了... T1 第零题 开场数据结构,真爽 对于这道题首先要理解对于一条链从上向下和从下向上走复活次数相等 (这可能需要晚上躺在被窝里面脑摸几种情况的样例) 然后就 ...

随机推荐

  1. 妙用 background 实现花式文字效果

    本文将讲解如何利用 background 系列属性,巧妙的实现一些花式的文字效果.通过本文,你将可以学到: 通过 background-size 与 background-position 实现酷炫的 ...

  2. [第五篇]——Docker 镜像加速之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器.Docker 官方和国内很多云服务商都提供了国内加速器服务,例如: 科大镜像: 网易: 阿里云: 你 ...

  3. Devexpress gridcontrol设置列样式

    <dxg:GridControl.Columns><dxg:GridColumn Header="排名" FieldName="UserRank&quo ...

  4. CodeForce-803C Maximal GCD(贪心数学)

    Maximal GCD CodeForces - 803C 现在给定一个正整数 n.你需要找到 k 个严格递增的正整数 a1, a2, ..., ak,满足他们的和等于 n 并且他们的最大公因数尽量大 ...

  5. http请求在https中使用

    问题原因:HTTPS页面里动态的引入HTTP资源,比如引入一个js文件,会被直接block掉的.在HTTPS页面里通过AJAX的方式请求HTTP资源,也会被直接block掉的. 解决方案: <m ...

  6. Nginx系列(2)- 正向代理和反向代理

    Nginx作用 Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理 正向代理是代理客户端,反向代理是代理服务端 正向代理要知道访问服务器的地址,反向代理不需要知道访问服务器的真实 ...

  7. Linux系列(1) - 使用Hyper-V安装Linux系统

    前言 使用工具:Hyper-V,补充:hyper-v是一项技术,而vmware是一款软件.具体区别自行百度 LINUX版本:CentOS-8.4.2105-x86_64-dvd1.iso Window ...

  8. PHP验证

    class yanzhenglei{ /**     * 检查日期格式         * @param string $str 日期格式2015-01-01     * @return bool   ...

  9. [模板]多项式全家桶小记(求逆,开根,ln,exp)

    前言 这里的全家桶目前只包括了\(ln,exp,sqrt\).还有一些类似于带余数模,快速幂之类用的比较少的有时间再更,\(NTT\)这种前置知识这里不多说. 还有一些基本的导数和微积分内容要了解,建 ...

  10. IE浏览器报400错误:Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

    前言: 在用IE浏览器时访问tomcat项目时,页面报400错误,后台错误: java.lang.IllegalArgumentException: Invalid character found i ...