6.22 NOI 模拟
\(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 模拟的更多相关文章
- 8.22 NOIP 模拟题
8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...
- 5.30 NOI 模拟
$5.30\ NOI $模拟 高三大哥最后一次模拟考了,祝他们好运 \(T1\)装箱游戏 显然可以将四种字母之间的空缺当做状态枚举 那么这道题就很显然了 #include<bits/stdc++ ...
- 5.23 NOI 模拟
$5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...
- 5.6 NOI模拟
\(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...
- 5.4 NOI模拟
\(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...
- 9.22 NOIP模拟题
吉林省信息学奥赛 2017 冬令营 ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- 2018.9.22 NOIP模拟赛
*注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...
- 2018.08.22 NOIP模拟 string(模拟)
string [描述] 给定两个字符串 s,t,其中 s 只包含小写字母以及*,t 只包含小写字母. 你可以进行任意多次操作,每次选择 s 中的一个*,将它修改为任意多个(可以是 0 个)它的前一个字 ...
随机推荐
- Prometheus普罗米修斯快速入门
欢迎来到普罗米修斯! Prometheus是一个监控平台,通过从监控目标的抓取HTTP端点上获取指标. 本指南将展示如何使用和安装Promethues,配置和监视第一个资源.还将下载并安装导出器Exp ...
- 免申请直接用上 IDEA 新 UI,只需要这三步配置
早上给大家介绍了IDEA官方宣布正在开发一套全新的UI,但目前是预览版需要申请才能体验. 随后马上就有网友分享了,不需要申请直接就能激活体验的方法. 本期视频:https://www.bilibili ...
- “极简”创建 github page 并设置域名
最简单最详细的,创建 github page 并设置域名,没有多余的步骤,并且多图,对新手特别友好 尝试用 github page 创建博客,并设置独立域名.网上找了许多教程,都太复杂.自己的创建过程 ...
- 解决python 导入selenium 库后自动化运行成功但是报错问题
本章节开始进入自动化的基础教学了,首先我们要对我们的工具有一定的熟练使用程度,做自动化常用的工具一个是搭建 RobotFramework自动化框架,另外一个便是我们最常用的python 工作原理是比较 ...
- vue大型电商项目尚品汇(后台篇)day01
开始我们后台篇的内容,前面处理了一些事情,去学校完成授位仪式,由校长授位合影,青春不留遗憾,然后还换了一个电脑,征战了四年的神船终于退役了,各种各样的小毛病是真的烦人. 现在正式开始后台篇的内容,做了 ...
- Ubuntu-apt-get出错
ubuntu apt-get的时候出现: E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission ...
- SAP Web Dynpro-集成消息
您可以使用消息管理器将消息集成到消息日志中. 您可以使用Web Dynpro代码向导打开消息管理器. 您可以从工具栏中打开Web Dynpro代码向导. 当您的ABAP工作台处于更改模式或编辑视图或控 ...
- 【黑马pink老师的H5/CSS课程】(二)标签与语法
视频链接:P8~P29 黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动 参考链接: HTML 元素 1.HTML语法规范 1.1 基本语法概述 HTML 标签是由尖 ...
- static关键字续、继承、重写、多态
static关键字 1.对于实例变量,每个java对象都拥有自己的一份,存储在堆内存当中,在构造方法执行的时候初始化. 2.所有对象都拥有同一个属性时,并且值相同,建议声明为static变量. 3.静 ...
- Linux修改默认ssh22端口
1.检查端口是否可用 使用下面的命令检查您想增加或修改的端口号是否被占用,执行命令后如果没有任何打印,说明这个端口没有被占用 netstat -lnp|grep 23456 2.修改配置文件 ssh配 ...