tg 74 solution
tg 74 solution
T1
暴搜题
这个sb在赛时打了个垃圾暴搜
事实上你打个表就可能会发现结论
下面给出一个构造方案并给出严谨证明
就是首先两个数组分别填上
然后每次考虑从
新增的部分考虑将对方复制然后加上
给出证明:
设当前答案数组
显然
即
假设
此时
此时我们提出组合数
同理,把
不巧的是
于是
然后就是如果
你会发现两个最高次项消没了,于是剩下的又是系数相等,
于是就证完了
T2
"zazheng"
"zuotianhackwo" "jintiannihailai"
首先记
显然的
事实上,我们只需要知道
就可以知道
事实上,记
显然的,
因为差分的意义就是
单调了二分出所有改变点就不难了
对于一次二分的过程是:
一开始
记
当
否则
一直二分到
显然,
对于每个点
每条边一次二分,算上预处理,询问次数
T3
线段树,
势能分析表明时间复杂度是对的
直接放码了
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define D double
const int o=2222222,u=43;
const D cosin=0.73908513321516064166;
ifstream fin("excalibur.in");
ofstream fout("excalibur.out");
int n,m,L,R;
D a[o],P[u];
struct SgT{
D val[o][u];
int num[o],lazy[o],cov[o];
void up(int p){
num[p]=0;
int ls=p*2,rs=p*2+1;
for(int i=0,l=num[ls],r=num[rs];i<u;i++){
val[p][i]=val[ls][l]+val[rs][r];
l++,r++;
l=(l==u?0:l);
r=(r==u?0:r);
}
}
void build(int p,int l,int r){
if(l==r){
val[p][0]=a[l];
for(int i=1;i<u;i++)
val[p][i]=cos(val[p][i-1]);
return;
}
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
up(p);
}
void down(int p,int l,int r){
int ls=p*2,rs=p*2+1;
int mid=(l+r)/2;
if(cov[p]){
cov[ls]=cov[rs]=cov[p];
num[ls]=num[rs]=num[p];
lazy[ls]=lazy[rs]=0;
D k=(mid-l+1.0)/(r-l+1.0);
for(int i=0;i<u;i++)
val[ls][i]=val[p][i]*k;
k=1-k;
for(int i=0;i<u;i++)
val[rs][i]=val[p][i]*k;
cov[p]=lazy[p]=0;
}
if(lazy[p]>0){
int t=max(0,min(lazy[p],u-lazy[ls]));
D v=cosin*(mid-l+1);lazy[ls]+=t;
for(int i=1,&x=num[ls];i<=lazy[p];i++){
val[ls][x]=v;x++;
x=(x==u?0:x);
}
t=max(0,min(lazy[p],u-lazy[rs]));
v=cosin*(r-mid);lazy[rs]+=t;
for(int i=1,&x=num[rs];i<=lazy[p];i++){
val[rs][x]=v;x++;
x=(x==u?0:x);
}
lazy[p]=0;
}
}
void cover(int p,int l,int r){
if(L<=l&&r<=R){
cov[p]=1;
lazy[p]=num[p]=0;
for(int i=0;i<u;i++)
val[p][i]=P[i]*(r-l+1);
return;
}
down(p,l,r);int mid=(l+r)/2;
if(L<=mid)cover(p*2,l,mid);
if(R>mid)cover(p*2+1,mid+1,r);
up(p);
}
void change(int p,int l,int r){
if(val[p][num[p]]==cosin*(r-l+1))return;
if(L<=l&&r<=R){
lazy[p]++;
val[p][num[p]]=cosin*(r-l+1);
num[p]++;
num[p]=(num[p]==u?0:num[p]);
return ;
}
down(p,l,r);int mid=(l+r)/2;
if(L<=mid)change(p*2,l,mid);
if(R>mid)change(p*2+1,mid+1,r);
up(p);
}
D ques(int p,int l,int r){
if(val[p][num[p]]==cosin*(r-l+1))
return cosin*(min(r,R)-max(l,L)+1);
if(L<=l&&r<=R)
return val[p][num[p]];
down(p,l,r);
int mid=(l+r)/2;D ans=0;
if(L<=mid)ans+=ques(p*2,l,mid);
if(R>mid)ans+=ques(p*2+1,mid+1,r);
return ans;
}
}T;
void in(){
fin>>n>>m;
for(int i=1;i<=n;i++)fin>>a[i];
}
void work(){
T.build(1,1,n);
for(int i=1;i<=m;i++){
int op;
fin>>op>>L>>R;
if(op==1)T.change(1,1,n);
if(op==2)fout<<fixed<<setprecision(8)<<T.ques(1,1,n)<<"\n";
if(op==3){
fin>>P[0];
for(int j=1;j<u;j++)P[j]=cos(P[j-1]);
T.cover(1,1,n);
}
}
}
int main(){
ios::sync_with_stdio(0);
fin.tie(0),fout.tie(0);
in();work();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具