首页 > 其他分享 >8 12 考试总结

8 12 考试总结

时间:2024-08-13 15:15:56浏览次数:8  
标签:总结 cnt 12 return seq ll mid 线段 考试

8 12 考试总结

难度分布不是很合理? 果然只是我太菜了

T1

原题: [ARC164B] Switching Travel

观察题意:可以发现是找一条黑白相间,两端颜色一致的链拼起来的环。

讲真,当时想的是直接爆搜的,但在设计时遇到了一些问题,导致没写出来。

正解是并查集判环。

若一条边连接的两点颜色不同,则其链接的两点加入同一并查集中,表示为一条链。

最后遍历一遍边,查找是否有相邻的点颜色相同且其在同一并查集中。

AC code:

#include <bits/stdc++.h>
#define seq(q, w, e) for (int q = w; q <= e; q++)
#define ll long long
using namespace std;
const int maxn = 2e5+10;
int n,m,fa[maxn],a[maxn];
struct node{
    int u,v;
}e[maxn];
bool cmp;
int find(int x){
    if(fa[x]==x) return fa[x];
    return fa[x]=find(fa[x]);
}
void join(int x,int y){
    fa[find(x)]=find(y);
}
int u,v;
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    seq(i,1,m){
        cin>>u>>v;
        e[i]=(node){u,v};
    }
    seq(i,1,n){
        cin>>a[i];
        fa[i]=i;    //并查集初始化
    } 
    seq(i,1,m)
        if(a[e[i].u]!=a[e[i].v]) join(e[i].u,e[i].v);      
    //若边连接的两边颜色不同,则表示此边是可走的
    seq(i,1,m){
        if(a[e[i].u]==a[e[i].v]&&find(e[i].u)==find(e[i].v)) 
            //查找相邻的,且处于同意并查集的点,有即yes 
            cmp=1; 
    }
    if(cmp){
        cout<<"Yes";
    }
    else{
        cout<<"No";
    }
    return 0;
}

T2

P1198 最大数

一眼鉴定为线段树。主要是我做过

对标朴素线段树,此题的线段树较为特殊,由于其动态的加入点,于是乎我们省去了建树操作。但线段树复杂的结构导致其维护时不是简单的 \(tree[++tot]=x\) 就可以解决的。

则我们假设每个操作都是加点,则此线段树序列的极限长度为 \(m\) ,如是便可进行操作。

维护一个 \(cnt\) 表示当前序列的末尾。用普通线段树的 单点修改+区间查询 即可。

AC code:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf=-114514;
ll m,cnt;
char op[2];
ll data[800005],x,t,p;
ll max(ll a,ll b)
{
    return a>b?a:b;
}
void add(ll s,ll k,ll o,ll l,ll r)
{
    if(l==r)
    {
        data[o]=k;
        return;
    }
    ll mid=(l+r)>>1;
    if(mid>=s) add(s,k,o<<1,l,mid);
    if(mid<s) add(s,k,o<<1|1,mid+1,r);
       data[o]=max(data[o<<1],data[o<<1|1])%p;
}
ll ask(ll lc,ll rr,ll o,ll l,ll r)
{
    if(lc<=l&&rr>=r) return data[o];
    ll mid=(l+r)>>1;
    ll a=inf,b=inf;
    if(mid>=lc) a=ask(lc,rr,o<<1,l,mid);
    if(mid<rr) b=ask(lc,rr,o<<1|1,mid+1,r);
    return max(a,b);
}
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>m>>p;
    for(ll i=0;i<m;i++)
    {
        cin>>op>>x;
        if(op[0]=='A')
        {
            add(cnt+1,(x+t)%p,1,1,m);
            cnt++;
         }
         if(op[0]=='Q')
        {
            if(x==0) t=0;
            else t=ask(cnt-x+1,cnt,1,1,m)%p;
            cout<<t<<endl;
        }
    }
    return 0;
}

T3

P1440 求m区间内的最小值

其实读完题就可以发现,这是单调队列板子( P1886 滑动窗口 /【模板】单调队列 ) ,但考试时忘了单调队列怎么写。所以说,这题也用的线段树。 (讲真 \(2^{22}\) 的数据范围竟然不会爆空间,有点惊讶)

既然是线段树,那么思路十分好想。简单的区间 \(RMQ\) 问题。建完树后, \([1,n]\) 扫一遍,输出query(i-m,i-1) 即可。

注:虽然题干上说数据范围为 \(2e6\) 但线段树开 \(2e6 \times 4\) 会 \(WA\) #2,#7。应开到 \(2^{22}\) ,才不会越界。以及,实测不用快读也能 \(AC\) 。

AC code:

#include<bits/stdc++.h>
#define ll long long
#define seq(q,w,e) for(int q=w;q<=e;q++)
using namespace std;
const int maxn=4194304;
ll tree[maxn<<2];
ll ls(ll p){return p<<1;}
ll rs(ll p){return (p<<1)|1;}
void push_up(ll p){
	tree[p]=min(tree[ls(p)],tree[rs(p)]);
}
void build_tree(ll p,ll pl,ll pr){
	if(pl==pr){
        cin>>tree[p];
		return;
	}
	ll mid=(pl+pr)>>1;
	build_tree(ls(p),pl,mid);
	build_tree(rs(p),mid+1,pr);
	push_up(p);
}
ll query(ll l,ll r,ll p,ll pl,ll pr){
	if(l>r) return 0;
	if(l<=pl&&r>=pr) return tree[p];
	ll mid=(pl+pr)>>1;
	ll ans=maxn;
	if(l<=mid) ans=min(ans,query(l,r,ls(p),pl,mid));
	if(r>mid) ans=min(ans,query(l,r,rs(p),mid+1,pr));
	return ans;
}
ll n,m;
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>m;
	build_tree(1,1,n);
	seq(i,1,n){
        int l=i-m,r=i-1;
        if(l<=0) l=1;
        if(l>r){
            cout<<"0"<<"\n";
            continue;
        }
        cout<<query(l,r,1,1,n)<<"\n";
	}
	return 0;
}

T4

P7076 动物园

考试时盯着这题看了二十分钟,完全没思路,成功爆0。

直接来看正解吧,由于其保证 \(q_i\) 互不相同,于是饲料并不重要。先计算已有的动物编号,哪些位上至少存在一次,用 \(|\) 操作。

对于每个操作,若 \(p_i\) 存在,则此种饲料一定存在。反之一定没有,即这一位一定不为1。

除去一定不为1的位,剩下 \(t\) 个位可能为1,那总动物数可以达到 \(2^t\) ,减去已有的 \(n\) 种,所以答案是 \(2^t-n\) 。

注:全程要用 unsigned long long ,当 \(t=64\) 时,会爆 ull ,所以特判,输出 \(18446744073709551616\) 即可。

AC code:

#include <bits/stdc++.h>
#define seq(q, w, e) for (int q = w; q <= e; q++)
#define ull unsigned long long
using namespace std;
const int maxn = 1e5+10;
int n,m,c,k;
ull sum,b;
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m>>c>>k;
    seq(i,1,n){
        ull x;
        cin>>x;
        sum|=x;
    }
    while(m--){
        int p,op;
        cin>>p>>op;
        if((sum>>p&1)==0) b|=1ull<<p;
    }
    ull ans=1;
    for (int i=0;i<k;i++){
        if((b>>i&1)==0) ans<<=1;
    }
    if(ans==0&&n==0){
        cout<<"18446744073709551616";
        return 0;
    }
    ans-=n;
    cout<<ans<<"\n";
    return 0;
}

标签:总结,cnt,12,return,seq,ll,mid,线段,考试
From: https://www.cnblogs.com/adsd45666/p/18356994

相关文章

  • 600条Linux 命令总结
    一、基本命令uname-m显示机器的处理器架构uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件(SMBIOS/DMI)hdparm-i/dev/hda罗列一个磁盘的架构特性hdparm-tT/dev/sda在磁盘上执行测试性读取操作系统信息arch显示机器的处理器架构uname-m显示机......
  • 个人技能总结-redis部分
    Redis部分技能总结架构总结Redis目前在用分为主从模式,sentinel主从模式集群Redis-cluster集群模式3种模式。redis-cluster是多master模式由多个maste共同维护16384个slotredis-sentinel是单master模式主从模式由sentinel控制主从切换和健康检查。种方式的优缺点Sen......
  • 个人技能总结-mongodb部分
    mongodb集群部分技能总结mongodb集群架构MongoDB是一种广泛使用的NoSQL数据库,其集群架构设计灵活且强大,能够根据不同的应用场景和需求提供合适的解决方案。目前,MongoDB主要有三种集群架构模式:主从复制(Master-Slaver)、副本集(ReplicaSet)和分片(Sharding)模式。主从复制(Master-Slav......
  • 个人技能总结-ES集群部分技能总结
    ES集群架构总结规划ES应用场景Elasticsearch(ES)是一款功能强大的分布式搜索引擎,广泛应用于各种场景。以下是其主要应用场景的详细介绍:Elasticsearch被广泛用于构建全文搜索引擎,能够快速而准确地搜索大量的文本数据,并提供高效的分析和聚合功能。例如,维基百科和百度百科使用ES进......
  • 个人技能总结-kafka部分
    kafka集群部分技能总结kafka集群架构Kafka集群的规划和架构设计是构建高性能、高可用性和可扩展性的分布式消息系统的关键。以下是关于Kafka集群规划和架构的详细说明:Kafka集群的基本组成Kafka集群主要由以下几个核心组件构成:生产者(Producer):负责向Kafka主题(Topic)发送消息的......
  • 8.12网络编程
    笔记TCP和UDP的基础通信一.套接字socket函数介绍#include<sys/types.h>/*SeeNOTES*/#include<sys/socket.h>intsocket(intdomain,inttype,intprotocol);功能:为通信创建一个端点,并返回该端点的文件描述符参数1:通信......
  • CSS笔记总结(Xmind格式):第二天
    Xmind鸟瞰图:简单文字总结:css知识总结:复合选择器:  1.交集选择器:在一个选择器的基础上,再增加一个选择器来增加条件(中间不能有任何符号包括空格)  2.并集选择器:多个选择器之间用逗号隔开,表示同时选择多个标签使用样式  3.后代选择器:使用空格分隔  4.子元......
  • JavaScript高阶笔记总结(Xmind格式):第三天
    Xmind鸟瞰图:简单文字总结:js高阶笔记总结:严格模式:  1.开启严格模式:"usestrict"  2.不使用var关键字声明会报错  3.严格模式下普通函数的this指向undefined高阶函数:  满足其中之一即高阶函数:    1.函数作为参数    2.函数作为返回值......
  • SSM基于vuejs的二手车交易平台ue120 虚拟支付
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,卖家,汽车类型,二手汽车,汽车预订,汽车尾款,汽车信息,汽车评估开题报告内容一、项目背景随着汽车产业的快速发展和互联网技术的普及,二手车市场逐......
  • 代码随想录day28 || 122 买卖最佳时机2,55 跳跃游戏,45 跳跃游戏2,1005 k次取反最大数组
    122买卖股票最佳时机2funcmaxProfit(prices[]int)int{ //思路,因为支持同一天买入卖出,所以利润最大应该是所有正利润的加总结果 varsumint fori:=1;i<len(prices);i++{ ifprices[i]-prices[i-1]>0{ sum+=prices[i]-prices[i-1] } } returns......