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

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

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

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

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

  3. Noip模拟22 2021.7.21

    T1 d 简化题意就是找到相对平均长宽的偏移量较大的矩形给他删掉 可以说是个贪心,按照a,b分别为第一关键字排序 然后假装删去要求的那么多个按a排序的较小的,然后再去b中, 找到 删去的a中的那几个矩 ...

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

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

  5. NOIP模拟 22

    剧情回放:xuefeng:考场上你们只打暴力不打正解,我不满意! skyh:考场怒切T2以表明自己拥护xuefeng的决心 BoboTeacher:这场考试就没想让你们上100 神犇skyh:(笑而不 ...

  6. NOIP 模拟22

    这次考试真的是像教练说的真的挺难的,但是人家rank1还是100+, 但是咕咕蛊!

  7. NOIP 模拟 $22\; \rm f$

    题解 \(by\;zj\varphi\) 对于一个数,如果它二进制下第 \(i\) 位为 \(1\),那么 \(\rm x\) 在这一位选 \(1\) 的贡献就是和它不同的最高为为 \(i\) 的数的 ...

  8. NOIP 模拟 $22\; \rm e$

    题解 对于这个 \(abs\) 就是求大于 \(r\) 的最小值,小于 \(r\) 的最大值,建权值线段树或平衡树. 因为是 \(k\) 个点的联通块,就是求它们的 \(lca\) 到它们的链,可持久 ...

  9. NOIP 模拟 $22\; \rm d$

    题解 很好的贪心题 考虑去掉的矩形一定是几个 \(a\) 最小的,几个 \(b\) 最小的,枚举去掉几个 \(a\),剩下的去掉 \(b\) 先对 \(a\) 排序,用小根堆维护 \(b\) ,记录哪 ...

随机推荐

  1. JS边角料: NodeJS+AutoJS+WebSocket+TamperMonkey实现局域网多端文字互传

    ---阅读时间约 7 分钟,复现时间约 15 分钟--- 由于之前一直在用的扩展 QPush 停止服务了,苦于一人凑齐了 Window, Android, Mac, ios 四种系统的设备,Apple ...

  2. [第四篇]——Windows Docker 安装之Spring Cloud直播商城 b2b2c电子商务技术总结

    Windows Docker 安装 Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境. Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境, ...

  3. Java实现发送邮件,图片,附件

    参照地址 1.JavaMail 介绍 JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面 ...

  4. git合并内容的1个方式

    诉求 把自己的改动的文件合并到目标分支: 不想改那些不属于自己开发时出现的冲突: 操作 开发分支dev,要合并至master分支 1 所有改动都已提交,保持分支的干净状态(working tree c ...

  5. css 限制字数

    text-overflow: ellipsis; overflow: hidden; 不过需设置宽高

  6. Orchard Core 简介

    Orchard Core 是基于ASP.NET Core 对Orchard CMS的 二次开发. Orchard Core由两部分组成: Orchard Core Framework: 一个基于ASP ...

  7. 环形链表II

    题目描述: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 p ...

  8. Java基础系列(41)- 冒泡排序

    冒泡排序 冒泡排序无疑是最为出名的排序算法之一,总共有八大排序 冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人尽皆知 我们看到的嵌套循环,应该立马就可以得出这个算法的时间复 ...

  9. redis 与java的连接 和集群环境下Session管理

    redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html)  第一步: a) 搭建环境 引入 jedis jar包 co ...

  10. django把变量变成字段进行搜索

    from ceshi.models import Student     #引入model中的模型 获取前端请求的参数 searchKey=request.GET.get("key" ...