NOIP模拟92(多校25)
前言
所以说这次是 HZOI 多校联测巅峰????(题目,数据过水??)

T1 石子合并
解题思路
签到题。
发现我们可以给每个数字附一个正负号,每个数字的贡献就是它本身乘上这个符号。
发现至少应该有一个正号一个负号,直接记录是否正负数都有,再判断一下有 0 或者只有一个数的情况。
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<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=2e6+10,INF=1e18;
int T,minn,n,ans,s[N];
void solve()
{
n=read(); minn=INF; ans=0; bool jud1=false,jud2=false,jud3=false;
for(int i=1;i<=n;i++) s[i]=read(),jud1|=s[i]<0,jud2|=s[i]>0,jud3|=s[i]==0;
if(n==1) return printf("%lld\n",s[1]),void();
if((jud1&&jud2)||jud3){for(int i=1;i<=n;i++)ans+=abs(s[i]);return printf("%lld\n",ans),void();}
for(int i=1;i<=n;i++) ans+=abs(s[i]),minn=min(minn,abs(s[i]));
printf("%lld\n",ans-2*minn);
}
#undef int
int main()
{
#define int long long
freopen("stone.in","r",stdin); freopen("stone.out","w",stdout);
T=read(); while(T--) solve();
return 0;
}
T2 铺地毯
解题思路
签到题。
假设一个矩形的左下角是 \((x,y)\) , 右下角是 \((x_2,y_2)\) 。
那么若干个矩形的公共部分的左下角的横纵坐标就是所有矩形的 \(x\) 或者 \(y\) 的最大值,右上角坐标则是最小值。
那么我们很容易算出 \(n\) 个矩形的公共部分,然后考虑删掉一个矩形。
这个的话可以记录一个最大值次大值来很快的实现。
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<endl
#define fi first
#define se second
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=3e5+10,INF=1e18;
int T,n,ans,all;
struct Node{int x,y,x2,y2;}rec,s[N];
pair<int,int> x,y,x2,y2;
inline void upd1(pair<int,int> &temp,int val)
{
if(val<temp.fi) temp.se=temp.fi,temp.fi=val;
else temp.se=min(temp.se,val);
}
inline void upd2(pair<int,int> &temp,int val)
{
if(val>temp.fi) temp.se=temp.fi,temp.fi=val;
else temp.se=max(temp.se,val);
}
inline int work(pair<int,int> &temp,int val)
{
if(temp.fi==val) return temp.se;
return temp.fi;
}
inline int get(Node temp)
{
int tx=work(x,temp.x),ty=work(y,temp.y),tx2=work(x2,temp.x2),ty2=work(y2,temp.y2);
if(tx>=tx2||ty>=ty2) return 0;
return (tx2-tx)*(ty2-ty);
}
void solve()
{
read(); read(); n=read(); ans=0; x.fi=x.se=-INF; y.fi=y.se=-INF; x2.fi=x2.se=INF; y2.fi=y2.se=INF;
for(int i=1;i<=n;i++) s[i].x=read(),s[i].y=read(),s[i].x2=read(),s[i].y2=read();
for(int i=1;i<=n;i++) upd1(x2,s[i].x2),upd1(y2,s[i].y2),upd2(x,s[i].x),upd2(y,s[i].y);
ans=all=get((Node){INF,INF,-INF,-INF});
if(n!=1) for(int i=1;i<=n;i++) ans+=get(s[i])-all;
printf("%lld\n",ans);
}
#undef int
int main()
{
#define int long long
freopen("carpet.in","r",stdin); freopen("carpet.out","w",stdout);
T=read(); while(T--) solve();
return 0;
}
T3 优美的旋律
解题思路
签到题。
直接暴力枚举重复的串,然后往后翻,Hash 优化,复杂度严格小于 \(n^2ln\)
如果记忆一下的话可能就是 \(n^2\) 了。
对于 \(3000\times 3000\) 同一种字符的极限数据的话最多也就是向后翻大约 \(3\times 10^7\) 次。
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<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=3e3+10;
const ull base=13331;
int n,a,b,ans;
ull has[N],p[N];
char s[N];
bool vis[N][N];
inline ull get(int l,int r){return has[r]-has[l-1]*p[r-l+1];}
#undef int
int main()
{
#define int long long
freopen("melody.in","r",stdin); freopen("melody.out","w",stdout);
a=read(); b=read(); scanf("%s",s+1); n=strlen(s+1); p[0]=1;
for(int i=1;i<=n;i++) has[i]=has[i-1]*base+s[i],p[i]=p[i-1]*base;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
int len=j-i+1,num=1; ull temp=get(i,j);
while(i+(num+1)*len-1<=n&&get(i+num*len,i+(num+1)*len-1)==temp) num++;
if(num!=1) ans=max(ans,a*len+b*num);
}
printf("%lld",ans);
return 0;
}
T4 基站建设
解题思路
签到题。
\(n^4\) 的就不说了,我们发现可以枚举一条边,然后分别枚举两个点向外面的连边找公共部分,复杂度就是 \(m^3\)
然后我们可以扫一个点的连边然后查询另一个点的连边是否有这个点 \(m^2log \sim m^2\)
我们可以枚举度数较小的点,这样的复杂度是 \(m\sqrt{m}\) 的。
显然复杂度最劣的情况是两个点的度数相同,假设有 \(x\) 的点。 那么复杂度就是 \(\dfrac{m^2}{x}\)
\(x\) 的最小值只能是 \(\sqrt{m}\) 级别的,那么得证复杂度是 \(m\sqrt{m}\) 。
可以通过 bitset 来实现,然而我考场上是根据标号拍完序之后暴扫的,复杂度就不能保证了(逃
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<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=5e4+10,M=2e5+10,INF=1e18;
int n,m,ans,s[N];
pair<int,int> p[M];
vector<int> v[N];
#undef int
int main()
{
#define int long long
freopen("station.in","r",stdin); freopen("station.out","w",stdout);
n=read(); m=read();
for(int i=1;i<=n;i++) s[i]=read();
for(int i=1,x,y;i<=m;i++)
x=read(),y=read(),p[i]=make_pair(x,y),
v[x].push_back(y),v[y].push_back(x);
for(int i=1;i<=n;i++) sort(v[i].begin(),v[i].end());
for(int i=1;i<=m;i++)
{
int x=p[i].first,y=p[i].second,mx=-INF,sec=-INF;
if(v[x].size()<v[y].size())
{
int pos=0,lim=v[y].size()-1;
for(auto it:v[x])
{
while(pos<lim&&v[y][pos]<it) pos++;
if(it==y||v[y][pos]!=it) continue;
if(s[it]>mx) sec=mx,mx=s[it];
else sec=max(sec,s[it]);
}
}
else
{
int pos=0,lim=v[x].size()-1;
for(auto it:v[y])
{
while(pos<lim&&v[x][pos]<it) pos++;
if(it==x||v[x][pos]!=it) continue;
if(s[it]>mx) sec=mx,mx=s[it];
else sec=max(sec,s[it]);
}
}
if(sec!=-INF&&mx!=-INF) ans=max(ans,(s[x]+1)*(s[y]+1)+mx*sec);
}
printf("%lld",ans);
return 0;
}
NOIP模拟92(多校25)的更多相关文章
- NOIP模拟92&93(多校26&27)
前言 由于太菜了,多校26 只改出来了 T1 ,于是直接并在一起写啦~~~. T0 NOIP 2018 解题思路 第一次考场上面写三分,然而我并不知道三分无法处理不是严格单峰的情况,但凡有一个平台都不 ...
- NOIP模拟83(多校16)
前言 CSP之后第一次模拟赛,感觉考的一般. 不得不吐槽多校联测 OJ 上的评测机是真的慢... T1 树上的数 解题思路 感觉自己思维有些固化了,一看题目就感觉是线段树. 考完之后才想起来这玩意直接 ...
- Noip模拟61 2021.9.25
T1 交通 考场上想了一个$NPC$.应该吧,是要求出图里面的所有可行的不重复欧拉路 无数种做法都无法解出,时间也都耗在这个上面的,于是就考的挺惨的 以后要是觉得当前思路不可做,就试着换一换思路,千万 ...
- Noip模拟47 2021.8.25
期望得分:55+24+53 实际得分:0+0+3 乐死 累加变量清零了吗? 打出更高的部分分暴力删了吗? 样例解释换行你看见了吗? T1 Prime 打出55分做法没删原来的暴力,结果就轻松挂55分 ...
- NOIP模拟99(多校31)
T1 法阵 解题思路 原题3100,张口放 T1(出题人原话) 思维题,合法的情况其实就是上下两个梯形拼起来的样子. 他们的边界都是在 \(i\) 轴上面,但是不能相交. 于是我们可以尝试两者相交的纵 ...
- NOIP模拟84(多校17)
T1 宝藏 解题思路 考场上一眼出 \(nlog^2\) 做法,然后没看见是 1s 3e5 的数据,我竟然以为自己切了?? 考完之后尝试着把二分改为指针的移动,然后就过了??或许是数据水吧,感觉自己的 ...
- NOIP模拟85(多校18)
前言 好像每个题目背景所描述的人都是某部番里的角色,热切好像都挺惨的(情感上的惨). 然后我只知道 T1 的莓,确实挺惨... T1 莓良心 解题思路 首先答案只与 \(w\) 的和有关系,于是问题就 ...
- NOIP模拟86(多校19)
T1 特殊字符串 解题思路 \(f_{i,j}\) 表示前 \(i\) 个字符中结尾为 \(j\) 的最大贡献. 转移枚举当前位置于之前位置结尾的组合加上贡献即可. 对于边界问题,容易发现选择 1 一 ...
- NOIP模拟88(多校21)
前言 对于这套题的总体感觉就是难,然后就是自己很菜... 对于 T1 考试时只会一个最垃圾的背包,考完之后对于思路这一块也不是很顺利,大概这就是薄弱的地方吧. 然后 T2 是比较简单的一道题了,但是考 ...
随机推荐
- Java基础系列(9)- 数据类型扩展及常见面试题
整数拓展 // 整数拓展: 进制 二进制0b 十进制 八进制0 十六进制0x // 同一个数字在不同进制中,结果是不同的,进制换算 int i = 10; int i2 = 010; // 八进制 i ...
- linux mint17.3+vmware 12.1.1 流畅安装运行OSX EI capitan
在linux mint17.3的vmware虚拟机中安装mac osx ei capitan系统 出于对苹果操作系统的好奇与喜爱,分别在宿主机操作系统为windows 7和linux mint17.3 ...
- 彻底关闭Windows自动更新
win+r--输入services.msc(服务管理窗口)停止windows update服务并禁用同时在恢复里,改为无操作 win + r --输入gpedit.msc(本地组策略编辑器)家庭版没有 ...
- P4240-毒瘤之神的考验【莫比乌斯反演,平衡规划】
正题 题目链接:https://www.luogu.com.cn/problem/P4240 题目大意 \(Q\)组数据给出\(n,m\)求 \[\sum_{i=1}^n\sum_{j=1}^m\va ...
- 从零入门 Serverless | SAE 的极致应用部署效率
作者 | 文俊 阿里巴巴云原生团队 本文整理自<Serverless 技术公开课>,"Serverless"公众号后台回复"入门",即可获取系列文章 ...
- Apache ShardingSphere 在京东白条场景的落地之旅
京东白条使用 Apache ShardingSphere 解决了千亿数据存储和扩容的问题,为大促活动奠定了基础. 2014 年初,"京东白条"作为业内互联网信用支付产品,数据量爆发 ...
- SpringBoot+WebSocket实时监控异常
写在前面 此异常非彼异常,标题所说的异常是业务上的异常. 最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的实时监控页面实时获取到该设备的信息及位置,然后安排员工去处理. 因为 ...
- 题解 [SDOI2009]E&D/染色游戏/Moving Pebbles
E&D 染色游戏 Moving Pebbles E&D 题目大意 给出 \(2n\) 堆石子,\(2i-1\) 和 \(2i\) 为一组.每次可以选择一组删掉其中一堆,然后从同一组另外 ...
- 洛谷1501 Tree II(LCT,路径修改,路经询问)
这个题是一个经典的维护路径信息的题,对于路径上的修改,我们只需要把对应的链\(split\)上来,然后修改最上面的点就好,注意pushdown的时候的顺序是先乘后加 然后下传乘法标记的时候,记得把对应 ...
- hibernate不同条件查询结果集一样,主键@ID的原因
这一周在翻新公司的老项目,遇到了一些预想不到的事情. 其中一个是,使用hibernate查询,不同的查询条件,居然都查到同一条记录,感觉奇怪了,开始以为是session的原因: 后来发现是hibern ...