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. Jsoup快速查询

    一.selector选择器 二.Xpath查询

  2. Mybatis-基本学习(上)

    目录 Mybatis mybatis开始 -----环境准备 一.简介 1.什么是MyBatis 2.持久化 3.持久层 4.为什么需要Mybatis? 二.第一个Mybatis程序 1.搭建环境 1 ...

  3. HCNP Routing&Switching之路由控制、路由策略和IP-Prefix List

    前文我们了解了IS-IS路由聚合和认证相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15306645.html:今天我们来聊一聊路由控制技术中的路由策 ...

  4. .NET 中的HTTP 3支持

    dotnet团队官方博客发布了一篇HTTP3的文章:HTTP/3 support in .NET 6.文章介绍了.NET 6 将预览支持HTTP3,.NET 7正式支持HTTP3,原因主要是HTTP/ ...

  5. 【OWASP TOP10】2021年常见web安全漏洞TOP10排行

    [2021]常见web安全漏洞TOP10排行 应用程序安全风险 攻击者可以通过应用程序中许多的不同的路径方式去危害企业业务.每种路径方法都代表了一种风险,这些风险都值得关注. 什么是 OWASP TO ...

  6. EcShop调用显示指定分类下的子分类方法

    ECSHOP首页默认的只有全部分类,还有循环大类以及下面小类的代码,貌似没有可以调用显示指定大类下的子分类代码.于是就有这个文章的产生了,下面由夏日博客来总结下网站建设过程中ECSHOP此类问题的网络 ...

  7. 使用uView UI+UniApp开发微信小程序--微信授权绑定和一键登录系统

    在前面随笔<使用uView UI+UniApp开发微信小程序>和<使用uView UI+UniApp开发微信小程序--判断用户是否登录并跳转>介绍了微信小程序的常规登录处理和验 ...

  8. P5056-[模板]插头dp

    正题 题目链接:https://www.luogu.com.cn/problem/P5056 题目大意 \(n*m\)的网格,求有多少条回路可以铺满整个棋盘. 解题思路 插头\(dp\)的,写法是按照 ...

  9. YbtOJ#526-折纸游戏【二分,hash】

    正题 题目链接:https://www.ybtoj.com.cn/problem/526 题目大意 一个\(n\times m\)的网格上有字母,你每次可以沿平行坐标轴对折网格,要求对折的对应位置字母 ...

  10. Pycharm软件学生和老师可申请免费专业版激活码

    有一种邮箱,叫做教育邮箱,这东西在这个互联网的世界有很大的优惠及特权,在 Jetbrain 这里, 如果你有教育邮箱(没有教育邮箱怎么办?.edu.cn后缀的邮箱)但很多学生.甚至老师都未必有. 你只 ...