T1 送花


线段树。枚举右端点,线段树记录左端点对应的值。

每次对当前颜色上上次出现的位置到上次出现的位置区间减,上次出现的位置到当前位置区间加。

$code:$

 1 #include<bits/stdc++.h>
2 #define LL long long
3 using namespace std;
4 const int NN=1e6+5;
5 int n,m,c[NN],d[NN],pre[NN][2];
6 LL ans;
7 inline int read(){
8 int x=0,f=1; char ch=getchar();
9 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
10 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
11 return x*f;
12 }
13 inline void write(LL x,char sp){
14 char ch[20]; int len=0;
15 if(x<0){ putchar('-'); x=~x+1; }
16 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
17 for(int i=len-1;~i;i--) putchar(ch[i]); putchar(sp);
18 }
19 struct segment_tree{
20 #define ld rt<<1
21 #define rd (rt<<1)|1
22 LL mx[NN<<2],laz[NN<<2];
23 void pushup(int rt){
24 mx[rt]=max(mx[ld],mx[rd]);
25 }
26 void pushdown(int rt){
27 if(!laz[rt]) return;
28 laz[ld]+=laz[rt]; laz[rd]+=laz[rt];
29 mx[ld]+=laz[rt]; mx[rd]+=laz[rt];
30 laz[rt]=0;
31 }
32 void modify(int rt,int l,int r,int opl,int opr,int val){
33 if(l>=opl&&r<=opr){
34 mx[rt]+=val;
35 laz[rt]+=val;
36 return;
37 }
38 pushdown(rt);
39 int mid=(l+r)>>1;
40 if(opl<=mid) modify(ld,l,mid,opl,opr,val);
41 if(opr>mid) modify(rd,mid+1,r,opl,opr,val);
42 pushup(rt);
43 }
44 LL query(int rt,int l,int r,int opl,int opr){
45 if(l>=opl&&r<=opr) return mx[rt];
46 pushdown(rt);
47 int mid=(l+r)>>1;
48 LL ans=0;
49 if(opl<=mid) ans=max(ans,query(ld,l,mid,opl,opr));
50 if(opr>mid) ans=max(ans,query(rd,mid+1,r,opl,opr));
51 return ans;
52 }
53 }s;
54 signed main(){
55 n=read(); m=read();
56 for(int i=1;i<=n;i++) c[i]=read();
57 for(int i=1;i<=m;i++) d[i]=read();
58 for(int i=1;i<=n;i++){
59 if(pre[c[i]][0]) s.modify(1,1,n,pre[c[i]][1]+1,pre[c[i]][0],-d[c[i]]);
60 s.modify(1,1,n,pre[c[i]][0]+1,i,d[c[i]]);
61 ans=max(ans,s.query(1,1,n,1,n));
62 pre[c[i]][1]=pre[c[i]][0]; pre[c[i]][0]=i;
63 }
64 write(ans,'\n');
65 return 0;
66 }

T1

T2 星空


并查集合并距离为零的点,$O(n^2)$有$70pts$。

考虑优化。发现令$b=x+y$,$B=x-y$,那么两个点的直接距离其实为$min(|b_i-b_j|,|B_i-B_j|)$。

于是可以排序后扫一遍得出答案。点对数只要去重后将两个符合条件的并查集大小相乘后累加。

注意排序后点集的下标改变,所有并查集操作都要通过$id$来实现。

$code:$

 1 #include<bits/stdc++.h>
2 #define mp make_pair
3 using namespace std;
4 const int NN=1e5+5;
5 int n,x[NN],y[NN],fa[NN],siz[NN],ans=INT_MAX,num;
6 map<pair<int,int>,bool>vis;
7 vector<pair<int,int> >vec;
8 struct loc{ int x,y,b1,b2,id; }l[NN];
9 inline bool cmp1(loc a,loc b){ return a.b1<b.b1; }
10 inline bool cmp2(loc a,loc b){ return a.b2<b.b2; }
11 inline int getfa(int x){ return fa[x]==x?x:fa[x]=getfa(fa[x]); }
12 inline int read(){
13 int x=0,f=1; char ch=getchar();
14 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
15 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
16 return x*f;
17 }
18 inline void write(int x,char sp){
19 char ch[20]; int len=0;
20 if(x<0){ putchar('-'); x=~x+1; }
21 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
22 for(int i=len-1;~i;i--) putchar(ch[i]); putchar(sp);
23 }
24 void merge(int x,int y){
25 x=getfa(x); y=getfa(y);
26 if(x==y) return;
27 fa[y]=x; siz[x]+=siz[y];
28 }
29 signed main(){
30 n=read();
31 for(int i=1;i<=n;i++){
32 l[i].x=read(); l[i].y=read();
33 fa[i]=i; siz[i]=1; l[i].id=i;
34 l[i].b1=l[i].y-l[i].x;
35 l[i].b2=l[i].y+l[i].x;
36 }
37 sort(l+1,l+n+1,cmp1);
38 for(int i=1;i<n;i++)
39 if(l[i].b1==l[i+1].b1) merge(l[i].id,l[i+1].id);
40 sort(l+1,l+n+1,cmp2);
41 for(int i=1;i<n;i++)
42 if(l[i].b2==l[i+1].b2) merge(l[i].id,l[i+1].id);
43 sort(l+1,l+n+1,cmp1);
44 for(int i=1;i<n;i++){
45 if(getfa(l[i].id)==getfa(l[i+1].id)) continue;
46 if(l[i+1].b1==l[i].b1) continue;
47 if(ans>=l[i+1].b1-l[i].b1){
48 if(ans>l[i+1].b1-l[i].b1) vec.clear();
49 vec.push_back(mp(getfa(l[i].id),getfa(l[i+1].id)));
50 ans=l[i+1].b1-l[i].b1;
51 }
52 }
53 sort(l+1,l+n+1,cmp2);
54 for(int i=1;i<n;i++){
55 if(getfa(l[i].id)==getfa(l[i+1].id)) continue;
56 if(l[i+1].b2==l[i].b2) continue;
57 if(ans>=l[i+1].b2-l[i].b2){
58 if(ans>l[i+1].b2-l[i].b2) vec.clear();
59 vec.push_back(mp(getfa(l[i].id),getfa(l[i+1].id)));
60 ans=l[i+1].b2-l[i].b2;
61 }
62 }
63 if(vec.empty()){ puts("0"); return 0;}
64 for(int i=0;i<vec.size();i++){
65 if(vis[vec[i]]) continue;
66 vis[vec[i]]=1;
67 vis[mp(vec[i].second,vec[i].first)]=1;
68 num+=siz[vec[i].first]*siz[vec[i].second];
69 }
70 write(ans,'\n'); write(num,'\n');
71 return 0;
72 }

T2

T3 零一串


因为不可抗力詁了(连咕两场的怠惰罪该万死

2021.8.15考试总结[NOIP模拟40]的更多相关文章

  1. 2021.7.15考试总结[NOIP模拟16]

    ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...

  2. 2021.10.15考试总结[NOIP模拟77]

    \(n=40\)考虑\(meet \;in \;the \;middle\) 某个元素有关的量只有一个时考虑转化为树上问题 对暴力有自信,相信数据有梯度 没了 UPD:写了个略说人话的. T1 最大或 ...

  3. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  4. 2021.9.13考试总结[NOIP模拟52]

    T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...

  5. 2021.8.11考试总结[NOIP模拟36]

    T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...

  6. 2021.7.29考试总结[NOIP模拟27]

    T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...

  7. 2021.9.14考试总结[NOIP模拟53]

    T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...

  8. 2021.9.12考试总结[NOIP模拟51]

    T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...

  9. 2021.9.9考试总结[NOIP模拟50]

    T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...

随机推荐

  1. 深入理解Linux文件系统与日志文件

    目录: 一.inode与block 二.inode内容 三.inode的号码 四.inode的大小 五.链接文件 六.inode节点耗尽故障处理 七.恢复EXT类型的文件编译安装extundelete ...

  2. RocketMQ详解(二)安装使用详解

    专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...

  3. SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9F\x90\xA3\xF0\x9F...' for column

    在做微信公众号保存用户数据时出现这种错误,一直不知道是哪里的原因,后来发现那个用户昵称带着一只兔子表情,由于数据库编码限制不能保存数据,所有需要先编码, 用PHP的函数就是base64_encode, ...

  4. GCN数据集Cora、Citeseer、Pubmed文件分析

    简介 本文将对Cora.Citeseer.Pubmed 数据集进行详细介绍 Cora.Citeseer.Pubmed 数据集 来源 图 节点 边 特征 标签(y) Cora "Collect ...

  5. java基础之AQS

    Java开发中,我们的应用程序经常会使用多线程提高程序的运行效率,多线程情况下访问线程共享变量可能会带来并发问题,此时就需要并发锁解决并发问题.Java提供了两种类型的并发控制机制:synchonri ...

  6. springboot 运行出现错误 Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

    原因是我将springboot启动类换到了另外一个方法中 出现了一个异常 后来发现因为我换了类但是忘记了换类名所以才报错 @ComponentScan @EnableAutoConfiguration ...

  7. 『GoLang』函数

    函数介绍 Go语言函数基本组成包括: 关键字func 函数名 参数列表 返回值 函数体 返回语句 语法如下: func 函数名(参数列表) (返回值列表) { // 函数体 return } 除了ma ...

  8. 软件测试工程师简历要怎么写,才能让HR看到

    作为软件测试的从业者,面试或者被面试都是常有的事. 可是不管怎样,和简历有着理不清的关系,面试官要通过简历了解面试者的基本信息.过往经历等. 面试者希望通过简历把自己最好的一面体现给面试官,所以在这场 ...

  9. 地心地固坐标系(ECEF)与站心坐标系(ENU)的转换

    目录 1. 概述 2. 原理 2.1. 平移 2.2. 旋转 2.3. 总结 3. 实现 4. 参考 1. 概述 我在<大地经纬度坐标与地心地固坐标的的转换>这篇文章中已经论述了地心坐标系 ...

  10. 重修 Tarjan

    Tarjan是谁 Tarjan's SCCs(有向图强连通分量)algorithm 给定⼀个有向图 \(G\),若存在 \(rt\in V\),满⾜从 \(rt\) 出发能到达 \(V\) 中的所有的 ...