\(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. nodejs使用 svg-captcha 做验证码及验证

    一.需求 使用 nodejs 做后端开发,需要请求验证码,在 github 上看到了 svg-captcha 这个库,发现他是将 text 转 svg 进行返回的,安全性也有保证,不会被识别成文字. ...

  2. 使用instanceof操作符判断对象类型及方法的重载

    学习内容: 一.使用instanceof操作符判断对象类型 1.instanceof操作符可以判断一个实例对象是否属于一个类. 语法:对象名 instanceof 类名 2.使用instanceof表 ...

  3. python字符编码与文件操作

    目录 字符编码 字符编码是什么 字符编码的发展史 字符编码实际应用 编码与解码 乱码问题 python解释器层面 文件操作 文件操作简介 文件的内置方法 文件的读写模式 文件的操作模式 作业 答案 第 ...

  4. 第31章 Spring bean 作用域

    每日一句 I must say a word about fear. It is life's only true opponent. Only fear can defeat life. 这里必须说 ...

  5. IDEA找不到类但实际存在的问题解决

    不知道某天开始Idea就开始抽风了. 现象: 一个service的接口类,就在同一个包下,但总是找不到,编辑器一直标红 编译可以通过 说明类本身应该是没什么问题的.问题是怎么重新编译重新reload ...

  6. 【zigbee无线通信模块步步详解】ZigBee3.0模块建立远程网络控制方法

    本文以路灯控制应用为例,简述ZigBee3.0模块使用流程. 一.建立网络 1.通过USB转串口模块将出厂的ZigBee自组网模块连接,打开上位机软件"E180-ZG120A-Setting ...

  7. Zookeeper分布式锁实现Curator十一问

    前面我们剖析了Redisson的源码,主要分析了Redisson实现Redis分布式锁的15问,理清了Redisson是如何实现的分布式锁和一些其它的特性.这篇文章就来接着剖析Zookeeper分布式 ...

  8. Charles如何抓取https请求-移动端+PC端

    Charles安装完成,默认只能抓取到http请求,如果查看https请求,会显示unkonw或其它之类的响应.所以需要先进行一些配置,才能抓取到完整的https请求信息.下面针对PC端和手机端抓包的 ...

  9. BUUCTF-webshell后门

    webshell后门 老方法,D盾直接查杀. flag{ba8e6c6f35a53933b871480bb9a9545c}

  10. vue封装手机验证码

    // 获取验证码 let endMsRes = new Date().getTime() + 45000; localStorage.setItem("myEndTime", JS ...