首页 > 其他分享 >NOIP-11 收容报告

NOIP-11 收容报告

时间:2023-11-04 19:12:40浏览次数:32  
标签:11 ch NOIP int void namespace WritE 收容 getchar

T1

判断是否存在一棵树,满足它有 \(a\) 个一度点和 \(b\) 个三度点,如果存在请给出一个节点数不超过 \(1000\) 的构造,否则输出 。

考场看了一个小时发现

image

image

第一种可以构造等量的一度电和三度电,第二种可以在不勾造三度电的情况下构造一度电,根据阳历六 ans 看出

image

可惜

没加 return 0; 挂成50了

#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Testify{
    int read(){
        int f(1),x(0);
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
        for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
        return f*x;
    }
    void WritE(int x){
        if(x<0) putchar('-'),x=-x;
        if(x>9) WritE(x/10);
        putchar(x%10+48);
    }
    void write(int x){
        WritE(x);
        puts("");
    }
    void Write(int x){
        WritE(x);
        putchar(' ');
    }
}
using namespace Testify;
int a,b;
const int N=2005;
int deg[N];
inline void Print(){
    write(a+b+1);
    for(register int i=1;i<=b;i++){
        Write(i+1),write(i);
    }
    int cnt=b+1;
    Write(1),write(++cnt);
    for(register int i=1;i<=b;i++){
        Write(i),write(++cnt);
    }
    int op=cnt;
    for(register int i=1;i<=(a+b+1)-op;i++){
        Write(b+1),write(++cnt);
    }
}
signed main(void){
    // freopen("ex_a6.in","r",stdin);
    // freopen("irises.out","w",stdout);
    a=read(),b=read();
    if(!a&&!b){
        return !puts("1");
    }
    if(!b){
        if(a==1){
            puts("0");
            return 0;
        }
        if(a==2){
            puts("2");
            puts("1 2");
            return 0;
        }
        if(a==3){
            return !puts("0");
        }
        write(a+1);
        puts("1 2");
        for(register int i=3;i<=a+1;i++){
            Write(2),write(i);
        }
        return 0;
    }
    for(register int i=1;i<=b;i++){
        deg[i]++,deg[i+1]++;
        // add(i,i+1),add(i+1,i);
    }
    int cnt=b+1;
    deg[1]++,deg[++cnt]++;
    // add(1,++cnt);
    for(register int i=1;i<=b;i++){
        deg[i]++;
        deg[++cnt]++;
        // add(i,++cnt);
    }
    int op=cnt;
    for(register int i=1;i<=(a+b+1)-op;i++){
        deg[b+1]++;
        deg[++cnt]++;
        // add(b+1,++cnt);
    }
    cnt=0;
    op=0;
    int numA=0,numB=0;
    for(register int i=1;i<=a+b+1;i++){
        // cerr<<deg[i]<<endl;
        if(deg[i]==1){
            numA++;
        }
        else if(deg[i]==3){
            numB++;
        }
    }
    if(numA==a&&numB==b){
        Print();
    }
    else{
        puts("0");
    }
    return 0;
}

T2

\(\max_{i=1}^{t}{iw_i}\)

二分答案,将边权假设为 1,\(check\) 为以 1 为起点跑 Dijstra 跑的过程中判断一下 \(Val*step\le \text{二分答案}\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Testify{
    int read(){
        int f(1),x(0);
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
        for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
        return f*x;
    }
    void WritE(int x){
        if(x<0) putchar('-'),x=-x;
        if(x>9) WritE(x/10);
        putchar(x%10+48);
    }
    void write(int x){
        WritE(x);
        puts("");
    }
    void Write(int x){
        WritE(x);
        putchar(' ');
    }
}
using namespace Testify;
const int N=3e5+5;
int n,m;
int head[N],nxt[N<<1],to[N<<1],tot,val[N<<1];
inline void add(int x,int y,int v){
    to[++tot]=y,nxt[tot]=head[x],head[x]=tot;
    val[tot]=v;
}
bool vis[N];
int dis[N];
typedef pair<int,int> P;
int ans=1e18,mAx=-1;
inline bool check(int VAL){
    priority_queue<P,vector<P>,greater<P>> q;
    for(register int i=1;i<=n;i++){
        dis[i]=-1,vis[i]=false;
    }
    q.push({0,1});
    dis[1]=0;
    while(q.size()){
        int op=q.top().second;
        q.pop();
        if(vis[op]) continue;
        vis[op]=true;
        for(register int i=head[op];i;i=nxt[i]){
            int y=to[i];
            if(vis[y]) continue;
            if((dis[op]+1)*val[i]>VAL){continue;}
            if(dis[y]==-1||dis[y]>dis[op]){
                dis[y]=dis[op]+1;
                q.push({dis[y],y});
            }
        }
    }
    return dis[n]!=-1;
}
signed main(void){
    freopen("zinnia.in","r",stdin);
    freopen("zinnia.out","w",stdout);
    n=read(),m=read();
    for(register int i=1;i<=m;i++){
        register int asd=read(),jkl=read(),v=read();
        add(asd,jkl,v);
        mAx=max(mAx,v);
    }
    int l=0,r=mAx*n,ans=l;
    while(l<=r){
        int mid=(l+r)>>1;
        if(check(mid)){
            r=mid-1;
            ans=mid;
        }
        else{
            l=mid+1;
        }
    }
    write(ans);
    // cerr<<(double)clock()/CLOCKS_PER_SEC;
    return 0;
}
/*
4 4
1 2 100
1 3 3
3 2 7
2 4 3

14

*/

T3 紫丁香

现在你需要删掉若干条边,最大化度数为奇数的点的个数。

使用 \(kurscal\) 重构树,记录 \(val\) 和 \(siz\),手摸一下发现图上的边一定会选,在倒序的最小生成树即字典序最大生成树上选择是否删边,因为你可以自由选择一个边是否被删,比如把fa边去掉即可改变其奇偶性。

每次加边的时候用可撤销并查集去掉当前边,如果一个点的 \(siz+val\) 为奇数说明这个边要选,最终可构造出答案。

#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Testify{
    int read(){
        int f(1),x(0);
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
        for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
        return f*x;
    }
    void WritE(int x){
        if(x<0) putchar('-'),x=-x;
        if(x>9) WritE(x/10);
        putchar(x%10+48);
    }
    void write(int x){
        WritE(x);
        puts("");
    }
    void Write(int x){
        WritE(x);
        putchar(' ');
    }
}
using namespace Testify;
const int N=1e6+5;
int x[N],y[N];
int fa[N];
int val[N],siz[N];
inline int find(int x){
    return x==fa[x]?x:find(fa[x]);
}
inline void update(int x){
    while(fa[x]!=x){
        val[x]++;
        x=fa[x];
    }
    val[x]++;
}
int xx[N],yy[N];
int ans[N];
int n,m;
signed main(void){
    freopen("lilac.in","r",stdin);
    freopen("lilac.out","w",stdout);
    n=read(),m=read();
    for(register int i=1;i<=m;i++){
        x[i]=read()+1,y[i]=read()+1;
    }
    for(register int i=1;i<=n;i++){
        fa[i]=i;
        siz[i]=1;
        val[i]=0;
    }
    for(register int i=m;i>=1;i--){
        xx[i]=find(x[i]),yy[i]=find(y[i]);
        if(xx[i]==yy[i]){
            ans[i]=1;
        }
        else{
            if(siz[xx[i]]>siz[yy[i]]){
                swap(xx[i],yy[i]);
            }
            siz[yy[i]]+=siz[xx[i]];
            fa[xx[i]]=yy[i];
        }
    }
    for(register int i=1;i<=m;i++){
        if(ans[i]){
            update(x[i]),update(y[i]);
        }
        else{
            siz[yy[i]]-=siz[xx[i]];
            val[yy[i]]-=val[xx[i]];
            fa[xx[i]]=xx[i];
            int vx=siz[xx[i]]+val[xx[i]];
            int vy=siz[yy[i]]+val[yy[i]];
            if(vx&1||vy&1){
                ans[i]=1;
                update(x[i]),update(y[i]);
            }
        }
    }
    for(register int i=1;i<=m;i++){
        WritE(ans[i]);
    }
    return 0;
}

标签:11,ch,NOIP,int,void,namespace,WritE,收容,getchar
From: https://www.cnblogs.com/phigros/p/17809675.html

相关文章

  • Win10手动升级到Win11最新版、无TPM等任何限制并且可保留文件、设置和应用升级的最新
    有很多朋友想从WIN10升级到WIN11,但有很多电脑无法满足WIN11的升级要求:如电脑不支持TPM2.0、不支持安全启动、不支持处理器等,同时原WIN10系统安装了很多程序和应用设置,所以无需重作系统、无任何限制并且可保留文件、设置和应用,那么从WIN10升级到WIN11就是最好的解决办法了。如果电脑......
  • 11.4日记
    其他法律细则 商业秘密 构成条件:未公开,能权利人带来利益,保密性。 商业秘密无固定保密时间,一般由企业自行决定。且不能延长。 专利权 期限:发明专利权保护期限为自申请日起20年,实用新型专利权和外观设计专利权保护期限为申请日起10年。 专利权谁先申请就归谁,若同一天申请,则双......
  • 2023-2024-1 20211306 密码系统设计与实现课程学习笔记8
    20211306密码系统设计与实现课程学习笔记8任务详情自学教材第5章,提交学习笔记知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题......
  • 【洛谷 P1085】[NOIP2004 普及组] 不高兴的津津 题解(打擂台法)
    [NOIP2004普及组]不高兴的津津题目描述津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因......
  • WinRAR6.11无广告 - 老牌压缩软件知名产品
       WinRAR是一款功能强大的压缩包管理器,它是档案工具RAR在 Windows环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从Internet上下载的RAR、ZIP及其它类型文件,并且可以新建RAR及ZIP格式等的压缩类文件。从5.60版开始,WinRAR启用了新的图标,但用户......
  • misc 2023.10.31-11.05
    1.a.观察发现,中间有什么一闪而过,那么逐帧分析就可以了。b.将其拖入Stegsolve工具中,进行逐帧分析c.故可得到flag 2.a.将其丢入010中查找flagb.得到flag 3.a.将其丢入winhex中,发现一个txt文件b.就放到linux下试了binwalk发现里面是个zip分析文件:binwalkfilen......
  • 20231102打卡
    今天早上我们学习了UML,下周还有实验课上午,我参加了体育活动,打了一场篮球比赛。作为软工学生,除了学习,我们也要注重身体锻炼。打篮球不仅可以锻炼身体,还可以调节心情,让自己更加活跃和积极。通过这次篮球活动,我和同学们一起团结合作,互相配合,增强了团队意识和集体荣誉感。下午的课程......
  • P2347 NOIP1996 提高组 砝码称重
    P2347NOIP1996提高组砝码称重最初思路看出来是多重背包,但是第一次用于求方案数,一开始想的是累加。但是实现起来发现结果很抽象,想想也不是那么回事。比如从样例上来说,F[3]=1,F[2]=1,F[1]=1,显然F[3]!=F[1]+F[2]改进思路然后受到启发,决定用打标记的思想,即若重量\(j\)......
  • 牛客练习赛117 C&D
    LinkC分类讨论贪心显然的,正面考虑怎么拼团会很麻烦,所以我们从另一个视角考虑,求出可能的最大团数,然后看一看怎么踢人能够使落单的最少。当K为偶数的时候,显然最大团数就是\((n+m*2)/k\),而当K为奇数的时候,显然男生抱团需要至少一个男生,女生抱团也需要至少一个男生,最大团数就是\(m......
  • 20211105李宜时信息安全系统设计与基础学习笔记八
    Ubuntu中的定时器及时钟服务学习笔记基础概念在Ubuntu系统中,定时器和时钟服务是操作系统时间管理的基础。定时器用于在特定时间点或经过特定时间间隔后触发事件。时钟服务则提供当前时间和日期信息。硬件定时器硬件定时器是由计算机硬件提供的计时设备,它可以在不同时间间隔发......