Noip模拟22 2021.7.21
T1 d
简化题意就是找到相对平均长宽的偏移量较大的矩形给他删掉
可以说是个贪心,按照a,b分别为第一关键字排序
然后假装删去要求的那么多个按a排序的较小的,然后再去b中,
找到 删去的a中的那几个矩形 比 按b排序的却并未删去的矩形 优的加回到最终用的矩形集合中
上述操作用经典指针可以实现。(%%zxs活学活用指针场上A掉此题)
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int read(){
5 int x=0,f=1; char ch=getchar();
6 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
7 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
8 return x*f;
9 }
10 inline int max(int a,int b){return a>b?a:b;}
11 inline int min(int a,int b){return a<b?a:b;}
12 const int NN=1e5+5,inf=1e18;
13 int T,n,m,cnt,ita,itb,ans,tmp;
14 int ta[NN],tb[NN];
15 bool vis[NN];
16 struct node{int a,b,id;}s[NN],aa[NN],bb[NN];
17 inline bool cmp1(node x,node y){return x.a==y.a? x.b<y.b:x.a<y.a;}
18 inline bool cmp2(node x,node y){return x.b==y.b? x.a<y.a:x.b<y.b;}
19 inline void clear(){
20 memset(vis,0,sizeof(vis));
21 memset(ta,0,sizeof(ta));
22 memset(tb,0,sizeof(tb));
23 ans=0; ita=itb=inf; tmp=1;
24 }
25 inline void move(){
26 while(!ta[ita]) ita++;
27 while(!tb[itb]) itb++;
28 ans=max(ans,ita*itb);
29 }
30 namespace WSN{
31 inline int main(){
32 T=read(); if(!T) return 0;
33 while(T--){
34 clear();
35 n=read();m=read();
36 for(int i=1;i<=n;i++) s[i].a=read(),s[i].b=read(),s[i].id=i;
37 for(int i=1;i<=n;i++){
38 aa[i]=s[i]; bb[i]=s[i];
39 ta[s[i].a]++; tb[s[i].b]++;
40 ita=min(ita,s[i].a); itb=min(itb,s[i].b);
41 }
42 sort(aa+1,aa+n+1,cmp1); sort(bb+1,bb+n+1,cmp2);
43 for(int i=1;i<=m;i++){
44 vis[aa[i].id]=1;
45 --ta[aa[i].a]; --tb[aa[i].b];
46 } move();
47 for(int i=1;i<=m;i++){
48 if(aa[m-i+1].b<=itb) continue;
49 vis[aa[m-i+1].id]=0; ++ta[aa[m-i+1].a]; ++tb[aa[m-i+1].b];
50 if(aa[m-i+1].a<ita) ita=aa[m-i+1].a;
51 while(vis[bb[tmp].id]) tmp++; --ta[bb[tmp].a]; --tb[bb[tmp].b]; vis[bb[tmp].id]=1;
52 move();
53 }
54 printf("%lld\n",ans);
55 }
56 return 0;
57 }
58 }
59 signed main(){return WSN::main();}
T2 e
题目好理解,用:
树链剖分套线段书套平衡树可以解决(Splay没有FHQ—treap更具奇迹性)
我打的Splay无法过掉最大的点,但是JYFHYX打的FHQ—treap却可以
这就是treap的复杂度奇迹性。。。。
1 #include<bits/stdc++.h>
2 #define lid (id<<1)
3 #define rid (id<<1|1)
4 inline int max(int a,int b){return a>b?a:b;}
5 inline int min(int a,int b){return a<b?a:b;}
6 inline void swap(int &x,int &y){x^=y^=x^=y;}
7 using namespace std;
8 inline int read(){
9 int x=0,f=1; char ch=getchar();
10 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
11 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
12 return x*f;
13 }
14 inline void write(int x){
15 if(x<0){ putchar('-'); x=-x;}
16 if(x>9) write(x/10);
17 putchar(x%10+'0');
18 }
19 const int NN=1500000,inf=2e9;
20 int n,q,typ,a[NN],x[NN],r,k,Q[NN],tot,rt[NN<<2],ans;
21 int dfn[NN],rk[NN],son[NN],fa[NN],top[NN],siz[NN],dep[NN],cnt;
22 struct SNOW{int to,next;};SNOW e[NN<<1]; int head[NN],rp;
23 struct Splay{int son[2],fa,cnt,siz,val;}s[NN];
24 inline void add(int x,int y){
25 e[++rp]=(SNOW){y,head[x]};head[x]=rp;
26 e[++rp]=(SNOW){x,head[y]};head[y]=rp;
27 }
28 inline void dfs1(int f,int x){
29 siz[x]=1;dep[x]=dep[f]+1;fa[x]=f;
30 for(int i=head[x];i;i=e[i].next){
31 int y=e[i].to;
32 if(y==f) continue;
33 dfs1(x,y); siz[x]+=siz[y];
34 if(siz[son[x]]<siz[y]) son[x]=y;
35 }
36 }
37 inline void dfs2(int x,int t){
38 top[x]=t; dfn[x]=++cnt; rk[cnt]=x;
39 if(!son[x]) return;
40 dfs2(son[x],t);
41 for(int i=head[x];i;i=e[i].next){
42 int y=e[i].to;
43 if(y!=fa[x]&&y!=son[x]) dfs2(y,y);
44 }
45 }
46 inline int LCA(int x,int y){
47 while(top[x]!=top[y]){
48 if(dep[top[x]]<dep[top[y]]) swap(x,y);
49 x=fa[top[x]];
50 }if(dfn[x]>dfn[y]) swap(x,y);
51 return x;
52 }
53 struct SPLAY{
54 void pushup(int x){s[x].siz=s[s[x].son[0]].siz+s[s[x].son[1]].siz+s[x].cnt;}
55 int get(int x){return x==s[s[x].fa].son[1];}
56 void rotate(int x){
57 int y=s[x].fa,z=s[y].fa,xpos=get(x),ypos=get(y);
58 s[z].son[ypos]=x; s[x].fa=z;
59 s[y].son[xpos]=s[x].son[xpos^1]; s[s[x].son[xpos^1]].fa=y;
60 s[x].son[xpos^1]=y; s[y].fa=x;
61 pushup(y); pushup(x);
62 }
63 void splay(int x,int goal,int root){
64 while(s[x].fa!=goal){
65 int y=s[x].fa,z=s[y].fa,xpos=get(x),ypos=get(y);
66 if(z!=goal){
67 if(xpos==ypos) rotate(y);
68 else rotate(x);
69 }rotate(x);
70 }if(!goal) rt[root]=x;
71 }
72 void insert(int val,int root){
73 int u=rt[root],fa=0;
74 while(u && s[u].val!=val) fa=u,u=s[u].son[val>s[u].val];
75 if(u) s[u].cnt++;
76 else{
77 u=++tot;
78 if(fa) s[fa].son[val>s[fa].val]=u;
79 s[u].son[0]=s[u].son[1]=0; s[u].val=val; s[u].fa=fa;
80 s[u].siz=s[u].cnt=1;
81 }splay(u,0,root);
82 }
83 void find_rank(int val,int root){
84 int u=rt[root];
85 if(!u) return;
86 while(s[u].son[val>s[u].val] && val!=s[u].val) u=s[u].son[val>s[u].val];
87 splay(u,0,root);
88 }
89 int prenxt(int val,int op,int root){
90 find_rank(val,root);int u=rt[root];
91 if(s[u].val>=val && op) return u;
92 if(s[u].val<=val &&!op) return u;
93 u=s[u].son[op];
94 while(s[u].son[op^1]) u=s[u].son[op^1];
95 return u;
96 }
97 }sp;
98 struct SNOWtree{
99 void build(int id,int l,int r){
100 sp.insert(inf,id); sp.insert(-inf,id);
101 if(l==r) return;
102 int mid=l+r>>1;
103 build(lid,l,mid); build(rid,mid+1,r);
104 }
105 void insert(int id,int l,int r,int pos,int val){
106 sp.insert(val,id);
107 if(l==r) return; int mid=l+r>>1;
108 if(pos<=mid) insert(lid,l,mid,pos,val);
109 else insert(rid,mid+1,r,pos,val);
110 }
111 int pre(int id,int l,int r,int L,int R,int val){
112 if(l>R||r<L) return -inf;
113 if(L<=l&&r<=R) return s[sp.prenxt(val,0,id)].val;
114 int mid=l+r>>1;
115 return max(pre(lid,l,mid,L,R,val),pre(rid,mid+1,r,L,R,val));
116 }
117 int nxt(int id,int l,int r,int L,int R,int val){
118 if(l>R||r<L) return inf;
119 if(L<=l&&r<=R) return s[sp.prenxt(val,1,id)].val;
120 int mid=l+r>>1;
121 return min(nxt(lid,l,mid,L,R,val),nxt(rid,mid+1,r,L,R,val));
122 }
123 }tr;
124 inline int houj(int x,int y,int k){
125 int ans=inf;
126 while(top[x]!=top[y]){
127 if(dep[top[x]]<dep[top[y]]) swap(x,y);
128 ans=min(ans,tr.nxt(1,1,n,dfn[top[x]],dfn[x],k));;
129 x=fa[top[x]];
130 }if(dfn[x]>dfn[y]) swap(x,y);
131 ans=min(ans,tr.nxt(1,1,n,dfn[x],dfn[y],k));
132 return ans;
133 }
134 inline int qian(int x,int y,int k){
135 int ans=-inf;
136 while(top[x]!=top[y]){
137 if(dep[top[x]]<dep[top[y]]) swap(x,y);
138 ans=max(ans,tr.pre(1,1,n,dfn[top[x]],dfn[x],k));
139 x=fa[top[x]];
140 }if(dfn[x]>dfn[y]) swap(x,y);
141 ans=max(ans,tr.pre(1,1,n,dfn[x],dfn[y],k));
142 return ans;
143 }
144 namespace WSN{
145 inline int main(){
146 // freopen("e7.in","r",stdin);
147 // freopen("6.out","w",stdout);
148 n=read(); q=read(); typ=read();if(!q) return 0;
149 for(int i=1;i<=n;i++) a[i]=read();
150 for(int i=1;i<n;i++) add(read(),read());
151 dfs1(0,1); dfs2(1,1); tr.build(1,1,n);
152 for(int i=1;i<=n;i++) tr.insert(1,1,n,dfn[i],a[i]);
153 for(int w=1;w<=q;w++){
154 r=read(),k=read();
155 for(int i=1;i<=k;i++) Q[i]=x[i]=read();
156 if(typ) for(int i=1;i<=k;i++) Q[i]=(x[i]-1+ans*typ)%n+1;
157 ans=inf;
158 int Lca=Q[1]; for(int i=2;i<=k;i++) Lca=LCA(Lca,Q[i]);
159 for(int i=1;i<=k;i++){
160 int pre=qian(Lca,Q[i],r);
161 int nxt=houj(Lca,Q[i],r);
162 ans=min(ans,min(abs(r-pre),abs(r-nxt)));
163 } write(ans); putchar('\n');
164 }
165 return 0;
166 }
167 }
168 signed main(){return WSN::main();}
80分树套树套树
正解是个主席树板子,所以打完这道题后就去打了主席树专题
1 #include<bits/stdc++.h>
2 inline int max(int a,int b){return a>b?a:b;}
3 inline int min(int a,int b){return a<b?a:b;}
4 inline void swap(int &x,int &y){x^=y^=x^=y;}
5 using namespace std;
6 inline int read(){
7 int x=0,f=1; char ch=getchar();
8 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
9 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
10 return x*f;
11 }
12 inline void write(int x){
13 if(x<0){ putchar('-'); x=-x;}
14 if(x>9) write(x/10);
15 putchar(x%10+'0');
16 }
17 const int NN=100005,inf=2e9;
18 int n,q,typ,a[NN],x[NN],r,k,Q[NN],tot,ans;
19 int dfn[NN],rk[NN],son[NN],fa[NN],top[NN],siz[NN],dep[NN],cnt;
20 int rt[NN];
21 struct SNOW{int to,next;};SNOW e[NN<<1]; int head[NN],rp;
22 inline void add(int x,int y){
23 e[++rp]=(SNOW){y,head[x]};head[x]=rp;
24 e[++rp]=(SNOW){x,head[y]};head[y]=rp;
25 }
26 inline void dfs1(int f,int x){
27 siz[x]=1;dep[x]=dep[f]+1;fa[x]=f;
28 for(int i=head[x];i;i=e[i].next){
29 int y=e[i].to;
30 if(y==f) continue;
31 dfs1(x,y); siz[x]+=siz[y];
32 if(siz[son[x]]<siz[y]) son[x]=y;
33 }
34 }
35 inline void dfs2(int x,int t){
36 top[x]=t; dfn[x]=++cnt; rk[cnt]=x;
37 if(!son[x]) return;
38 dfs2(son[x],t);
39 for(int i=head[x];i;i=e[i].next){
40 int y=e[i].to;
41 if(y!=fa[x]&&y!=son[x]) dfs2(y,y);
42 }
43 }
44 inline int LCA(int x,int y){
45 while(top[x]!=top[y]){
46 if(dep[top[x]]<dep[top[y]]) swap(x,y);
47 x=fa[top[x]];
48 }if(dfn[x]>dfn[y]) swap(x,y);
49 return x;
50 }
51 struct SNOWtree{
52 int num,ll[NN*80],rr[NN*80],sum[NN*80];
53 inline int New(int x){sum[++num]=sum[x]; ll[num]=ll[x]; rr[num]=rr[x]; return num;}
54 inline void pushup(int x){sum[x]=sum[ll[x]]+sum[rr[x]];}
55 inline int insert(int id,int l,int r,int pos){
56 id=New(id); ++sum[id];
57 if(l==r) return id;
58 int mid=l+r>>1;
59 if(pos<=mid) ll[id]=insert(ll[id],l,mid,pos);
60 else rr[id]=insert(rr[id],mid+1,r,pos);
61 pushup(id); return id;
62 }
63 inline int pre(int id1,int id2,int l,int r,int pos){
64 if(sum[id1]==sum[id2]) return -inf;
65 if(l==r) return l;
66 int mid=l+r>>1;
67 if(pos<=mid) return pre(ll[id1],ll[id2],l,mid,pos);
68 else{
69 int tmp=pre(rr[id1],rr[id2],mid+1,r,pos);
70 if(tmp!=-inf) return tmp;
71 else return pre(ll[id1],ll[id2],l,mid,mid);
72 }
73 }
74 inline int nxt(int id1,int id2,int l,int r,int pos){
75 if(sum[id1]==sum[id2]) return inf;
76 if(l==r) return l;
77 int mid=l+r>>1;
78 if(pos>mid) return nxt(rr[id1],rr[id2],mid+1,r,pos);
79 else{
80 int tmp=nxt(ll[id1],ll[id2],l,mid,pos);
81 if(tmp!=inf) return tmp;
82 else return nxt(rr[id1],rr[id2],mid+1,r,mid+1);
83 }
84 }
85 }tr;
86 namespace WSN{
87 inline int main(){
88 // freopen("e7.in","r",stdin);
89 // freopen("6.out","w",stdout);
90 n=read(); q=read(); typ=read();if(!q) return 0;
91 for(int i=1;i<=n;i++) a[i]=read();
92 for(int i=1;i<n;i++) add(read(),read());
93 dfs1(0,1); dfs2(1,1);
94 for(int i=1;i<=n;i++) rt[i]=tr.insert(rt[fa[i]],1,inf,a[i]);
95 for(int w=1;w<=q;w++){
96 r=read(),k=read();
97 for(int i=1;i<=k;i++) Q[i]=x[i]=read();
98 if(typ) for(int i=1;i<=k;i++) Q[i]=(x[i]-1+ans*typ)%n+1;
99 ans=inf;
100 int Lca=Q[1]; for(int i=2;i<=k;i++) Lca=LCA(Lca,Q[i]);
101 for(int i=1;i<=k;i++){
102 int pre=tr.pre(rt[fa[Lca]],rt[Q[i]],1,inf,r);
103 int nxt=tr.nxt(rt[fa[Lca]],rt[Q[i]],1,inf,r);
104 //cout<<"pre="<<pre<<endl;
105 //cout<<"nxt="<<nxt<<endl;
106 ans=min(ans,min(abs(r-pre),abs(r-nxt)));
107 } write(ans); putchar('\n');
108 }
109 return 0;
110 }
111 }
112 signed main(){return WSN::main();}
T3 f
沽沽沽~~~
Noip模拟22 2021.7.21的更多相关文章
- Noip模拟58 2021.9.21(中秋祭&&换机房祭)
第一次在学校过中秋节,给家里人视频电话,感觉快回家了很开心, 然后还吃了汉堡喝饮料非常爽,颓废了一会儿还换了新机房,$Linux2.0$非常dei,少爷机也非常快, 发现好像测评机又成了老爷机,这就是 ...
- Noip模拟45 2021.8.21
一定别删大括号,检查是;还是, ceil函数里面要写double,否则根本没用!!!!!!! T1 打表 正解:打表 考场上很难真正把柿子理解着推出来 况且想要理解题意就很难,比如我就理解错了 半猜着 ...
- noip模拟22[d·e·f]
noip模拟22 solutions 哈哈哈,这次暴力打满直接190,其实不到哈哈哈,187.. 这次的题暴力极其好打,但是正解确实不简单... 打了好久才改完这个题,改完的时候爽暴了 这些一个字母的 ...
- Noip模拟76 2021.10.14
T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...
- [考试总结]noip模拟22
又发现模拟 \(22\) 的总结也咕掉了,现在补上它... 似乎又是gg的一场. 以为自己的部分分数打的很全,然而到后面发现自己的树剖打假了 \(\color{green}{\huge{\text{树 ...
- 2021.7.21考试总结[NOIP模拟22]
终于碾压小熠了乐死了 T1 d 小贪心一波直接出正解,没啥好说的(bushi 好像可以主席树暴力找,但我怎么可能会呢?好像可以堆优化简单找,但我怎么可能想得到呢? 那怎么办?昨天两道单调指针加桶,我直 ...
- Noip模拟59 2021.9.22
新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...
- Noip模拟70 2021.10.6
T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...
- Noip模拟69 2021.10.5
考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...
随机推荐
- MySQL实战45讲(21--25)-笔记
21 | 为什么我只改一行的语句,锁这么多? 加锁规则里面:包含了两个"原则".两个"优化"和一个"bug". 原则 1:加锁的基本单位是 ...
- liquibase新增字段注释导致表格注释同时变更bug记录
liquibase是一个用于数据库变更跟踪.版本管理和自动部署的开源工具.它的使用方式方法可以参考官方文档或者其他人的博客,这里不做过多介绍. 1. 问题复现 在使用过程中发现了一个版本bug.这个b ...
- Spring Boot 2.x 之 Spring Data JPA, Hibernate 5
1. Spring Boot常用配置项 基于Spring Boot 2.0.6.RELEASE 1.1 配置属性类 spring.jpa前缀的相关配置项定义在JpaProperties类中, 1.2 ...
- 羽夏看Win系统内核——环境搭建
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- Dockerfile自动制作Docker镜像(二)—— 其它常用命令
Dockerfile自动制作Docker镜像(二)-- 其它常用命令 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:Dockerf ...
- Anaconda配置国内镜像源
1. 为conda配置(清华)镜像源 使用conda进行安装时,访问的是国外的网络,所以下载和安装包时会特别慢.我们需要更换到国内镜像源地址,这里我更换到国内的清华大学地址.(永久添加镜像) Wind ...
- 3.8学习总结——Android保存信息
为了保存软件的设置参数,Android平台为我们提供了一个SharedPreferences接口,它是一个轻量级的存储类,特别适合用于保存软件配置参数.使用SharedPreferences保存数据, ...
- 有备无患「GitHub 热点速览 v.21.38」
作者:HelloGitHub-小鱼干 数据库最重要的一个功能是容灾备份,备份不只是对数据库重要,对日常工作生活的我们一样重要,比如花了一个工作日写的代码没有备份(虽然可能只有 1 行-)总归是一个让人 ...
- 我是小白,做PPT像流水账,怎么做一份重点突出的PPT?
1.PPT的封面不要只写标题,还要在显眼的位置写上你的核心观点.比如,你之前做的PPT封面标题是<A产品市场前景分析>,现在不妨加上一个副标题<红海市场中需要找到更多本产品卖点> ...
- 启动jemeter 报错相关解决方案
1:当启动jemeter时报错"页面文件太小,无法完成操作" 如图: 是说明分配的内容不足,即可调整内存重启即可解决 1):打开:控制面板>系统和安全>系统 2):点击 ...