\(T1\)递归

给出 \(Thue-Morse\) 序列的定义三

每次 \(0\rightarrow 01\),\(1\rightarrow 10\)

\(0\rightarrow 01 \rightarrow 0110 \rightarrow 01101001\rightarrow...\)

我们现在已知串 \(010010\) 考虑将其划分

\(0\ 10\ 01\ 0\) 或者 \(01\ 00 \ 10\)

显然第二个是不合法的。

我们把第一个补全,为 \(10\ 10\ 01\ 01\)

然后合并一下为 \(1100\) ,我们假设 \(1100\) 出现的位置是 \(i\) 我们 \(010010\) 出现的位置为 \(2i+1\)

然后我们得到递推式 \(f(l,r)=f(\lfloor l/2\rfloor,\lfloor r/2\rfloor)+(l\mod 2)\)

我们只需要暴力求小数据即可

#include<bits/stdc++.h>
using namespace std;
int f[3][8]={{0,1},{5,2,0,1},{0,4,3,1,5,2}};
long long slo(long long l,long long r)
{
if(r-l+1>=4) return 2*slo(l/2,r/2)+(l&1);
long long S=0;
for(long long i=l;i<=r;i++)
{
S|=(__builtin_popcountll(i)&1)<<(i-l);
}
return f[r-l][S];
}
int main()
{
int q;
scanf("%d",&q);
while(q--)
{
long long l,r;
scanf("%lld%lld",&l,&r);
cout<<slo(l,r)<<"\n";
}
}

$T2\ $加边

按照原图跑以 \(1\) 为根的 \(bfs\) 树

\(b>2\times a\)答案是 \(dep\times a\)

否则对于 \(b\) 边进行 \(bfs\) ,类似三元环进行删边,复杂度可以保证在 \(O(m\sqrt m)\)

#define Eternal_Battle ZXK
#include<bits/stdc++.h>
#define int long long
#define MAXN 200005
using namespace std;
#define FastIO
#ifdef FastIO
char buf[1<<21],*p1,*p2;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
template<class T>
T Read()
{
T x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^'0');
ch=getchar();
}
return x*f;
}
int (*read)()=Read<int>;
#define read Read<int>
vector<int>rd[MAXN],gd[MAXN];
int dis[MAXN],dep[MAXN],n,m,a,b;
void add(int u,int v)
{
rd[u].push_back(v);
gd[u].push_back(v);
}
void bfs()
{
queue<int>q;
memset(dep,-1,sizeof(dep));
q.push(1);
dep[1]=0;
while(q.size())
{
int now=q.front();
q.pop();
for(int i=0;i<rd[now].size();i++)
{
int y=rd[now][i];
if(dep[y]!=-1) continue;
q.push(y); dep[y]=dep[now]+1;
}
}
}
bitset<MAXN>Min;
void bfs_dis()
{
queue<int>q;
memset(dis,-1,sizeof(dis));
q.push(1);
dis[1]=0;
while(q.size())
{
int now=q.front();
q.pop();
// Min.reset();
for(vector<int>::iterator it=rd[now].begin();it!=rd[now].end();)
{
int y=*it;
Min[y]=1;
it++;
}
for(vector<int>::iterator it=rd[now].begin();it!=rd[now].end();)
{
int y=*it;
if(dis[y]!=-1) it=rd[now].erase(it);
else it++;
for(vector<int>::iterator it1=gd[y].begin();it1!=gd[y].end();)
{
int ty=*it1;
if(dis[ty]!=-1)
{
it1=gd[y].erase(it1);
}
else
{
it1++;
if(Min[ty]) continue;
dis[ty]=dis[now]+b;
q.push(ty);
}
}
}
for(int i=0;i<rd[now].size();i++)
{
int y=rd[now][i];
Min[y]=0;
}
}
}
signed main()
{
scanf("%lld%lld%lld%lld",&n,&m,&a,&b);
for(int i=1,u,v;i<=m;i++)
{
u=read();v=read();
add(u,v); add(v,u);
}
bfs();
if(b>=2*a)
{
for(int i=2;i<=n;i++)
{
cout<<dep[i]*a<<"\n";
}
}
else
{
bfs_dis();
for(int i=2;i<=n;i++)
{
if(dep[i]%2==0)
{
cout<<(dep[i]/2)*b<<"\n";
}
else
{
if(dis[i]==-1) cout<<dep[i]/2*b+a<<"\n";
else cout<<min(dep[i]/2*b+a,dis[i])<<"\n";
}
}
}
}

$T3\ $虐场

考虑枚举 \(k\),考虑已知 \(k\) 之后应该怎么求解

设 \(c_i=b_{j+1}-b_{j}-k\)表示空场的和

我们先选定连续 \(n\) 场,向左右移动,可以导致 \(b\) 整体加减 \(1\),\(c\) 不变

首先最大化收益,先考虑选最右侧 \(n\times k\) 场,然后往左移动

设 \(d_i=b_i-a_i\) 我们要 $d_i\leq 0 $,并且 \(\sum |b_i|\) 尽可能小

每次贪心的话,就把目前后缀最大值位置向左平移,最后每个位置移动的位置是后缀的最大值

设后缀最大值 \(suf_i\),答案是 \(\sum (suf_i-b_i)\)

至于移动限制考虑我们只能进行 \(m-k\times n\) 次前缀减,后面的只能进行整体减就好了

发现答案是关于 \(k\) 的凸函数,可以三分找极值点

#define Eternal_Battle ZXK
#include<bits/stdc++.h>
#define int long long
#define MAXN 200010
using namespace std;
int n,m,k,lim,a[MAXN],b[MAXN];
int check(int x)
{
long long nw=0;
for(int i=1;i<=n;i++)
{
b[i]=m*x-x*(x+1)/2*n+i*x-a[i];
nw=max(nw,b[i]);
}
long long an=0,sum=max(nw-m+x*n,0ll);
for(int i=n;i>=1;i--)
{
sum=max(sum,b[i]);
an+=sum-b[i];
}
return an;
}
signed main()
{
scanf("%lld%lld",&n,&m);
k=lim=m/n;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
int l=1,r=m/n;
while(l<=r)
{
long long mid=(l+r)>>1;
if(mid*(mid-1)/2*n+i*mid<=a[i]) l=mid+1;
else r=mid-1;
}
lim=min(lim,r);
l=1,r=lim;
while(l<=r)
{
long long mid=(l+r)>>1;
if(m*mid-mid*(mid+1)/2*n+i*mid-a[i]-m+mid*n<=0) l=mid+1;
else r=mid-1;
}
k=min(l,k);
}
int ans=check(min(lim,k));
int l=0,r=k-1;
while(r-l>10)
{
int mid=(l+r)>>1;
long long an1=check(mid),an2=check(mid+1);
if(an1<an2) r=mid-1;
else l=mid+2;
}
for(int i=l;i<=r;i++)
{
ans=min(ans,check(i));
}
ans=-ans;
for(int i=1;i<=n;i++)
{
ans+=a[i];
}
cout<<ans<<endl;
}

6.22 NOI 模拟的更多相关文章

  1. 8.22 NOIP 模拟题

      8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...

  2. 5.30 NOI 模拟

    $5.30\ NOI $模拟 高三大哥最后一次模拟考了,祝他们好运 \(T1\)装箱游戏 显然可以将四种字母之间的空缺当做状态枚举 那么这道题就很显然了 #include<bits/stdc++ ...

  3. 5.23 NOI 模拟

    $5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...

  4. 5.6 NOI模拟

    \(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...

  5. 5.4 NOI模拟

    \(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...

  6. 9.22 NOIP模拟题

    吉林省信息学奥赛 2017 冬令营                                                                                    ...

  7. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  8. 2018.9.22 NOIP模拟赛

    *注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...

  9. 2018.08.22 NOIP模拟 string(模拟)

    string [描述] 给定两个字符串 s,t,其中 s 只包含小写字母以及*,t 只包含小写字母. 你可以进行任意多次操作,每次选择 s 中的一个*,将它修改为任意多个(可以是 0 个)它的前一个字 ...

随机推荐

  1. CoaXPress 简介

    CoaXPress 背景 CoaXPress (简称CXP)是指一种采用同轴线缆进行互联的相机数据传输标准,主要用于替代之前的cameralink协议,常见于科学相机.工业相机.医学图像.航空防务等场 ...

  2. .NET性能优化-推荐使用Collections.Pooled

    简介 性能优化就是如何在保证处理相同数量的请求情况下占用更少的资源,而这个资源一般就是CPU或者内存,当然还有操作系统IO句柄.网络流量.磁盘占用等等.但是绝大多数时候,我们就是在降低CPU和内存的占 ...

  3. linux运维基础2

    内容概要 虚拟机关键配置名词解释 远程链接工具 xshell基本使用 linux命令准则 系统运⾏命令 常用快捷方式 文件命令操作 文件编辑命令 内容详情 虚拟机关键配置名词解释 # 虚拟网络编辑器说 ...

  4. 无鼠标打开Windows设备管理

    转载:https://blog.csdn.net/weixin_39946767/article/details/118644619

  5. UVA471 Magic Numbers 题解

    1.题目 题意很简单:输入n,枚举所有的a,b,使得 (1)满足a/b=n. (2)满足a,b各个位上的数字不相同. 2.思路 (1)对于被除数,要满足各个位上的数字,显然最大枚举到987654321 ...

  6. 网络协议之:memcached binary protocol详解

    目录 简介 memcached的协议包 memcached命令举例 总结 简介 前面讲到了memcached的文本协议,虽然文本协议看起来非常简单,但是对于客户端来说一般还是会选择效率更高的二进制协议 ...

  7. .NET中如何在同步代码块中调用异步方法

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 在同步代码块中调用异步方法,方法有很多. 一.对于有返回值的Task 在同步代码块中直接访问 Task 的 Result ...

  8. 轻量级多级菜单控制框架程序(C语言)

    1.前言 作为嵌入式软件开发,可能经常会使用命令行或者显示屏等设备实现人机交互的功能,功能中通常情况都包含 UI 菜单设计:很多开发人员都会有自己的菜单框架模块,防止重复造轮子,网上有很多这种菜单框架 ...

  9. Spring Boot 实践 :Spring Boot + MyBatis

    Spring Boot 实践系列,Spring Boot + MyBatis . 目的 将 MyBatis 与 Spring Boot 应用程序一起使用来访问数据库. 本次使用的Library spr ...

  10. 软件项目管理 7.5.项目进度模型(SPSP)

    [公众号@ "项目管理研究所" 将会第一时间更新文章并分享<行业分析报告>] 归档于软件项目管理初级学习路线 第七章 软件项目进度计划 你猜猜里面是什么-->&l ...