NOIP模拟22
T1d
一道垃圾贪心,写个堆优化或者桶就行
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int read()
5 {
6 int x=0,f=1;
7 char ch=getchar();
8 while(ch<'0'||ch>'9')
9 {
10 if(ch=='-') f=-1;
11 ch=getchar();
12 }
13 while(ch>='0'&&ch<='9')
14 {
15 x=(x<<1)+(x<<3)+(ch^48);
16 ch=getchar();
17 }
18 return x*f;
19 }
20 int n,m;
21 const int maxn=2e5;
22 struct matrix{
23 int a,b,id;
24 }jx[maxn],aa[maxn],bb[maxn];
25 bool cmp1(matrix a,matrix b)
26 {
27 if(a.b!=b.b)
28 return a.b<b.b;
29 return b.a<b.a;
30 }
31 bool cmp2(matrix a,matrix b)
32 {
33 if(a.a!=b.a)
34 return a.a<b.a;
35 return b.b<b.b;
36 }
37 int tonga[maxn],tongb[maxn];
38 bool vis[maxn];
39 signed main()
40 {
41 int t=read();
42 while(t--)
43 {
44 memset(tonga,0,sizeof(tonga));
45 memset(tongb,0,sizeof(tongb));
46 memset(vis,0,sizeof(vis));
47 n=read(),m=read();
48 for(int i=1;i<=n;i++)
49 {
50 aa[i].a=bb[i].a=jx[i].a=read();
51 tonga[jx[i].a]++;
52 aa[i].b=bb[i].b=jx[i].b=read();
53 tongb[jx[i].b]++;
54 aa[i].id=i,bb[i].id=i;
55 }
56 sort(aa+1,aa+1+n,cmp2);
57 sort(bb+1,bb+1+n,cmp1);
58 for(int i=1;i<=m;i++)
59 tonga[aa[i].a]--,tongb[aa[i].b]--,vis[aa[i].id]=1;
60 int tempa=0,tempb=0,tmp=1,ans=0;
61 while(!tonga[tempa]) tempa++;
62 while(!tongb[tempb]) tempb++;
63 ans=max(ans,tempb*tempa);
64 for(int i=1;i<=m;i++)
65 {
66 if(aa[m-i+1].b<=tempb) continue;
67 vis[aa[m-i+1].id]=0;
68 ++tonga[aa[m-i+1].a];
69 ++tongb[aa[m-i+1].b];
70 if(aa[m-i+1].a<tempa) tempa=aa[m-i+1].a;
71 while(vis[bb[tmp].id]) tmp++;
72 vis[bb[tmp].id]=1,tongb[bb[tmp].b]--,tonga[bb[tmp].a]--;
73 while(!tonga[tempa]) tempa++;
74 while(!tongb[tempb]) tempb++;
75 ans=max(ans,tempb*tempa);
76 }
77 cout<<ans<<endl;
78 }
79 }
T1
T2e
正解是主席树?????
主席树没有学怎么办????
如果想写这个题,首先你要学习线段树套平衡树技巧(二逼平衡树),以及树链剖分在线段树上的应用;
结合起来!!!!!!!!!!!
写个树链剖分+线段树+平衡树可以过非一条链的点,
一条链上的暴力跳lca就好了,只不过码起来真tm爽!!!!!!!!
1 #include<bits/stdc++.h>
2 #define inf 2e9
3 #define lid id<<1
4 #define rid id<<1|1
5 using namespace std;
6 inline int read()
7 {
8 int x=0,f=1;
9 char ch=getchar();
10 while(ch<'0'||ch>'9')
11 {
12 if(ch=='-') f=-1;
13 ch=getchar();
14 }
15 while(ch>='0'&&ch<='9')
16 {
17 x=(x<<1)+(x<<3)+(ch^48);
18 ch=getchar();
19 }
20 return x*f;
21 }
22 const int maxn=2e6+1;
23 struct treap{
24 int l,r,size,cnt,dat,val;
25 }a[maxn];
26 struct seg_tree{
27 int l,r,root,lazy;
28 }tr[maxn<<2];
29 int n,q,type,tot;
30 struct node{
31 int to,nxt;
32 }e[maxn*2];
33 int head[maxn];
34 bool flag=1;
35 int val[maxn];
36 bool vis[100001];
37 int w[maxn],num;
38 int dfn[maxn],size[maxn],son[maxn],fa[maxn],top[maxn];
39 int dep[maxn],cnt;
40 int cz[maxn],rr,k;
41 inline void add(int x,int y)
42 {
43 e[++num].to=y;
44 e[num].nxt=head[x];
45 head[x]=num;
46 if(x!=y+1&&y!=x+1) flag=0;
47 swap(x,y);
48 e[++num].to=y;
49 e[num].nxt=head[x];
50 head[x]=num;
51 }
52 inline int New(int val)
53 {
54 a[++tot].val=val;
55 a[tot].dat=rand();
56 a[tot].cnt=a[tot].size=1;
57 return tot;
58 }
59 inline void pushup(int p)
60 {
61 a[p].size=a[a[p].l].size+a[a[p].r].size+1;
62 }
63 inline int merge(int x,int y)
64 {
65 if(!x||!y)
66 return x|y;
67 if(a[x].dat<a[y].dat)
68 {
69 a[x].r=merge(a[x].r,y);
70 pushup(x);
71 return x;
72 }
73 else
74 {
75 a[y].l=merge(x,a[y].l);
76 pushup(y);
77 return y;
78 }
79 }
80 inline void split(int now,int kk,int &x,int &y)
81 {
82 if(!now)
83 {
84 x=y=0;
85 return ;
86 }
87 if(kk>=a[now].val)
88 {
89 x=now;
90 split(a[now].r,kk,a[now].r,y);
91 }
92 else
93 {
94 y=now;
95 split(a[now].l,kk,x,a[now].l);
96 }
97 pushup(now);
98 }
99 inline void insert(int &root,int val)
100 {
101 int x,y;
102 split(root,val,x,y);
103 root=merge(merge(x,New(val)),y);
104 }
105 void build(int id,int l,int r)
106 {
107 tr[id].l=l; tr[id].r=r;
108 if(l==r)
109 {
110 tr[id].root=New(w[l]);
111 return ;
112 }
113 for(int j=l;j<=r;j++)
114 insert(tr[id].root,w[j]);
115 int mid=(l+r)>>1;
116 build(lid,l,mid);
117 build(rid,mid+1,r);
118 }
119 inline int pre(int &root,int val)
120 {
121 int x,y,ans;
122 split(root,val-1,x,y);
123 if(!x) return -inf;
124 int kk=x;
125 while(a[kk].r)
126 kk=a[kk].r;
127 ans=a[kk].val;
128 root=merge(x,y);
129 return ans;
130 }
131 inline int nxt(int &root,int val)
132 {
133 int x,y,ans;
134 split(root,val,x,y);
135 if(!y) return inf;
136 int kk=y;
137 while(a[kk].l)
138 kk=a[kk].l;
139 ans=a[kk].val;
140 root=merge(x,y);
141 return ans;
142 }
143 inline int askpre(int id,int l,int r,int d)
144 {
145 if(tr[id].l>=l&&tr[id].r<=r)
146 return pre(tr[id].root,d);
147 int mid=(tr[id].l+tr[id].r)>>1;
148 int ans=-inf;
149 if(l<=mid)
150 ans=max(ans,askpre(lid,l,r,d));
151 if(r>mid)
152 ans=max(ans,askpre(rid,l,r,d));
153 return ans;
154 }
155 inline int asknxt(int id,int l,int r,int d)
156 {
157 if(tr[id].l>=l&&tr[id].r<=r)
158 return nxt(tr[id].root,d);
159 int mid=(tr[id].l+tr[id].r)>>1;
160 int ans=inf;
161 if(l<=mid)
162 ans=min(ans,asknxt(lid,l,r,d));
163 if(r>mid)
164 ans=min(ans,asknxt(rid,l,r,d));
165 return ans;
166 }
167 void dfs1(int x,int f)
168 {
169 size[x]=1;
170 for(int i=head[x];i;i=e[i].nxt)
171 {
172 int y=e[i].to;
173 if(y==f) continue;
174 dep[y]=dep[x]+1;
175 fa[y]=x;
176 dfs1(y,x);
177 size[x]+=size[y];
178 if(size[son[x]]<size[y])
179 son[x]=y;
180 }
181 }
182 void dfs2(int x,int f)
183 {
184 top[x]=f;
185 dfn[x]=++cnt;
186 w[cnt]=val[x];
187 if(!son[x]) return ;
188 dfs2(son[x],f);
189 for(int i=head[x];i;i=e[i].nxt)
190 {
191 int y=e[i].to;
192 if(y!=fa[x]&&y!=son[x])
193 dfs2(y,y);
194 }
195 }
196 inline int treepre(int x,int y,int jb)
197 {
198 int ans=-inf;
199 while(top[x]!=top[y])
200 {
201 if(dep[top[x]]<dep[top[y]])
202 swap(x,y);
203 ans=max(ans,askpre(1,dfn[top[x]],dfn[x],jb));
204 x=fa[top[x]];
205 }
206 if(dep[x]>dep[y])
207 swap(x,y);
208 ans=max(ans,askpre(1,dfn[x],dfn[y],jb));
209 return ans;
210 }
211 inline int treenxt(int x,int y,int jb)
212 {
213 int ans=inf;
214 while(top[x]!=top[y])
215 {
216 if(dep[top[x]]<dep[top[y]])
217 swap(x,y);
218 ans=min(ans,asknxt(1,dfn[top[x]],dfn[x],jb));
219 x=fa[top[x]];
220 }
221 if(dep[x]>dep[y])
222 swap(x,y);
223 ans=min(ans,asknxt(1,dfn[x],dfn[y],jb));
224 return ans;
225 }
226 inline int LCA(int x, int y)
227 {
228 while(top[x]!=top[y])
229 {
230 if(dep[top[x]]<dep[top[y]])
231 swap(x,y);
232 x=fa[top[x]];
233 }
234 return dep[x]<dep[y]?x:y;
235 }
236 inline void dfs3(int x,int goal,int &sum)
237 {
238 if(!x) return ;
239 if(vis[x]) return ;
240 vis[x]=1;
241 sum=min(sum,abs(val[x]-rr));
242 if(x==goal) return ;
243 dfs3(fa[x],goal,sum);
244 }
245 signed main()
246 {
247 //freopen("e7.in","r",stdin);
248 //freopen("out","w",stdout);
249 srand(time(0));
250 n=read(),q=read(),type=read();
251 for(int i=1;i<=n;i++) val[i]=read();
252 for(int i=1;i<n;i++) add(read(),read());
253 dfs1(1,0);
254 dfs2(1,1);
255 if(flag==1)
256 {
257 for(int i=1;i<=q;i++)
258 {
259 memset(vis,0,sizeof(vis));
260 rr=read(),k=read();
261 for(int j=1;j<=k;j++) cz[j]=read();
262 int ans=inf;
263 int lca=cz[1];
264 for(int j=2;j<=k;j++)
265 lca=LCA(lca,cz[j]);
266 for(int j=1;j<=k;j++)
267 dfs3(cz[j],lca,ans);
268 printf("%d\n",ans);
269 }
270 return 0;
271 }
272 else
273 {
274 build(1,1,n);
275 int ans=0;
276 for(int i=1;i<=q;i++)
277 {
278 rr=read(),k=read();
279 for(int j=1;j<=k;j++) cz[j]=((read()-1+type*ans)%n)+1;
280 ans=inf;
281 int lca=cz[1];
282 for(int j=2;j<=k;j++)
283 lca=LCA(lca,cz[j]);
284 for(int j=1,tmp;j<=k;j++)
285 {
286 tmp=treepre(lca,cz[j],rr+1);
287 if(ans>abs(tmp-rr)) ans=abs(tmp-rr);
288 tmp=treenxt(lca,cz[j],rr-1);
289 if(ans>abs(tmp-rr)) ans=abs(tmp-rr);
290 }
291 printf("%d\n",ans);
292 }
293 }
294 }
T1
T3f
不会,先咕了
NOIP模拟22的更多相关文章
- noip模拟22[d·e·f]
noip模拟22 solutions 哈哈哈,这次暴力打满直接190,其实不到哈哈哈,187.. 这次的题暴力极其好打,但是正解确实不简单... 打了好久才改完这个题,改完的时候爽暴了 这些一个字母的 ...
- [考试总结]noip模拟22
又发现模拟 \(22\) 的总结也咕掉了,现在补上它... 似乎又是gg的一场. 以为自己的部分分数打的很全,然而到后面发现自己的树剖打假了 \(\color{green}{\huge{\text{树 ...
- Noip模拟22 2021.7.21
T1 d 简化题意就是找到相对平均长宽的偏移量较大的矩形给他删掉 可以说是个贪心,按照a,b分别为第一关键字排序 然后假装删去要求的那么多个按a排序的较小的,然后再去b中, 找到 删去的a中的那几个矩 ...
- 2021.7.21考试总结[NOIP模拟22]
终于碾压小熠了乐死了 T1 d 小贪心一波直接出正解,没啥好说的(bushi 好像可以主席树暴力找,但我怎么可能会呢?好像可以堆优化简单找,但我怎么可能想得到呢? 那怎么办?昨天两道单调指针加桶,我直 ...
- NOIP模拟 22
剧情回放:xuefeng:考场上你们只打暴力不打正解,我不满意! skyh:考场怒切T2以表明自己拥护xuefeng的决心 BoboTeacher:这场考试就没想让你们上100 神犇skyh:(笑而不 ...
- NOIP 模拟22
这次考试真的是像教练说的真的挺难的,但是人家rank1还是100+, 但是咕咕蛊!
- NOIP 模拟 $22\; \rm f$
题解 \(by\;zj\varphi\) 对于一个数,如果它二进制下第 \(i\) 位为 \(1\),那么 \(\rm x\) 在这一位选 \(1\) 的贡献就是和它不同的最高为为 \(i\) 的数的 ...
- NOIP 模拟 $22\; \rm e$
题解 对于这个 \(abs\) 就是求大于 \(r\) 的最小值,小于 \(r\) 的最大值,建权值线段树或平衡树. 因为是 \(k\) 个点的联通块,就是求它们的 \(lca\) 到它们的链,可持久 ...
- NOIP 模拟 $22\; \rm d$
题解 很好的贪心题 考虑去掉的矩形一定是几个 \(a\) 最小的,几个 \(b\) 最小的,枚举去掉几个 \(a\),剩下的去掉 \(b\) 先对 \(a\) 排序,用小根堆维护 \(b\) ,记录哪 ...
随机推荐
- outerHTML和outerText的赋值是异步的
用JavaScript操作DOM时,经常有生成复杂HTML结构的需求.此时,通常不是用标准DOM接口(如createElement().setAttribute().append()等)来语句式地生成 ...
- go中导入包的几种方式
标准方式: import ( "fmt" )使用:fmt.Println() 点(.)方式 import ( . "fmt" ) 使用时候,可以胜率fmt前缀P ...
- Vue3.x全家桶+vite+TS-构建Vue3基本框架
目录 一.搭建基础项目 1.vite创建项目 3.运行项目 2.环境变量设置介绍 vite配置多环境打包 二.配置Router 1.安装路由 2.配置路由 3.引入 三.配置Vuex 1.安装vuex ...
- 洛谷P1603——斯诺登的密码(字符串处理)
https://www.luogu.org/problem/show?pid=1603#sub 题目描述 2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机.但是,这件事 ...
- Django学习day10随堂笔记
每日测验 """ 今日考题 1.默写ajax基本语法,及提交json数据和文件都需要添加哪些额外参数 2.什么是序列化,截止目前为止你所接触过的序列化有哪些 3.批量插入 ...
- Shell系列(16)- 环境变量配置文件简介及source命令
变量类型 用户自定义变量(本地变量) 环境变量 预定义变量 位置参数变量 source命令 [root@localhost ~]# source 配置文件 或 [root@localhost ~]# ...
- 深入HTML5第三天
表单form属性:method="get|post" action="url": 特性:不写样式是没有样式的 input:属性:type="text| ...
- Windows系统中的SVN使用方法
Windows 下搭建 SVN(3.9版本)服务器 2018年08月11日 12:22:55 Amarao 阅读数 11984 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议, ...
- [转载]Windows 2008多用户同时远程登陆配置方法
有些朋友需要在在使用Windows 2008远程登录功能时,进行多用户登录,那么就可以采用以下配置方法: 首先要启用远程桌面这一功能:右击"我的电脑"→ 属性 → 远程配置 → 远 ...
- 关于selenium添加使用代理ip
最近在爬某个网站,发现这个网站的反爬太厉害了,正常时候的访问有时候都会给你弹出来验证,验证你是不是蜘蛛,而且requests发的请求携带了请求头信息,cookie信息,代理ip,也能识别是爬虫,他应该 ...