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

  1. Noip模拟58 2021.9.21(中秋祭&&换机房祭)

    第一次在学校过中秋节,给家里人视频电话,感觉快回家了很开心, 然后还吃了汉堡喝饮料非常爽,颓废了一会儿还换了新机房,$Linux2.0$非常dei,少爷机也非常快, 发现好像测评机又成了老爷机,这就是 ...

  2. Noip模拟45 2021.8.21

    一定别删大括号,检查是;还是, ceil函数里面要写double,否则根本没用!!!!!!! T1 打表 正解:打表 考场上很难真正把柿子理解着推出来 况且想要理解题意就很难,比如我就理解错了 半猜着 ...

  3. noip模拟22[d·e·f]

    noip模拟22 solutions 哈哈哈,这次暴力打满直接190,其实不到哈哈哈,187.. 这次的题暴力极其好打,但是正解确实不简单... 打了好久才改完这个题,改完的时候爽暴了 这些一个字母的 ...

  4. Noip模拟76 2021.10.14

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

  5. [考试总结]noip模拟22

    又发现模拟 \(22\) 的总结也咕掉了,现在补上它... 似乎又是gg的一场. 以为自己的部分分数打的很全,然而到后面发现自己的树剖打假了 \(\color{green}{\huge{\text{树 ...

  6. 2021.7.21考试总结[NOIP模拟22]

    终于碾压小熠了乐死了 T1 d 小贪心一波直接出正解,没啥好说的(bushi 好像可以主席树暴力找,但我怎么可能会呢?好像可以堆优化简单找,但我怎么可能想得到呢? 那怎么办?昨天两道单调指针加桶,我直 ...

  7. Noip模拟59 2021.9.22

    新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...

  8. Noip模拟70 2021.10.6

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

  9. Noip模拟69 2021.10.5

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

随机推荐

  1. PPPoE技术白皮书(H3C)

    PPPoE技术白皮书 关键词:PPP,Ethernet,PPPoE 摘要:PPPoE是一种通过一个远端接入设备为以太网上的主机提供接入服务,并可以对接入的每个主机实现控制和计费的技术.本文介绍了PPP ...

  2. MacOS安装和卸载Java

    ​ 安装java 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 设 ...

  3. ABP 极简入门教程(二 MVC方式显示数据)

    增加显示菜单 Sample.Web.MVC项目中找到startup目录打开SampleNavigationProvider.cs,根据现有内容添加以下内容 .AddItem( new MenuItem ...

  4. js实现钟表

    在网页上显示一个钟表 html: <body onload="startTime()"> <div id="txt"></div& ...

  5. Map集和

    目录 Map 特点 继承树 常用方法 entrySet 方法 HashMap 特点 HashMap 的重要常量 存储结构 jdk1.8 总结 面试题 HashMap存储自定义类型键值 LinkedHa ...

  6. 详解C3P0(数据库连接池)

    详解C3P0(数据库连接池) 快速索引 一.基本定义 二.使用C3P0(数据库连接池)的必要性 1.JDBC传统模式开发存在的主要问题 三.数据库连接池的详细说明 四.使用连接池的明显优势 1.资源的 ...

  7. Linux内核中断顶半部和底半部的理解

    文章目录 中断上半部.下半部的概念 实现中断下半部的三种方法 软中断 软中断模版 tasklet tasklet函数模版 工作队列 工作队列函数模版 进程上下文和中断上下文 软中断和硬中断的区别 硬中 ...

  8. Java基础系列(8)- 数据类型

    数据类型 强类型语言 要求变量的使用合乎规定,所有的变量都必须先定义才能使用.Java是强类型语言. 弱类型语言 变量定义比较随意,比如"12"+3,可以是int型123,也可以是 ...

  9. 在Ubuntu18.04安装docker之后,以登陆用户身份执行docker pull jenkins,报错:connect: permission denied

    Using default tag: latest Got permission denied while trying to connect to the Docker daemon socket ...

  10. bzoj4589-Hard Nim【FWT】

    正题 题目链接:https://darkbzoj.tk/problem/4589 题目大意 求有多少个长度为\(n\)的数列满足它们都是不大于\(m\)的质数且异或和为\(0\). 解题思路 两个初始 ...