6.27 考试总结

今天真是鬼畜的一场考试,考的是XJOI上的题目

第三题看完题解至今仍是一脸懵逼,完全不懂如何实现

(话说出题人是怎么想到把一个二维问题三维化的OwO

算了算了,前两道题都是送分题,怪不得第三题这么难

先说前两题的题解把

首先第一题

我们可以预处理约数个数函数可以O(1)算出某个b对某个f的贡献

然后我们考虑后面的点的添加状态不会影响到前面的点的状态

又发现当我们做到某个点的时候,由于b>0,所以这个点一定存在一种决策使得这个点对答案有贡献

答案显然是所有的v的和,这样我们可以在O(nlogn)的时间内解决这个问题了

不过貌似由于数据太难构造了,所以貌似随手写写随机化也可以过OwO

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;

typedef long long LL;
const int maxn=200010;
int n;
int b[maxn],f[maxn],v[maxn];
bool vis[maxn];
LL r[maxn],g[maxn],ans;

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        for(int j=i;j<=n;j+=i)f[j]++;
    }
    for(int i=1;i<=n;++i)scanf("%d",&b[i]);
    for(int i=1;i<=n;++i)scanf("%lld",&r[i]);
    for(int i=1;i<=n;++i)scanf("%d",&v[i]),ans+=v[i];
    for(int i=1;i<=n;++i){
        if(g[i]==r[i]){
            vis[i]=true;
            for(int j=i;j<=n;j+=i)g[j]=g[j]+1LL*b[i]*f[j/i];
        }
    }
    printf("%lld\n",ans);
    for(int i=1;i<=n;++i){
        if(vis[i])printf("1 ");
        else printf("0 ");
    }return 0;
}

第二题

OwO 读完题之后发现是数据结构裸题

离线之后按边权sort一遍做树链剖分用线段树维护一个类似连续子段和的东西就可以了

写的时候一气呵成,直接就拍上了(话说这么裸的数据结构题目真的有写的必要么?

实际上如果这道题目强制在线我们可以不用离线sort直接上主席树就可以了

OwO

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;

const int maxn=100010;
int n,m,u,v,w;
int a[maxn];
int dep[maxn],son[maxn],sz[maxn],fa[maxn];
int pos[maxn],fp[maxn],top[maxn],tot=0;
int Ans[maxn];
int anc[maxn][20];
int h[maxn],cnt=0;
struct edge{
    int to,next;
}G[maxn<<1];
struct Edge{
    int u,v,w;
}c[maxn];
struct ASK{
    int x,y,lim,id;
}Q[maxn];
struct Seg_Tree{
    int pre,suf,val,len;
}t[maxn<<2],tmp;

bool cmpQ(const ASK &A,const ASK &B){return A.lim>B.lim;}
bool cmpc(const Edge &A,const Edge &B){return A.w>B.w;}
void add(int x,int y){
    ++cnt;G[cnt].to=y;G[cnt].next=h[x];h[x]=cnt;
}
void read(int &num){
    num=0;char ch=getchar();
    while(ch<‘!‘)ch=getchar();
    while(ch>=‘0‘&&ch<=‘9‘)num=num*10+ch-‘0‘,ch=getchar();
}
void DFS(int u,int f){
    fa[u]=f;sz[u]=1;
    for(int i=h[u];i;i=G[i].next){
        if(G[i].to==f)continue;
        dep[G[i].to]=dep[u]+1;
        DFS(G[i].to,u);sz[u]+=sz[G[i].to];
        if(sz[G[i].to]>sz[son[u]])son[u]=G[i].to;
    }return;
}
void Get_pos(int u,int f){
    ++tot;pos[u]=tot;fp[tot]=u;top[u]=f;
    if(!son[u])return;
    Get_pos(son[u],f);
    for(int i=h[u];i;i=G[i].next){
        if(G[i].to==fa[u]||G[i].to==son[u])continue;
        Get_pos(G[i].to,G[i].to);
    }return;
}
void pre_LCA(){
    for(int i=1;i<=n;++i){
        anc[i][0]=fa[i];
        for(int j=1;(1<<j)<=n;++j)anc[i][j]=-1;
    }
    for(int j=1;(1<<j)<=n;++j){
        for(int i=1;i<=n;++i){
            if(anc[i][j-1]!=-1){
                int a=anc[i][j-1];
                anc[i][j]=anc[a][j-1];
            }
        }
    }return;
}
int LCA(int p,int q){
    int log;
    for(log=0;(1<<log)<=dep[p];++log);--log;
    for(int i=log;i>=0;--i){
        if(dep[p]-(1<<i)>=dep[q])p=anc[p][i];
    }
    if(p==q)return p;
    for(int i=log;i>=0;--i){
        if(anc[p][i]!=-1&&anc[p][i]!=anc[q][i]){
            p=anc[p][i];q=anc[q][i];
        }
    }return fa[p];
}
int Get_Point(int u,int d){
    int log;
    for(log=0;(1<<log)<=dep[u];++log);--log;
    for(int i=log;i>=0;--i){
        if(anc[u][i]!=-1&&dep[anc[u][i]]>d)u=anc[u][i];
    }return u;
}
void build(int o,int L,int R){
    if(L==R){t[o].len=1;return;}
    int mid=(L+R)>>1;
    build(o<<1,L,mid);build(o<<1|1,mid+1,R);
    t[o].len=t[o<<1].len+t[o<<1|1].len;
}
Seg_Tree merge(const Seg_Tree &A,const Seg_Tree &B){
    tmp.len=A.len+B.len;
    tmp.pre=(A.pre!=A.len?A.pre:A.pre+B.pre);
    tmp.suf=(B.suf!=B.len?B.suf:B.suf+A.suf);
    tmp.val=A.val+B.val;
    tmp.val=tmp.val-a[A.suf]-a[B.pre]+a[A.suf+B.pre];
    return tmp;
}
void UPD(int o,int L,int R,int p){
    if(L==R){t[o].pre=t[o].suf=1;t[o].val=a[1];return;}
    int mid=(L+R)>>1;
    if(p<=mid)UPD(o<<1,L,mid,p);
    else UPD(o<<1|1,mid+1,R,p);
    t[o]=merge(t[o<<1],t[o<<1|1]);
}
Seg_Tree ask(int o,int L,int R,int x,int y){
    if(L>=x&&R<=y)return t[o];
    int mid=(L+R)>>1;
    if(y<=mid)return ask(o<<1,L,mid,x,y);
    else if(x>mid)return ask(o<<1|1,mid+1,R,x,y);
    else{
        Seg_Tree A=ask(o<<1,L,mid,x,y);
        Seg_Tree B=ask(o<<1|1,mid+1,R,x,y);
        return merge(A,B);
    }
}
Seg_Tree Get_ask(int u,int v){
    Seg_Tree cur;
    bool flag=true;
    while(top[u]!=top[v]){
        Seg_Tree now=ask(1,1,n,pos[top[u]],pos[u]);
        if(flag)cur=now,flag=false;
        else cur=merge(now,cur);
        u=fa[top[u]];
    }Seg_Tree now=ask(1,1,n,pos[v],pos[u]);
    if(flag)cur=now;
    else cur=merge(now,cur);
    return cur;
}
int Get_ans(int u,int v){
    if(dep[u]<dep[v])swap(u,v);
    if(u==v)return 0;
    int lca=LCA(u,v);
    if(v==lca){
        int tu=Get_Point(u,dep[v]);
        Seg_Tree A=Get_ask(u,tu);
        return A.val;
    }else{
        int tu=Get_Point(u,dep[lca]);
        int tv=Get_Point(v,dep[lca]);
        Seg_Tree A=Get_ask(u,tu);
        Seg_Tree B=Get_ask(v,tv);
        int ans=A.val+B.val;
        ans=ans-a[A.pre]-a[B.pre]+a[A.pre+B.pre];
        return ans;
    }
}

int main(){
    read(n);
    for(int i=1;i<n;++i)read(a[i]);
    for(int i=1;i<n;++i){
        read(u);read(v);read(w);
        u++;v++;
        add(u,v);add(v,u);
        c[i].u=u;c[i].v=v;c[i].w=w;
    }DFS(1,-1);Get_pos(1,1);pre_LCA();build(1,1,n);
    read(m);
    for(int i=1;i<=m;++i){
        read(Q[i].x);read(Q[i].y);read(Q[i].lim);Q[i].id=i;
        Q[i].x++;Q[i].y++;
    }
    for(int i=1;i<n;++i)if(dep[c[i].u]<dep[c[i].v])swap(c[i].u,c[i].v);
    sort(Q+1,Q+m+1,cmpQ);sort(c+1,c+n,cmpc);
    int now=1;
    for(int i=1;i<=m;++i){
        while(now<n&&c[now].w>Q[i].lim){
            UPD(1,1,n,pos[c[now].u]);
            now++;
        }
        Ans[Q[i].id]=Get_ans(Q[i].x,Q[i].y);
    }
    for(int i=1;i<=m;++i)printf("%d\n",Ans[i]);
    return 0;
}

第三题上午更正题意没有听懂更正在说些什么OwO

然后用最小圆覆盖乱写搞模拟退火然后爆零了

后来下午弄懂了更正发现改了改原来模拟退火居然有20分

(然而直接输出yes也有20分

以为200分的挺多的,结果下午过来之后发现大家第一题都挂了OwO

没错,是第一题都挂了。。

我国果然是数据结构大国啊QAQ

第二题AC人数远超第一题AC人数

不过貌似这套题差不多跟NOI day1 难度相仿?

时间: 2024-07-30 19:45:12

6.27 考试总结的相关文章

9.27考试 SD_le NOIP模拟题 第三题 建造游乐场题解

这道题当时没读完题时脑部了无数种问法,然而最后还是猝不及防.一开始还以为是结论题,然而死也退不出来,就先去打第二题了.然后在想这道题时,我想到的是这样的思路(由于当时时间紧迫,尚未完善): 我每次向图中增加两个点,那么这两个点对于所有入度为偶数的点是否连接一定是一致的,如果这两个点相连,那么如果使他们分别和一个入度为单数的点相连,那么他们就是新的入度为单数的点,其他情况就不叙述了,太多了.还不是正解. 由于最后时间太紧迫了,我不得不打暴力去保分,结果还好丢人好丢人的打错了-- 正解其实还是挺有意

3.27考试小记

一天考了两场-- 上来先看第一题,发现题目中有一个LIS,然而我并不知道它是何物,看了一会没看出来LIS是啥就先放着了,第二题读完发现是原题,而且还不是特别费码力那种,开心.第三题读完发现还是原题,难道这场是信心赛? 于是先打最好打的第三题,打完之后发现图建对了,边权建错了,有点小慌,想了一会没想出来,就先放着了,然后去打第二题,按照之前的打法打完了调了一会就过了,本来想对拍一下保险一点,然而并不会造数据,好尴尬--于是接着做第三题,又推了一会推出来了边权,样例都过了,这次也会造数据,然而并不会

5.27 考试修改+总结

这是一个悲伤的故事 上午写manacher的时候往里面加#号,然后统计有效字符的个数 然后我就开始模拟,一个长度为6的串我都能数错有多少个有效字符 我把2个字符数成了3个!然后暴力就挂掉了5分.. 为什么这几天的暴力总是会挂掉,真是奇怪(看来是最近自己内心不太稳了 (大概是被那个梦吓得吧QAQ) 今天又A了两道题目,感觉天天都是两道正解+挂掉的暴力QAQ 先放题解吧 第一题是之前数位DP坑掉的题目,然后今天尝试着写了写,感觉不是很难 但是并不是用数位DP做的 先考虑加密的情况,我们只需要统计每一

2019.7.27考试反思

前方低能,请战斗人员和非战斗人员靠近. 这次考试大概是正常水平偏低.... 就算这样反正前两次倒数第二机房反正是稳了可以考虑去抢一下第二机房房主 考试前一天专题就出来了,结果有bug,我把题解下载了我真的没看要不然我还能这分 达哥想了一个月出的题,应该会河鳝核善一点bgm核爆起 考试上来首先过了一遍题,T1不会,T2很迷,T3贼鸡儿像原题? 然后开始快快乐乐码T3,大概码了45分钟拿了75分. 滚回去看T1,手%都不会,看来我概率期望真的和shi一样,qj了一个点. 然后看T2,emmmmm,第

10.27考试总结

我要的幸福 题意是找出从1,1到n,m的一条路,有障碍不能走,只能走右边或者下边,每次走一步,求字典序最小方案 这道题当时想着用深搜结果麻烦了,而且答案错误... 题解:从终点开始向左边或者上边走,找出所有不能走的点,打上标记 注意vis[i][i]=vis[i+1][j]|vis[i][j+1],异或是有一则一,就是有能到达它的点,他就能走.如果周围都是0那他也不能走 再直接从1,1开始走,贪心地选取右边.下边的中的最小值,依次输出就是字典序最小值了 i&(1<<k)是看i的第k位是

吉萨法律时间浪费拉丝粉;阿里山

http://www.ebay.com/cln/tmotshu/book/157890749018/2015.01.27.html http://www.ebay.com/cln/tmotshu/book/157890755018/2015.01.27.html http://www.ebay.com/cln/tmotshu/book/157890757018/2015.01.27.html http://www.ebay.com/cln/tmotshu/book/157890775018/20

◆CFA考试二级胜在根本-9月27日上海交大解密讲座◆

跨越CFA考试"分水岭"·攻克2015年6月CFA二级考试 与你一起"鸟瞰"CFA二级考试,赢在起点,胜在根本 金程教育2015年6月CFA二级真题大解密及备考策略说明会(上海专场) ◆2014年9月27日(周六)14:30-16:30 上海交大徐汇校区 ◆编辑短信内容"姓名+考试级别"发送至"◆13162963778◆"预约,收到回执短信,即为预约成功. 作为CFA考试中的"分水岭",CFA二级考试成为广

[考试反思]0220省选模拟27:怪异

怪异的一场考试.考的有点懵 $T1$正解是模拟,人人都能切,然而也没有多少人敢笃定这就是正解吧,常数和精度上下卡着,看运气的题了. $T2$想到了第二档分其实离正解就不远了但是时间不够没往下想.回$T1$卡常去了. $T3$不给状压分,于是猜到一条结论之后并不敢往下想... 然而最后$T1$也没有卡过,考后也在这破玩意上浪费了不少时间... 而且$T3$数据特别谁水暴力可以过,然而因为我不会决策点单调,所以学了学知识点,并没有用暴力水过... T1:飞行棋 大意:长度为$n$的序列,$m$人.每

【OCP认证12c题库】CUUG 071题库考试原题及答案(27)

27.choose two The SQL statements executed in a user session are as follows: SQL> CREATE TABLE product (pcode NUMBER(2), pname VARCHAR2(10)); SQL> INSERT INTO product VALUES (1, 'pen'); SQL> INSERT INTO product VALUES (2,'pencil'); SQL> SAVEPOI