T1 送花

按照题解意思说是扫描线题,但我觉得像一个线段树优化$dp$

主要思想一样,就是暴力枚举右端点,同时维护左端点的最值,

考虑两种情况,

如果左端点在$r$扫到的数$i$上一次出现的位置之前,

那么这个数是无法在区间$[l,r]$中作出贡献的

如果左端点在上次出现的位置之后,则可以作出贡献,

那么对应的操作就是

考虑从左往右扫答案的右端点,线段树维护每个左端点对应的答案

每次会让当前颜色的上上次出现位置到上次出现位置减掉贡献,上次出现位置到当前位置加上贡献

以后看到这种找最值区间的题目应该想到使用线段树维护,

线段树很方便的把一层枚举换成了$log$级别的

 1 #include<bits/stdc++.h>
2 #define pb push_back
3 #define LL long long
4 using namespace std;
5 const int NN=1e6+5;
6 int n,m,c[NN],d[NN],pre[NN][2];
7 LL ans;
8 set<int> s[NN];
9 struct SNOWtree{
10 #define lid (id<<1)
11 #define rid (id<<1|1)
12 int ll[NN<<2],rr[NN<<2];
13 LL maxn[NN<<2],laz[NN<<2];
14 inline void pushup(int id){
15 if(ll[id]==rr[id]) return;
16 maxn[id]=max(maxn[lid],maxn[rid]);
17 }
18 inline void pushdown(int id){
19 if(!laz[id]||ll[id]==rr[id]) return;
20 laz[lid]+=laz[id]; laz[rid]+=laz[id];
21 maxn[lid]+=laz[id]; maxn[rid]+=laz[id];
22 laz[id]=0;
23 }
24 void build(int id,int l,int r){
25 ll[id]=l;rr[id]=r;
26 if(l==r) return; int mid=l+r>>1;
27 build(lid,l,mid); build(rid,mid+1,r);
28 }
29 void update(int id,int l,int r,int val){
30 if(l<=ll[id]&&rr[id]<=r){
31 maxn[id]+=val,laz[id]+=val;
32 return;
33 }pushdown(id); int mid=ll[id]+rr[id]>>1;
34 if(l<=mid) update(lid,l,r,val);
35 if(r>mid) update(rid,l,r,val);
36 pushup(id);
37 }
38 LL query(int id,int l,int r){
39 if(l<=ll[id]&&rr[id]<=r) return maxn[id];
40 pushdown(id); int mid=ll[id]+rr[id]>>1;
41 LL ans=0;
42 if(l<=mid) ans=max(ans,query(lid,l,r));
43 if(r>mid) ans=max(ans,query(rid,l,r));
44 return ans;
45 }
46 }tr;
47 namespace WSN{
48 inline short main(){
49 scanf("%d%d",&n,&m);
50 for(register int i=1;i<=n;++i) scanf("%d",&c[i]);
51 for(register int i=1;i<=m;++i) scanf("%d",&d[i]);
52 tr.build(1,1,n);
53 for(register int i=1;i<=n;++i){
54 if(pre[c[i]][0]) tr.update(1,pre[c[i]][1]+1,pre[c[i]][0],-d[c[i]]);
55 tr.update(1,pre[c[i]][0]+1,i,d[c[i]]);
56 ans=max(ans,tr.query(1,1,n));
57 pre[c[i]][1]=pre[c[i]][0]; pre[c[i]][0]=i;
58 }
59 printf("%lld\n",ans);
60 return 0;
61 }
62 }
63 signed main(){return WSN::main();}

T2 星空

考场上看出关于一个点的斜坐标系上的点与这个点的距离为$0$之后,就考虑起维护凸包

然后就不明所以的去打别的题目了,还因为调试没改回来爆了$35$分

首先此题可以很显然的按照题意建出一个完全图,然后爱跑那个最短路算法跑那个

除了$Floyd$,就能拿$45$分

考虑正解我们把本题给出的距离定义换一下,

每个点的斜坐标系会和主坐标系有两个截距,我们设为$b1=y+x,b2=y-x$

那么吧原始柿子的绝对值拆开产生的$8$种不同情况,然后取最小值

刚好和以$b1,b2$为横,纵坐标系算出的$min(abs(x1-x2),abs(y1-y2))$得出的情况相同

所以换新的坐标来做

将距离为$0$的点按并查集合并,合并后只剩下距离不是$0$的点考虑他们的最小距离

每次分别按照$x,y$排序后,经典指针扫到每一个点后面第一个和他距离不为零的点更新答案

第二问就是在更新过程中记录点对,去重后将两并查集连起来,方案数明显是两个并查集的大小乘积

 1 #include<bits/stdc++.h>
2 #define pii pair<int,int>
3 #define fi first
4 #define se second
5 #define mp make_pair
6 #define pb push_back
7 using namespace std;
8 const int NN=1e5+5;
9 int n,fa[NN],siz[NN],vc[NN<<2][2];
10 vector<pii > ha[NN];
11 map<pii ,int> vis;
12 struct SNOW{int id,x,y;};SNOW s[NN],nw[NN];
13 inline bool cmp1(SNOW a,SNOW b){return a.x==b.x?a.y<b.y:a.x<b.x;}
14 inline bool cmp2(SNOW a,SNOW b){return a.y==b.y?a.x<b.x:a.y<b.y;}
15 inline int getfa(int x){return fa[x]=((fa[x]==x)?x:getfa(fa[x]));}
16 inline void merge(int x,int y){
17 x=getfa(x);y=getfa(y);
18 if(x==y) return;
19 fa[y]=x; siz[x]+=siz[y];
20 }
21 namespace WSN{
22 inline short main(){
23 scanf("%d",&n);
24 for(int i=1;i<=n;i++){
25 scanf("%d%d",&s[i].x,&s[i].y);
26 fa[i]=i,siz[i]=1;
27 }
28 for(int i=1;i<=n;i++){
29 int b1=s[i].y+s[i].x,b2=s[i].y-s[i].x;
30 if(vc[b1+2*NN][0]) merge(vc[b1+2*NN][0],i);
31 if(vc[b2+2*NN][1]) merge(vc[b2+2*NN][1],i);
32 vc[b1+2*NN][0]=vc[b2+2*NN][1]=i;
33 nw[i].x=b1; nw[i].y=b2; nw[i].id=i;
34 }
35 sort(nw+1,nw+n+1,cmp1);
36 int i=1,ans=0x3fffffff;
37 while(i<=n){
38 int j=i;while(getfa(nw[i].id)==getfa(nw[j].id)) ++j;
39 if(j>n){++i;continue;}
40 int res=min(abs(nw[i].x-nw[j].x),abs(nw[i].y-nw[j].y));
41 if(ans>=res){
42 ans=res;
43 int t=min(getfa(nw[i].id),getfa(nw[j].id));
44 int u=max(getfa(nw[i].id),getfa(nw[j].id));
45 ha[ans].pb(mp(t,u));
46 }++i;
47 }sort(nw+1,nw+n+1,cmp2); i=1;
48 while(i<=n){
49 int j=i;while(getfa(nw[i].id)==getfa(nw[j].id)) ++j;
50 if(j>n){++i;continue;}
51 int res=min(abs(nw[i].x-nw[j].x),abs(nw[i].y-nw[j].y));
52 if(ans>=res){
53 ans=res;
54 int t=min(getfa(nw[i].id),getfa(nw[j].id));
55 int u=max(getfa(nw[i].id),getfa(nw[j].id));
56 ha[ans].pb(mp(t,u));
57 }++i;
58 }if(ans==0x3fffffff){puts("-1");return 0;}
59 printf("%d\n",ans);
60 int sz=ha[ans].size(),tmp=0;
61 for(int i=0;i<sz;i++){
62 pii now=ha[ans][i];
63 if(vis[now]) continue;
64 vis[now]=1;
65 tmp+=siz[now.fi]*siz[now.se];
66 }printf("%d\n",tmp);
67 return 0;
68 }
69 }
70 signed main(){return WSN::main();}

T3 零一串

沽沽

Noip模拟40 2021.8.15的更多相关文章

  1. Noip模拟77 2021.10.15

    T1 最大或 $T1$因为没有开$1ll$右移给炸掉了,调了一年不知道为啥,最后实在不懂了 换成$pow$就过掉了,但是考场上这题耽误了太多时间,后面的题也就没办法好好打了.... 以后一定要注意右移 ...

  2. Noip模拟16 2021.7.15

    题目真是越来越变态了 T1 Star Way To Heaven 首先,你要看出这是一个最小生成树的题(妙吧?) 为什么可以呢? 我们发现从两点连线的中点过是最优的,但是上下边界怎么办呢? 我们把上下 ...

  3. Noip模拟76 2021.10.14

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

  4. 20190908 NOIP 模拟40

    考试过程: 刚看完题,发现T1是个类lis 问题,但要求$O(nlogn)$,应该是个数据结构优化dp,T2应该是个数据结构,T3是个字符串?没有匹配,不会是后缀数组吧,这是NOIP模拟啊,可能是个d ...

  5. 2021.8.15考试总结[NOIP模拟40]

    T1 送花 线段树.枚举右端点,线段树记录左端点对应的值. 每次对当前颜色上上次出现的位置到上次出现的位置区间减,上次出现的位置到当前位置区间加. $code:$ 1 #include<bits ...

  6. Noip模拟70 2021.10.6

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

  7. Noip模拟69 2021.10.5

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

  8. Noip模拟63 2021.9.27(考场惊现无限之环)

    T1 电压机制 把题目转化为找那些边只被奇数环包含. 这样的话直接$dfs$生成一棵树,给每个点附上一个深度,根据其他的非树边都是返祖边 可以算出环内边的数量$dep[x]-dep[y]+1$,然后判 ...

  9. Noip模拟61 2021.9.25

    T1 交通 考场上想了一个$NPC$.应该吧,是要求出图里面的所有可行的不重复欧拉路 无数种做法都无法解出,时间也都耗在这个上面的,于是就考的挺惨的 以后要是觉得当前思路不可做,就试着换一换思路,千万 ...

随机推荐

  1. 深度学习——前向传播算法和反向传播算法(BP算法)及其推导

    1 BP算法的推导 图1 一个简单的三层神经网络 图1所示是一个简单的三层(两个隐藏层,一个输出层)神经网络结构,假设我们使用这个神经网络来解决二分类问题,我们给这个网络一个输入样本,通过前向运算得到 ...

  2. npm WARN ajv-keywords@2.1.1 requires a peer of ajv@^5.0.0 but none is installed. You must install peer dependencies yourself.

    解决: npm install -g npm-install-peers npm install -g npm npm i ajv 但是好像没啥用

  3. composer出现问题: Could not open input file: composer.phar

    可以执行下面命令 php -r "readfile('https://getcomposer.org/installer');" | php This will install c ...

  4. mysql允许别人通过ip访问本机mysql数据

    要想允许别人通过ip访问本机mysql数据库,首先要是本机的mysql允许别的ip访问,也就是授权:其次别人的代码里,要写对本机的ip. 一.本机mysql的授权操作 1.cmd 进入控制台 2.输入 ...

  5. NOI.AC#2007-light【根号分治】

    正题 题目链接:http://noi.ac/problem/2007 题目大意 \(n\)个格子排成一排,每个格子有一个\(0/1\)和一个颜色.开始每个格子都是\(0\),\(q\)次操作取反一个颜 ...

  6. Docker-Compose的一些常用命令

    一.Docker-Compose简介 1.Docker-Compose简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排. Docker-Co ...

  7. HTML元素的三种类型及其转换

    HTML元素的三大类型 1.块元素 可以设置宽高大小,默认宽度为100%,并且独占一行. 例如:p ul li h1~h6 div form table 2.内联(行内)元素 无法设置宽高,元素大小随 ...

  8. 【k8s】使用k8s部署一个简单的nginx服务

    名词解释 Namespace 表示命名空间 Deployment 表示pod发布 Service 表示多个pod做为一组的集合对外通过服务的表示 kubectl 是k8s的命令行操作命令,可以创建和更 ...

  9. 11.2.0.4 RAC manual opatch

    1.Stop the CRS managed resources running from DB homes. If this is a GI Home environment, as the dat ...

  10. 设计模式如何提升 vivo 营销自动化业务扩展性 | 引擎篇01

    在<vivo 营销自动化技术解密 |开篇>中,我们从整体上介绍了vivo营销自动化平台的业务架构.核心业务模块功能.系统架构和几大核心技术设计. 本次带来的是系列文章的第2篇,本文详细解析 ...