csp-s模拟测试94「凉宫春日的犹豫·漫无止境的八月·射手座之日」

凉宫春日的犹豫

题解

第一次秒切题,5分钟切掉

比较$x^y$和$y!$大小

如果$x^y<y!$输出Yes

问题转化为

$\frac{1}{x} *\frac{2}{x}*\frac{3}{x},,,,,*\frac{y}{x}>=1$输出$Yes$

开双端队列维护,一直保持单调,然后让队首*队尾就行了

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 111111
long double zhajing;
double x,y;
ll t;
deque<long double> q;
int main(){
    freopen("yuuutsu.in","r",stdin);
    freopen("yuuutsu.out","w",stdout);
    scanf("%lld",&t);
    while(t--){
        scanf("%lf%lf",&x,&y);
        zhajing=1.0;
        while(q.size()) q.pop_front();
        for(double i=1;i<=y;i++){
            q.push_back(i/x);
        }
        while(q.size()>=2){
            long double x1=q.front(),x2=q.back(),now;
            q.pop_front(),q.pop_back();
            now=x1*x2;
            if(now<x1){
                q.push_front(now);
            }
            else {
                q.push_back(now);
            }
        }
        long double now=q.front();
        if(now>=1.0000000000000){
            printf("Yes\n");
        }
        else printf("No\n");
    }
}

漫无止境的八月

题解

其实都是套路,映射到最后一块然后线段树维护

考场水掉了QwQ

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 2100000
ll cha[A],a[A],thelast[A];
ll n,k,q,l,r,minn,maxx;
ll abs_(ll x){
    if(x<0) return -x;
    return x;
}
struct node{
    ll l,r,mn,mx;
}tr[A*8];
void built(ll x,ll l,ll r){
    tr[x].l=l,tr[x].r=r;
    if(l==r){
        tr[x].mn=tr[x].mx=cha[l];
        return ;
    }
    ll mid=(l+r)>>1;
    built(x<<1,l,mid);
    built(x<<1|1,mid+1,r);
}
void change(ll x,ll pla,ll val){
    if(tr[x].l==tr[x].r){
        tr[x].mn+=val;
        tr[x].mx+=val;
        return ;
    }
    ll mid=(tr[x].l+tr[x].r)>>1;
    if(mid>=pla) change(x<<1,pla,val);
    else change(x<<1|1,pla,val);
    tr[x].mn=min(tr[x<<1].mn,tr[x<<1|1].mn);
    tr[x].mx=max(tr[x<<1].mx,tr[x<<1|1].mx);
}
void seg_ask(ll x,ll l,ll r){
    if(tr[x].l>=l&&tr[x].r<=r){
        maxx=max(maxx,tr[x].mx);
        minn=min(minn,tr[x].mn);
        return ;
    }
    ll mid=(tr[x].l+tr[x].r)>>1;
    if(mid>=l) seg_ask(x<<1,l,r);
    if(mid<r) seg_ask(x<<1|1,l,r);
}
void workbf(){
    for(ll p=0;p+k<=n;p++){
        if(cha[p]<0){
            ll x=abs_(cha[p]);
            cha[p]+=x;
            cha[p+k]-=x;
        }
        if(cha[p]>0){
            ll x=abs_(cha[p]);
            cha[p]-=x;
            cha[p+k]+=x;
        }
    }
    ll ok=1;
    for(ll p=0;p<=n;p++){
        if(cha[p]){
            ok=0;
            break;
        }
    }
    if(ok) printf("Yes\n");
    else printf("No\n");
}
void worksol(){
    for(ll p=0;p+k<=n;p++){
        if(cha[p]<0){
            ll x=abs_(cha[p]);
            cha[p]+=x;
            cha[thelast[p]]-=x;
        }
        if(cha[p]>0){
            ll x=abs_(cha[p]);
            cha[p]-=x;
            cha[thelast[p]]+=x;
        }
    }
    ll ok=1;
    for(ll p=0;p<=n;p++){
        if(cha[p]){
            ok=0;
            break;
        }
    }
    if(ok) printf("Yes\n");
    else printf("No\n");
}
int main(){
    freopen("august.in","r",stdin);
    freopen("august.out","w",stdout);
    scanf("%lld%lld%lld",&n,&k,&q);
    for(ll i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    for(ll i=0;i<=n;i++)
        cha[i]=a[i]-a[i+1];
    for(ll i=0;i<=n;i++){
        ll l=0,r=n,ans;
        while(l<=r){
            ll mid=(l+r)>>1;
            if(i+mid*k<=n){
                ans=mid;
                l=mid+1;
            }
            else r=mid-1;
        }
        thelast[i]=ans*k+i;
    }
    if(q<=2000)workbf();
    else worksol();
    built(1,0,n);
    for(ll i=1;i<=q;i++){
        ll pla,dx;
        scanf("%lld%lld",&pla,&dx);
        {
            change(1,thelast[pla],dx);
            change(1,thelast[pla-1],-dx);
            maxx=0,minn=0;
            seg_ask(1,n-k+1,n);
            if(maxx==0&&minn==0){
                printf("Yes\n");
            }
            else printf("No\n");
        }
    }
}

射手座之日

题解

先解释为什么要差分

思考dfs序包含一段区间,你可能找到的是祖先,不是最近的

然后差分转化权值$p[i]=w[i]-w[fa[i]]$

例如一棵树

现在算3点贡献,你在2时算一次,1算一次贡献

在3时贡献$w[3]-w[2]$在二算$w[2]-w[1]$,在一算$w[1]-w[0]$

在一条链时,你把除了最近公共祖先贡献都消掉了,最后一定会归到第一个节点,

再例如算3,4,你在2算时贡献是$w[2]-w[1]$,在1$w[1]-w[2]$,你把除了最近公共祖先贡献都消掉了

然后现在就可以对于每个节点算了,而不用考虑是否满足最近条件

现在问题转化成了,对于一个节点,有多少区间,每一个区间贡献是(len)*(len-1)/2(即所有区间个数)

然后线段树维护即可

代码

#include<bits/stdc++.h>
using namespace std;
#define  A 12222222
#define ll long long
ll w[A],rt[A],d[A],a[A],c[A],pos[A],head[A],nxt[A],ver[A];
ll n,ans,tot;
struct tree{
    ll l,r,lw,rw,tw;
}tr[A];
void add(ll x,ll y){
    nxt[++tot]=head[x],head[x]=tot,ver[tot]=y;
}
void update(ll x,ll l,ll r){
    tr[x].lw=tr[tr[x].l].lw,tr[x].rw=tr[tr[x].r].rw;
    ll mid=(l+r)>>1;
    if(tr[x].lw==mid-l+1) tr[x].lw+=tr[tr[x].r].lw;
    if(tr[x].rw==r-mid) tr[x].rw+=tr[tr[x].l].rw;
    tr[x].tw=tr[tr[x].l].tw+tr[tr[x].r].tw+tr[tr[x].l].rw*tr[tr[x].r].lw;
}
void insert(ll &x,ll l,ll r,ll id){
    if(!x) x=++tot;
    if(l==r){tr[x].lw=tr[x].rw=tr[x].tw=1;return ;}
    ll mid=(l+r)>>1;
    if(mid>=id) insert(tr[x].l,l,mid,id);
    else insert(tr[x].r,mid+1,r,id);
    update(x,l,r);
}
ll merge(ll x,ll k,ll l,ll r){
    if(!x||!k) return x|k;
    ll mid=(l+r)>>1;
    tr[x].l=merge(tr[x].l,tr[k].l,l,mid);
    tr[x].r=merge(tr[x].r,tr[k].r,mid+1,r);
    update(x,l,r);
    return x;
}
void dfs(ll x,ll pre){
    insert(rt[x],1,n,pos[x]);
    c[x]=w[x]-w[pre];
    for(ll i=head[x];i;i=nxt[i]){
        ll y=ver[i];
        if(y==pre) continue;
        dfs(y,x);
        rt[x]=merge(rt[x],rt[y],1,n);
    }
    ans+=c[x]*tr[rt[x]].tw;
}
int main(){
    freopen("sagittarius.in","r",stdin);
    freopen("sagittarius.out","w",stdout);
    scanf("%lld",&n);
    for(ll i=2,x;i<=n;i++)
        scanf("%lld",&x),add(i,x),add(x,i);
    for(ll i=1;i<=n;i++)
        scanf("%lld",&d[i]),pos[d[i]]=i;
    for(ll i=1;i<=n;i++)
        scanf("%lld",&w[i]);
    dfs(1,0);
    printf("%lld\n",ans);
}

原文地址:https://www.cnblogs.com/znsbc-13/p/11779058.html

时间: 2024-11-08 08:32:39

csp-s模拟测试94「凉宫春日的犹豫·漫无止境的八月·射手座之日」的相关文章

csp-s模拟测试94

csp-s模拟测试94 一场简单题,打爆了.$T1$脑抽分解质因数准备分子分母消,想了半天发现$jb$互质直接上天,果断码了高精滚蛋.$T2$无脑手玩大样例,突然灵光一闪想到映射到前$K$大小的区间,$T3$写完暴力准备划水,突然发现特殊性质可写,$10$分钟拯救了$25$分. 80 03:24:46 70 03:24:58 65 03:25:10 215 03:25:10 没办法就是菜,退役也不暝目. A. 凉宫春日的忧郁 转成对数轻松过. B. 漫无止境的八月 取模到$K$大小的区间,$ha

2019.10.30 csp-s模拟测试94 反思总结

头一次做图巨的模拟题OWO 自从上一次听图巨讲课然后骗了小礼物以后一直对图巨印象挺好的233 T1: 对于XY取对数=Y*log(x) 对于Y!取对数=log(1*2*3*...*Y)=log1+log2+log3+...+logY 因为数字大小不超过1e5,直接累加最后比较就可以了 #include<iostream> #include<cstdio> #include<cmath> using namespace std; int t,x,y; double a,b

csp-s模拟测试41「夜莺与玫瑰&#183;玫瑰花精&#183;影子」

夜莺与玫瑰 题解 联赛$T1$莫比乌斯$\%\%\%$ $dead$  $line$是直线 首先横竖就是$n+m$这比较显然 枚举方向向量 首先我们枚举方向向量时只枚举右下方向,显然贡献$*2$就是所有斜着的直线 $i,j$表示当自己向右$i$个单位长度,向下$j$单位长度 我们相同斜率下只算最短的线贡献,(因为其他长度下方案数都包含在最短里面了) 我们方向向量$i$,$j$的$gcd(i,j)==1$时我们枚举的才是当前斜率最短长度, 然后考虑贡献 考虑容斥,先算出来当前长度下所有线段再减去重

csp-s模拟测试58「Divisors」&#183;「Market」&#183;「Dash Speed」?

A. Divisors 大概平均下来每个数也就几千约数吧....,直接筛 B. Market 可以把时间离线下来, 考试没有想到将询问离线,用数组存算了算只能过200的点,拿了70 事实上背包后直接二分就好... C. Dash Speed 好题,想到以前的一道题影子. 考场用单调队列多QJ了20分,然而没有想到并查集 线段树上分治????? 线段树上的节点表示在该权值在该区间内的边,每个节点开个vector即可 那么考虑区间查询和单点修改, 对于每个叶子节点,我们从上到下所经历的边其实就是可行

csp-s模拟测试103「game,time」

time 题解 贪心考虑,考试时想错了,我想的是移动最大值,枚举最大值位置,然后把左面和右面逆序对拼起来, 当然,处理不了有多个最大值情况,于是我就想着打个部分分吧 然而对拍还是挂, 枚举最大值位置是不对的 考虑一种情况a,b,c,d,e,f,g 其中d最大可能出现a移动到d右面更优,b,c留在左面,我只移动最大值的话默认a,b,c都在左面 附赠一组点4 5 2 3 1 6 7 最优决策是6步,方案是2 4 5 6 7 3 1 . 出现了我说的这种情况 考试时打这个题花费时间还是过于多了 正解是

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey

noip模拟测试11

T1:string 第一眼秒出思路,这不就是排序那道题的加强版吗? 然而歪?解复杂度虽然是对的,但常数过大,竟被卡到70 歪?解:(实际上std写的就是这个,但据说std被卡掉了 OAO) 因为字符集很小,所以我们可以把区间排序改为区间查询和覆盖 即:先查询区间内所有字符的个数,再从左端点开始按照大小关系依次将长度为字符个数的区间修改为该字符. 期望复杂度O ( 26*mlogn ),实际复杂度O ( 26*mlogn*(巨大的常数) ) 所以需要一(feng)定(kuang)的卡常 正?解:

模拟测试(vj)

做这份模拟测试,已经崩溃了,英文看不懂,题意理解错.到结束了只a了第一题,人生陷入了低谷,于是花了一天的时间终于把不会的弄明白了,在这里写一份总结~ T1,简单的模拟,如果打枪打中一支鸟,将这个位置设为0,并向两边扩散,注意这个位置一定要有鸟. 代码~ #include<bits/stdc++.h> using namespace std; int a[30000]; int n,m; int main() { cin>>n; for(int i=1;i<=n;i++) ci

Android单元测试与模拟测试详解

测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabricator differential 发diff时提交需要执行的单元测试,在开发流程上就可以保证远端代码的稳定性). 2. 测什么? 一般单元测试: 列出想要测试覆盖的异常情况,进行验证. 性能测试. 模拟测试: 根据需求,测试用户真正在使用过程中,界面的反馈与显示以及一些依赖系统架构的组件的应用测