我只对现实世界绝望过,却未对自己绝望过!

T1 送花

解题思路

线段树维护序列。

我们暴力枚举右端点,用线段树搞出当前右端点的最优的左端点的值。

假设当前扫到的右端点是 r ,颜色是 col。

这种颜色的上一个位置为 las ,上上个位置为 pre。

那么就给 \([pre,las]\) 这个区间减去 \(val_{col}\)。

给 \([las+1,r]\) 这个区间加上 \(val_{col}\)。

更新之后统计答案就好了。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
#define ls x<<1
#define rs x<<1|1
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e6+10;
int n,m,ans,las[N],s[N],val[N];
struct Segment_Tree
{
int dat,laz;
}tre[N<<2];
vector<int> v[N];
void push_down(int x)
{
if(!tre[x].laz) return ;
tre[ls].laz+=tre[x].laz;
tre[rs].laz+=tre[x].laz;
tre[ls].dat+=tre[x].laz;
tre[rs].dat+=tre[x].laz;
tre[x].laz=0;
}
void push_up(int x)
{
tre[x].dat=max(tre[ls].dat,tre[rs].dat);
}
void update(int x,int l,int r,int L,int R,int num)
{
if(L<=l&&r<=R)
{
tre[x].dat+=num;
tre[x].laz+=num;
return ;
}
push_down(x);
int mid=(l+r)>>1;
if(L<=mid) update(ls,l,mid,L,R,num);
if(R>mid) update(rs,mid+1,r,L,R,num);
push_up(x);
}
signed main()
{
n=read(); m=read();
for(int i=1;i<=n;i++)
{
s[i]=read();
v[s[i]].push_back(i);
}
for(int i=1;i<=m;i++)
for(int j=1;j<v[i].size();j++)
las[v[i][j]]=v[i][j-1];
for(int i=1;i<=m;i++)
val[i]=read();
for(int i=1;i<=n;i++)
{
int num=s[i];
if(las[i]) update(1,1,n,max(1ll,las[las[i]]),las[i],-val[num]);
update(1,1,n,las[i]+1,i,val[num]);
ans=max(ans,tre[1].dat);
}
printf("%lld",ans);
return 0;
}

T2 星空

解题思路

考场上就想到了一半的思路,然后后面就不会了。。

可惜我的\(n^2\)算法竟然只和隔壁 fengwu 卡时间的 \(n^3log^3n\) 的算法一样只得了 70pts。

把题面上的柿子拆开就变成了\(|x_1-x_2|=|y_1-y_2|\)

就剩下了两种情况:也就是斜率为 1 或者 -1 的一次函数上的点都可以缩成一个点。

然后发现我们可以通过旋转坐标轴来实现。

设之前的坐标为 \((x,y)\) 那么变换之后的坐标就是 \((x-y,x+y)\)

然后发现其实通过 x 坐标之间, y 坐标之间的加减之后取个 min 就是答案。

可以把更改坐标之后的值分别按 x 和 y 排序。

然后每个点和后面一个点之间的距离就是最小合法距离。

在更新的时候同时记录合法的并查集对。

去重之后把每条边两边的并查集大小乘积加起来就是答案了。

code

70pts

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=5e3+10,M=1e5+10,INF=0x3f3f3f3f3f3f3f3f;
struct Node
{
int x,y;
}s[M];
int n,top,ans,minn=INF,sta[M],fa[M],val[N][N];
bool vis[N];
vector<int> v[M];
unordered_map<int,int> mp1,mp2;
priority_queue<pair<int,int> > q;
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
signed main()
{
n=read();
for(int i=1,x,y;i<=n;i++)
{
fa[i]=i;
x=read(); y=read();
s[i]=(Node){x,y};
}
for(int i=1;i<=n;i++)
{
auto it1=mp1.find(s[i].x-s[i].y);
auto it2=mp2.find(s[i].x+s[i].y);
if(it1==mp1.end()&&it2==mp2.end())
{
mp1.insert(make_pair(s[i].x-s[i].y,i));
mp2.insert(make_pair(s[i].x+s[i].y,i));
continue;
}
if(it1!=mp1.end()&&it2!=mp2.end())
{
fa[find(mp1[s[i].x-s[i].y])]=find(mp2[s[i].x+s[i].y]);
fa[i]=find(mp1[s[i].x-s[i].y]);
continue;
}
if(it1!=mp1.end())
{
fa[i]=find(mp1[s[i].x-s[i].y]);
mp2.insert(make_pair(s[i].x+s[i].y,fa[i]));
continue;
}
fa[i]=find(mp2[s[i].x+s[i].y]);
mp1.insert(make_pair(s[i].x-s[i].y,fa[i]));
}
for(int i=1;i<=n;i++)
{
if(find(i)==i) sta[++top]=i;
v[find(i)].push_back(i);
}
memset(val,0x3f,sizeof(val));
for(int i=1;i<=top;i++)
for(int j=0;j<v[sta[i]].size();j++)
for(int k=1;k<=n;k++)
if(find(k)!=sta[i])
val[sta[i]][find(k)]=min(val[sta[i]][find(k)],abs(abs(s[v[sta[i]][j]].x-s[k].x)-abs(s[v[sta[i]][j]].y-s[k].y)));
for(int i=1;i<=top;i++)
{
for(int j=i+1;j<=top;j++)
if(val[sta[i]][sta[j]]&&val[sta[i]][sta[j]]<minn)
{
minn=val[sta[i]][sta[j]];
ans=v[sta[i]].size()*v[sta[j]].size();
}
else if(val[sta[i]][sta[j]]==minn)
ans+=v[sta[i]].size()*v[sta[j]].size();
}
if(minn>=INF) printf("-1");
else printf("%lld\n%lld",minn,ans);
return 0;
}

正解

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=5e3+10,M=1e5+10,INF=0x3f3f3f3f3f3f3f3f;
struct Node
{
int x,y,id;
}s[M];
int n,ans,minn=INF,fa[M],siz[M];
vector<pair<int,int> > vec;
unordered_map<int,int> mp1,mp2;
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
bool comp1(Node a,Node b)
{
return a.x<b.x;
}
bool comp2(Node a,Node b)
{
return a.y<b.y;
}
signed main()
{
n=read();
for(int i=1,x,y;i<=n;i++)
{
fa[i]=i;
x=read(); y=read();
s[i]=(Node){x,y,i};
}
for(int i=1;i<=n;i++)
{
auto it1=mp1.find(s[i].x-s[i].y);
auto it2=mp2.find(s[i].x+s[i].y);
if(it1==mp1.end()&&it2==mp2.end())
{
mp1.insert(make_pair(s[i].x-s[i].y,i));
mp2.insert(make_pair(s[i].x+s[i].y,i));
continue;
}
if(it1!=mp1.end()&&it2!=mp2.end())
{
fa[find(mp1[s[i].x-s[i].y])]=find(mp2[s[i].x+s[i].y]);
fa[i]=find(mp1[s[i].x-s[i].y]);
continue;
}
if(it1!=mp1.end())
{
fa[i]=find(mp1[s[i].x-s[i].y]);
mp2.insert(make_pair(s[i].x+s[i].y,fa[i]));
continue;
}
fa[i]=find(mp2[s[i].x+s[i].y]);
mp1.insert(make_pair(s[i].x-s[i].y,fa[i]));
}
for(int i=1;i<=n;i++)
{
siz[find(i)]++;
s[i]=(Node){s[i].x-s[i].y,s[i].x+s[i].y,i};
}
sort(s+1,s+n+1,comp1);
for(int i=1;i<=n;i++)
{
int j=i+1;
int temp=min(abs(s[i].x-s[j].x),abs(s[i].y-s[j].y));
if(temp) minn=min(minn,temp);
}
sort(s+1,s+n+1,comp2);
for(int i=1;i<=n;i++)
{
int j=i+1;
int temp=min(abs(s[i].x-s[j].x),abs(s[i].y-s[j].y));
if(temp) minn=min(minn,temp);
}
sort(s+1,s+n+1,comp1);
for(int i=1;i<=n;i++)
{
int j=i+1;
int temp=min(abs(s[i].x-s[j].x),abs(s[i].y-s[j].y));
int x=find(s[i].id),y=find(s[j].id);
if(x>y) swap(x,y);
if(temp==minn) vec.push_back(make_pair(x,y));
}
sort(s+1,s+n+1,comp2);
for(int i=1;i<=n;i++)
{
int j=i+1;
int temp=min(abs(s[i].x-s[j].x),abs(s[i].y-s[j].y));
int x=find(s[i].id),y=find(s[j].id);
if(x>y) swap(x,y);
if(temp==minn) vec.push_back(make_pair(x,y));
}
sort(vec.begin(),vec.end());
vec.erase(unique(vec.begin(),vec.end()),vec.end());
for(int i=0;i<vec.size();i++)
ans+=siz[vec[i].first]*siz[vec[i].second];
if(minn>=INF) printf("-1");
else printf("%lld\n%lld",minn,ans);
return 0;
}

T3 零一串

大坑未补

8.15考试总结(NOIP模拟40)[送花·星空·零一串]的更多相关文章

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

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

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

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

  3. 7.15考试总结(NOIP模拟16)[Star Way To Heaven·God Knows·Lost My Music]

    败者死于绝望,胜者死于渴望. 前言 一看这个题就来者不善,对于第一题第一眼以为是一个大模拟,没想到是最小生成树. 对于第二题,先是看到了状压可以搞到的 20pts 然后对着暴力一顿猛调后来发现是题面理 ...

  4. [考试总结]noip模拟40

    最近真的是爆炸啊... 到现在还是有不少没改出来.... 所以先写一下 \(T1\) 的题解.... 送花 我们移动右端点,之后我们用线段树维护全局最大值. 之后还要记录上次的位置和上上次的位置. 之 ...

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

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

  6. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  7. 5.23考试总结(NOIP模拟2)

    5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...

  8. 5.22考试总结(NOIP模拟1)

    5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...

  9. Noip模拟40 2021.8.15

    T1 送花 按照题解意思说是扫描线题,但我觉得像一个线段树优化$dp$ 主要思想一样,就是暴力枚举右端点,同时维护左端点的最值, 考虑两种情况, 如果左端点在$r$扫到的数$i$上一次出现的位置之前, ...

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

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

随机推荐

  1. 重新点亮linux 命令树————压缩和解压缩[四]

    前言 简单整理一下压缩和解压缩. 正文 在windows 中我们使用压缩和解压缩一般是7z这个压缩和解压软件,但是在linux中压缩和解压是两个不同的软件. 在最早的linux 备份介质是磁带,使用的 ...

  2. leetcode每日一题:836. 矩形重叠

    836. 矩形重叠 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的 ...

  3. Jenkins集成GitLab的正确姿势,实现Git代码提交触发CI/CD

    ❝ jenkins和gitlab是目前DevOps工具链中最常见的,抛开gitlab-ci不谈,gitlab代码提交触发jenkins流水线是最经典的搭配. 这里就介绍下如何配置实现jenkins和g ...

  4. 第九課-Channel Study For Caller Client Api

    1.浏览Mirth Connect开放Client API 2.启动Vs2019,编程测试Client Api的调用 开启你在宇宙第一IDE下熟悉的.net之旅吧!

  5. 力扣299(java)-猜数字游戏(中等)

    题目: 你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下: 写出一个秘密数字,并请朋友猜这个数字是多少.朋友每猜测一次,你就会给他一个包含下述信息的提示: 猜测数字中有多少 ...

  6. Koordinator v0.7: 为任务调度领域注入新活力

    简介: 在这个版本中着重建设了机器学习.大数据场景需要的任务调度能力,例如 Coscheduling.ElasticQuota 和精细化的 GPU 共享调度能力.并在调度问题诊断分析方面得到了增强,重 ...

  7. 疫情带火了这款APP:2600个学生一天点赞70万次

      这几天,全国中小学生经历了"过山车"一样的心情. 因为疫情的不断蔓延,1月27日,教育部下发通知,2020年春季学期延期开学. 随后,教育部又提出"利用网络平台,停课 ...

  8. Serverless 极致弹性解构在线游戏行业痛点

    简介: 本文将通过剖析一个个具体的场景案例,以期望给相关的游戏开发同学带来共鸣,同时也希望能给非游戏行业的同学带来一些启发. 一.前言 1. 游戏客户上云关注点 游戏行业是一个富有创意又竞争激烈的市场 ...

  9. 基于Serverless的云原生转型实践

    简介: 新一代的技术架构是什么?如何变革?是很多互联网企业面临的问题.而云原生架构则是这个问题最好的答案,因为云原生架构对云计算服务方式与互联网架构进行整体性升级,深刻改变着整个商业世界的 IT 根基 ...

  10. WebAssembly + Dapr = 下一代云原生运行时?

    简介: 云计算已经成为了支撑数字经济发展的关键基础设施.云计算基础设施也在持续进化,从 IaaS,到容器即服务(CaaS),再到 Serverless 容器和函数 PaaS (fPaaS 或者 Faa ...