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

不会,先咕了

最新文章

  1. JavaScript 中对内存的一些了解
  2. 使用PopupContainerEdit和PopupContainerControl制作下拉菜单树小记
  3. Cookie对象
  4. centos 下 安装zookpeer
  5. eclipse使用
  6. 用腻了bootstrap的可以试试semantic-ui
  7. 统一建模语言(UML) 版本 2.0
  8. js实现键盘操作对div的移动或改变-------Day43
  9. IOS开发中绘制地图线路
  10. 【1】ShopNC 模仿笔记(一)
  11. Delphi 内存分配 StrAlloc New(转)
  12. 新概念英语(1-93)Our new neighbour
  13. mysql 关于表与字段的增删改查操作
  14. AE的空间分析(转载)
  15. React从入门到放弃之前奏(1):webpack4简介
  16. [Android] Android 卡片式控件CardView的优雅使用
  17. 第四章:Android架构
  18. WCF错误远程服务器返回了意外响应: (413) Request Entity Too Large。解决方案
  19. 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】
  20. 【转】OAuth2.0的refresh token

热门文章

  1. web、html概念快速入门
  2. wrap()包裹被选元素的内容
  3. Azure 实践(4)- CI/CD .netcore项目Docker构建及部署
  4. 论文解读(SimCLR)《A Simple Framework for Contrastive Learning of Visual Representations》
  5. Git(1) - Git、Github和Gitlab简介
  6. dubbo微服务架构
  7. TP框架中的一些登录代码分享
  8. VMware虚拟机常见问题(针对目前我所学的而言,还会不断更新)
  9. P7600-[APIO2021]封闭道路【堆,dp】
  10. HPE ProLiant 系列服务器Microsoft Windows 2008 R2系统下网卡绑定方法