\(\color{white}{\mathbb{名之以:海棠}}\)


考场 \(t1\) 看见题意非常简单,觉得可能是个简单题

暴力算出几个小样例右端点右移的时候左端点都是单调右移的,以为具有单调性,于是想了一系列维护单调性的方法,然而拍大样例的时候挂的很惨(又一次前一个半小时啥也没干)

看 \(t2\),时间不够了写了个 \(floyd\) 直接跳

\(t3\) 发现部分分很多,认真思考两个特殊点,一个小时找到了能得 \(50\) 分的做法

最后 \(t1\) 又加了个退火,在暴力能跑出来的范围内正确性还可以

出分发现 \(t1\) 捆绑测试所以 \(1\) 分也没骗到,\(t3\) 没考虑到逆序对可能很多没模爆了 \(long\) \(long\),又惨挂 \(35\)

这次难度分析再次出现重大失误,事实证明 \(t2\) 是最可做的

以后应该增加开题前思考分析时间,并且部分分也应进行对拍


A. 送花

首先当右端点右移时最优坐决策点不是单调的,因为加入一个数后可能使一个之前位置的贡献变小,那么原来依赖其贡献的最优区间可能左端点左移更优

线段树维护区间的贡献

对于右端点右移一位的时候,将这个值上上一个位置到上一个位置的值加当前贡献,上一个位置到这个位置的值减当前贡献,然后线段树维护区间最大值即可


B. 星空

首先是距离的转化,先把坐标系旋转45度

类似于曼哈顿转切比雪夫距离,这道题的距离是 \(min(|x_1-x_2|,|y_1-y_2|)\)

先处理出距离为零的,用并查集合并在一起,然后按 \(x\) 和 \(y\) 分别排序后找最近点对即可

对于方案数相当于距离和答案相等的边两端点并查集里 \(size\) 值的乘积

代码实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e5+5;
int n,xx,yy,fa[maxn],siz[maxn],ans=0x3f3f3f3f,ans1=0,cnt,tot;
pair<int,int>edge[maxn];
int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
struct Node{
int x,y,id;
}p[maxn];
bool cmpx(Node a,Node b){
return a.x!=b.x?a.x<b.x:a.y<b.y;
}
bool cmpy(Node a,Node b){
return a.y!=b.y?a.y<b.y:a.x<b.x;
}
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int x,int y){
x=find(x);
y=find(y);
if(x==y)return;
fa[x]=y;
siz[y]+=siz[x];
return ;
}
void add(int x,int y){
if(x>y)swap(x,y);
// cout<<x<<" "<<y<<endl;
edge[++cnt]=make_pair(x,y);
return ;
}
signed main(){
n=read();
for(int i=1;i<=n;i++){
xx=read();
yy=read();
p[i].x=xx+yy;
p[i].y=xx-yy;
fa[i]=i;
siz[i]=1;
p[i].id=i;
}
// for(int i=1;i<=n;i++){
// cout<<"ppp "<<p[i].x<<" "<<p[i].y<<endl;
// }
sort(p+1,p+n+1,cmpx);
for(int i=1;i<=n;i++){
int j=i+1;
while((p[j].x==p[i].x||p[j].y==p[i].y)&&j<=n){
merge(p[i].id,p[j].id);
j++;
}
if(j<=n)ans=min(ans,p[j].x-p[i].x);
}
// cout<<"hhh"<<endl;
sort(p+1,p+n+1,cmpy);
for(int i=1;i<=n;i++){
int j=i+1;
while((p[j].y==p[i].y||p[j].x==p[i].x)&&j<=n){
merge(p[i].id,p[j].id);
j++;
}
if(j<=n)ans=min(ans,p[j].y-p[i].y);
} for(int i=1;i<=n;i++){
int j=i+1;
while((p[j].y==p[i].y||p[j].x==p[i].x)&&j<=n){
j++;
}
if(j<=n&&p[j].y-p[i].y==ans)add(find(p[i].id),find(p[j].id));//cout<<"hhh "<<i<<" "<<j<<endl,
}
sort(p+1,p+n+1,cmpx);
for(int i=1;i<=n;i++){
int j=i+1;
while((p[j].x==p[i].x||p[j].y==p[i].y)&&j<=n){
j++;
}
if(j<=n&&p[j].x-p[i].x==ans)add(find(p[i].id),find(p[j].id));//cout<<"hhh "<<i<<" "<<j<<endl,
}
// for(int i=1;i<=n;i++){
// if(fa[i]==i)cout<<"hhh "<<i<<" "<<siz[i]<<endl;
// }
sort(edge+1,edge+cnt+1);
tot=unique(edge+1,edge+cnt+1)-edge-1;
for(int i=1;i<=tot;i++){
int x=edge[i].first;
int y=edge[i].second;
// cout<<"kkk "<<x<<" "<<y<<endl;
ans1+=siz[x]*siz[y];
}
cout<<ans<<endl<<ans1;
return 0;
}

C. 零一串

对于每个是 \(1\) 的位置处理一个长度为 \(T\) 的零一串,每一个是一的位置表示这一时刻这个 \(1\) 能不能左移,那么最终结果很容易能处理出来

考虑怎样从上一个位置转移过来:

对于第 \(i\) 个 \(1\) 如果可以在 \(j\) 的时刻左移,如果 \(i+1\) 个位置是紧邻的,那么它只能在 \(j+1\) 时刻左移,表达在 \(01\) 串上是右移一位

如果不紧邻,那么有几个 \(0\) 后面的可以移几次,相当于把 \(0!\) 串的前面几个 \(0\) 变成 \(1\)

发现只有首尾进行操作,用队列维护即可

对于第二问的答案,是在求每个 \(01\) 串第 \(i\) 的和

如果把矩阵拍在序列上,一定对应一段连续区间,用差分维护即可

代码实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
deque<int>q;
const int maxn=1e7+5;
const int mod=998244353;
char c[maxn];
int t,n,pos[maxn],cnt,all,dis[maxn],cf[maxn],sum[maxn],ans,num,ori;
bool ans1[maxn];
int po(int a,int b){
int ans=1;
while(b){
if(b&1)ans=1ll*ans*a%mod;
a=1ll*a*a%mod;
b>>=1;
}
return ans;
}
signed main(){
// freopen("shuju.in","r",stdin);
// freopen("my.out","w",stdout);
cin>>t;
scanf("%s",c+1);
n=strlen(c+1);
for(int i=1;i<=n;i++){
if(c[i]=='1')num++;
else ori+=num;
}
ori%=mod;
for(int i=1;i<=n;i++){
if(c[i]=='1')pos[++cnt]=i;
}
for(int i=1;i<=t;i++){
q.push_back(i);
}
for(int k=1;k<=cnt;k++){
all++;
if(q.back()+all>t&&q.size())q.pop_back();
q.push_front(1-all); for(int j=1;j<=pos[k]-pos[k-1]-1&&q.size();j++){
cf[q.front()+all]++;
cf[min(cnt-k+q.front()+all+1,t+1)]--;
q.pop_front();
} dis[k]=t-q.size();
ans1[pos[k]-dis[k]]=1;
}
for(int i=0;i<=t;i++){
if(i)sum[i]=(sum[i-1]+cf[i])%mod;
ori+=sum[i];
ori%=mod;
ans^=(po(233,i)*ori%mod);
}
for(int i=1;i<=n;i++)cout<<ans1[i];
cout<<endl<<ans;
return 0;
}

\(\color{white}{\mathbb{知否,知否,应是绿肥红瘦。}}\)

noip模拟40的更多相关文章

  1. 20190908 NOIP 模拟40

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

  2. Noip模拟40 2021.8.15

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

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

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

  4. NOIP模拟 40

    考得更嘛也不是了. 不过如果不犯任何低错的话.. T1 我神奇地想要缩减码量 比如想把尽量多的$b[i]-1$省掉 于是求$b[i]$的时候先减了个一 本来是正的 减完就忘了他应该是非负的了 于是线段 ...

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

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

  6. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  7. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  8. NOIP模拟赛-2018.11.6

    NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...

  9. 2016-06-19 NOIP模拟赛

          2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...

随机推荐

  1. GhostScript 沙箱绕过(命令执行)漏洞(CVE-2018-19475)

    影响范围 Ghostscript 9.24之前版本 将POC作为图片上传,执行命令,抓包 POST /index.php HTTP/1.1 Host: target Accept-Encoding: ...

  2. C语言复习(二)

    引言: 不会将每一个部分都详述,只关注于一些自己认为重要的或常错的,若有不足,还望指出 switch()细节:括号内必须是整型或枚举类型:遇到break才会跳出:case包含的必须是常量 contin ...

  3. D. 旅游景点 Tourist Attractions 状压DP

    题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD 不希望在刚吃过一顿大餐之后立刻去下一 ...

  4. MSTP

    目录 一.生成树存在的问题 二.MSTP 三.MSTP的网络层次 四.MSTP的端口状态 五.MSTP的保护功能 一.生成树存在的问题 STP和RSTP的问题 PVST的问题 二.MSTP 多生成树 ...

  5. openresty——yum安装 配置 使用 错误处理 docker方式安装

    yum方式安装 wget https://openresty.org/package/centos/openresty.repo mv openresty.repo /etc/yum.repos.d/ ...

  6. Python 机器学习实战 —— 无监督学习(下)

    前言 在上篇< Python 机器学习实战 -- 无监督学习(上)>介绍了数据集变换中最常见的 PCA 主成分分析.NMF 非负矩阵分解等无监督模型,举例说明使用使用非监督模型对多维度特征 ...

  7. MyBatis学习01(初识MyBatis和CRUD操作实现)

    1.初识MyBatis 环境说明: jdk 8 + MySQL 5.7.19 maven-3.6.1 IDEA 学习前需要掌握: JDBC MySQL Java 基础 Maven Junit 什么是M ...

  8. Linux中的DNS主从解析

    目录 一.主服务器配置(紧接着正反解析实验) 1.1.修改区域配置文件 二.从服务器配置(启动另一台虚拟机) 2.1.安装服务 2.2.修改主配置文件 2.3.修改区域配置文件 2.4.修改dns服务 ...

  9. CVE-2021-21978 VMware View Planner 远程代码执行漏洞通告 | 附 POC

    漏洞简介 VMware 是一家云基础架构和移动商务解决方案厂商,View Planner 是他旗下推出的一款针对view桌面的测试工具.2021年03月02日,VMware 官方披露了 CVE-202 ...

  10. xv6学习笔记(4) : 进程调度

    xv6学习笔记(4) : 进程 xv6所有程序都是单进程.单线程程序.要明白这个概念才好继续往下看 1. XV6中进程相关的数据结构 在XV6中,与进程有关的数据结构如下 // Per-process ...