2019.9.20 csp-s模拟测试48 反思总结

头疼,不说废话了,祝大家rp++。

T1:

暴力枚举,n3

枚举两个串开始匹配的位置,每一次尽量修改。

#include<iostream>
#include<cstdio>
using namespace std;
int n,k,cnt,num,ans;
char a[310],b[310];
int main()
{
    scanf("%d%d",&n,&k);
    scanf("%s",a+1);
    scanf("%s",b+1);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cnt=0,num=0;
            for(int l=i,r=j;l<=n&&r<=n;l++,r++){
                if(a[l]!=b[r])cnt++;
                if(cnt>k)break;
                num++;
            }
            ans=max(ans,num);
        }
    }
    printf("%d",ans);
    return 0;
}

T2:

枚举四个点中间的两个点,它们对应的路径条数就是度数减一的乘积,即(du[i]-1)*(du[j]-1)。减一是因为它们彼此相连。

然后还要考虑重复的情况,即它们走到同一个点。因为一条满足条件的链节点数只有四,重复的情况只可能是它们两个第一步走出去的点是同一个点,即两个点都和那个重复点直接相连,这种时候答案多统计了一次。可以用bitset存每个点连出去的节点,答案减去交集的大小。

听他们说这个是三元环计数……?不知道不了解,之后补课。

因为我不会用bitset,考场上全靠自己根据一点模糊印象瞎搞,一开始给bitset开出的100000的大小到最后也没改,然后t成了40分。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<bitset>
using namespace std;
int n,d[1510];
long long ans;
bitset<1510>s[1510];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1,x;j<=n;j++){
            scanf("%1d",&x);
            if(x)s[i][j]=1,d[i]++;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i!=j&&s[i][j]){
                ans+=(d[i]-1)*(d[j]-1);
                ans-=(s[i]&s[j]).count();
            }
        }
    }
    printf("%lld",ans);
    return 0;
}

T3:

首先考虑枚举每个val的子集连0边,然后每个点向对应权值连1边,再由权值向这个点连0边。这就好像出发的起始费用是1,走到另一个节点的结尾收费是0,于是每条路全长为1。

发现这样连出来的图,很多节点都能到达同一个节点,然而这些节点彼此之间也存在到达的关系。可以考虑让一个点不会到达“可以到达的点”会到达的点,即减少边数,让能被传递的到达关系尽量代替直接到达关系。那么只要让每个权值连向它的某一位去掉1的值就可以了。原本存在的节点与权值连的两条边不变,题目给出的m条边也不变,最后边数变成了20*220+2n+m。

因为边权只存在1和0,直接跑双端队列bfs,每一次要把能0边到达的所有点都加进队列保证距离不减。挺丢人的,我没太弄明白最后这句,后来一想bfs每个点只到达一次,可不是要尽量更早到达吗……

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<cmath>
#include<queue>
using namespace std;
const int inf=2147483647;
const int maxn=(1<<20);
deque<pair<int,int> >q;
long long d[2000005];
int n,m,t,cnt=maxn,num,p,sum;
int a[2000005],vis[2000005];
int ver[2000005],Next[5000005],tot,head[5000005],edge[5000005];
void add(int x,int y,int z){
    ver[++tot]=y;
    Next[tot]=head[x];
    head[x]=tot;
    edge[tot]=z;
}
void bfs(){
    d[maxn+1]=0;
    q.clear();
    vis[1+maxn]=1;
    q.push_back(make_pair(1+maxn,0));
    while(!q.empty()){
        int x=q.front().first;
        d[x]=q.front().second;
        q.pop_front();
        if(x<=maxn){
            for(int j=0;j<=20;j++){
                if((x&(1<<j))&&!vis[x^(1<<j)]){
                    vis[x^(1<<j)]=1;
                    q.push_front(make_pair(x^(1<<j),d[x]));
                }
            }
            if(!vis[0]){
                q.push_front(make_pair(0,d[x]));
                vis[0]=1;
            }
        }
        for(int i=head[x];i;i=Next[i]){
            int y=ver[i];
            if(!vis[y]){
                vis[y]=1;
                if(edge[i])q.push_back(make_pair(y,d[x]+1));
                else q.push_front(make_pair(y,d[x]));
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        add(maxn+i,a[i],0);
        add(a[i],maxn+i,1);
    }
    for(int i=1,x,y;i<=m;i++){
        scanf("%d%d",&x,&y);
        add(x+maxn,y+maxn,1);
    }
    for(int i=0;i<=maxn+n;i++)d[i]=-1;
    bfs();
    for(int i=maxn+1;i<=maxn+n;i++){
        printf("%lld\n",d[i]);
    }
    return 0;
}

写错一句位运算调了一早晨

又没去学校,苟在家里改题。身体状况略有点可笑,因为状态差所以不得不想一些办法来让自己打起精神,但是这么做的话身体就会更差,最后索性放弃治疗。能活多久就多久吧,最少撑两个月就行。

活着还是死去有什么区别呢。

原文地址:https://www.cnblogs.com/chloris/p/11562259.html

时间: 2024-07-31 10:35:53

2019.9.20 csp-s模拟测试48 反思总结的相关文章

[CSP-S模拟测试48]反思+题解

状态很垃圾的一场考试.感觉“这么多分就够了”的心态很是在给自己拖后腿. 打开题面,第一页赫然写着:$Claris' Contest$. 吓得我差点手一抖关掉.不过后来想想似乎强到变态的人出的题都不是很不可做?大概是实力越强越能体会弱者的难处吧. 看T1:woc 字符串?完蛋完蛋. T2:什么啊?图上乱搞? T3:最短路?边都建不出来. 回去又读了一遍T1发现是sbDP,一眼切了开始码.结果死调不出来,考试开始25min的时候真的是有点慌,这么水的题别人估计都10min以内解决,我都调了快20mi

2019.9.20 tomcat自定义网站测试

1,首先在根目录建立一个web目录,并在里面创建一个web目录,用于存放网站文件 [[email protected] ~]# mkdir -pv /web/webapp 2,在webapp目录下建立一个index.jsp的测试页面 [[email protected] ~]# vim /web/webapp/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="U

2019.9.28 csp-s模拟测试54 反思总结

咕咕咕的冲动如此强烈x T1x: 看完题目想了想,感觉把gcd不为1的强行放在一组,看作一个连通块,最后考虑连通块之间的组合方式就可以了. 然后维护这个连通块可以写并查集可以连边跑dfs怎么着都行… 然而我在处理数字分解质因数这里T掉了,原因是一个很显然的优化写法我基本没怎么写过.线性筛的时候记录每个数是被哪个质数标记过的,分解一个数的时候直接处理记录下来的质数就可以. #include<iostream> #include<cstdio> #include<cmath>

2019.10.26 csp-s模拟测试88 反思总结

今天的主人公是什么? 60.1K!!!! 先扔代码再更新防止我等会儿一上头不打算写完题解 T1: #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const double inf=214748364; int n,k; double a[100010],f[21][100010]; int main() { scanf("%d%d",&n

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

2019.9.19 csp-s模拟测试47 反思总结

思路接近正解?都想到了?这都是借口呀. 没有用的,往前走吧. T1:Emotional Flutter 我的做法和题解不太一样,我把s放在最后考虑了. 因为出发以后步幅是一样的,所以每一个黑条可以ban掉一段出发点.把黑条的左右边界%k存成区间,每个黑条可以存一个或者两个区间[跨越k这个边界].然后像以前写区间覆盖的贪心一样按左端点排序,看看有没有长至少为s的空余. 代码: #include<iostream> #include<cstdio> #include<cstrin

2019.9.26 csp-s模拟测试52 反思总结

刚刚写了一个小时的博客没了,浏览器自动刷新. 一!个!小!时! 鼠标键盘电脑哪个都不能摔,气死我了. 垃圾选手T1T2没思路,T3倒是想出来得比较早,靠T3撑着分数. 数据结构学傻选手,属实垃圾. T1平均数: 一个序列的所有数如果减去x,那么平均数也会减去x.可以二分这个x,统计序列里平均数小于0的序列的个数,含义为原序列平均数小于x的序列的个数.最后统计值小于k且最接近k的x就是所求答案. 序列的平均数小于0,那么序列的和也一定小于0.表现在前缀和上即为一个区间的sumr<suml-1,转化

2019.9.27 csp-s模拟测试53 反思总结

这个起名方式居然还有后续?! 为什么起名不是连续的?! T1想了半天,搞出来了,结果数组开小[其实是没注意范围].T2概率期望直接跳,后来翻回来写发现自己整个理解错了期望的含义[何].T3错误想到赛道修建结果来了个错误贪心. 关于T2破罐子破摔输出k居然骗了二十分这件事…… T1u: 一开始各种想偏,维护哪种值是奇数或偶数个,考虑每次操作影响哪些值变化…这些全都跑出来了. 大概过了一个世纪那么长,突然想着能不能直接优化操作的过程啊,然后对暴力进行钻研,终于开始想到差分. 然后觉着nq的复杂度过不

2019.9.29 csp-s模拟测试55 反思总结

不咕咕咕是一种美德[大雾] 头一次体会到爆肝写题解??? 这次考试我们没赶上,是后来掐着时间每个人自己考的.我最后的分数能拿到152…熟悉的一题AC两题爆炸. 强烈吐槽出题人起名走心 T1联: 发现每一次加入一个区间的操作,只有区间的l或者r+1有可能成为答案.那么考虑能不能用这两个点代表一整个区间,维护全局最靠左的0在什么地方. 把每个操作的l和r+1都存下来,离散化,建一棵线段树.每一次区间操作都针对线段树上的a[l]-a[r+1]-1这部分(a[x]为x离散化以后的排序,即线段树里的位置)