首页 > 其他分享 >23暑假友谊赛

23暑假友谊赛

时间:2023-07-20 10:22:50浏览次数:41  
标签:typedef const 23 int long return solve 暑假 友谊赛

23暑假友谊赛

马猴烧酒

思路:枚举对行的所有可能操作,判断列需要的操作次数是否满足条件;

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e4+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;

string s[25];
void solve(){
    int n,m,a,b;cin>>n>>m>>a>>b;
    for(int i=0;i<n;++i){
        cin>>s[i];
    }
    for(int i=0;i<(1<<n);++i){
        int cnt=__builtin_popcount(i);
        if(cnt>a)continue;
        set<int>se;
        for(int j=0;j<n;++j){
            if(!(i&(1<<j))){
                for(int k=0;k<m;++k){
                    if(s[j][k]=='*')se.insert(k);
                }
            }
        }
        if(se.size()<=b){
            cout<<"yes\n";return;
        }
    }
    cout<<"no\n";
    return ;
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //init();
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
View Code

 

阶乘

思路:要求n!是p的倍数,说明n!的因子包含p的全部因子。

统计出p的所有因子,及其个数,那么p=a1k1*a1k2*...*amkm

由于ai都是互质的,需要!n中的每种质因子是相互不影响的;

单独求出包含每种质因子全部个数的最小n,对所有n取最大即可;

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;
int prime[N],cnt[N],idx,p;
bool check(int x){
    for(int i=1;i<=idx;++i){
        int s=0,n=x;
        while(n){
            s+=n/prime[i];
            n/=prime[i];
        }
        if(s<cnt[i])return false;
    }
    return true;
}
void solve(){
    cin>>p;
    idx=0;
    for(int i=2;i<=p/i;++i){
        if(p%i==0){
            prime[++idx]=i;
            while(p%i==0){
                cnt[idx]++;
                p/=i;
            }
        }
    }
    if(p>1)prime[++idx]=p,cnt[idx]++;
    int l=1,r=1e9,ans;
    while(l<=r){
        int mid=l+r>>1;
        if(check(mid))r=mid-1,ans=mid;
        else l=mid+1;
    }
    cout<<ans<<'\n';
    memset(prime,0,sizeof prime);
    memset(cnt,0,sizeof cnt);
}
signed main(){

    //ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
    //init();
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
View Code

 

完全图

思路:求所有边的贡献,对于一条边,过这条边的链的数目为:以这条边两端点为根节点的子节点数(包括自己)的乘积。

将所有边的次数排序,次数越大的权值越小

#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define int __int128
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e5+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;
int read()
{
    int res=0;
    char scan[1005];
    scanf("%s",scan);
    for(int i=0;i<strlen(scan);i++)
        res*=10,res+=scan[i]-'0';
    return res;
}

int n,m,mm;
bool check(int k){
    int b=n-k+1;
    int y=b*(b-1)/2;
    int le=mm-y;
    return le<=m;
}
void solve(){
    n=read(),m=read();
    mm=n*(n-1)/2;
    int l=1,r=n,ans;
    while(l<=r){
        int mid=l+r>>1;
        if(check(mid))ans=mid,l=mid+1;
        else r=mid-1;
    }
    cout<<(long long)ans<<'\n';
    return ;
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //init();
    T=read();
    while(T--){
        solve();
    }
    return 0;
}
View Code

 

A+B问题

思路:a和b的范围为 l~r,l= -2147483648 ,r=2147483647,且a+b=c;

定a1=l,b1=c-a1

定a2=r,b2=c-a2

答案为b1-b2+1=a2-a1+1

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e4+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;

//string s[25];
void solve(){
    /*int n,m,a,b;cin>>n>>m>>a>>b;
    for(int i=0;i<n;++i){
        cin>>s[i];
    }*/
    int n;cin>>n;
    int a1=-2147483648,a2=2147483647;
    int b1=n-a1,b2=n-a2;
    cout<<b1-b2+1;
}
//-2147483648 ~ 2147483647
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //init();
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
View Code

 

 树上求和

思路:求所有边的贡献,对于一条边,过这条边的链的数目为:以这条边两端点为根节点的子节点数(包括自己)的乘积。

将所有边的次数排序,次数越大的权值越小

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e5+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;
int h[N],ne[2*N],e[2*N],idx;
int cnt[N];
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int fa){
    cnt[u]=1;
    for(int i=h[u];i!=-1;i=ne[i]){
        int j=e[i];
        if(j==fa)continue;
        dfs(j,u);
        cnt[u]+=cnt[j];
    }
}
void solve(){
    int n;cin>>n;
    memset(h,-1,sizeof h);
    for(int i=1,u,v;i<n;++i){
        cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    dfs(1,0);
    vector<int>ve;
    for(int i=2;i<=n;++i){
        ve.push_back(cnt[i]*(n-cnt[i]));
    }
    sort(ve.begin(),ve.end(),greater<int>());
    int ans=0;
    for(int i=1;i<n;++i){
        ans+=i*ve[i-1];
    }
    cout<<ans;
}
signed main(){

    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
    //init();
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
View Code

 

奇怪的背包问题增加了

思路:230=2*229,229=2*228,...

可以搜索找到凑成230的所有数,找不到则impossible

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e5+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;

int have[35];
int cost[35];
int a[N];
bool dfs(int u,int c){
    if(u<0)return false;
    cost[u]=min(c,have[u]);
    if(have[u]>=c)return true;
    //if(u==0)return false;
    return dfs(u-1,(c-have[u])*2);
}
void solve(){
    int m;cin>>m;
    memset(have,0,sizeof have);
    memset(cost,0,sizeof cost);
    for(int i=0;i<m;++i){
        cin>>a[i];
        have[a[i]]++;
    }
    bool ok=dfs(30,1);
    if(!ok){
        cout<<"impossible\n";
    }else{
        for(int i=0;i<m;++i){
            if(cost[a[i]]){
                cout<<1;cost[a[i]]--;
            }else cout<<0;
        }cout<<'\n';
    }
    return ;
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //init();
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
View Code

 

寻找子串

思路:暴力枚举每种子串

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e4+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;

//string s[25];
void solve(){
    /*int n,m,a,b;cin>>n>>m>>a>>b;
    for(int i=0;i<n;++i){
        cin>>s[i];
    }*/
    string s;cin>>s;
    string ans="-1";
    for(int i=1;i<=s.size();++i){
        for(int j=0;j+i-1<s.size();++j){
            string a=s.substr(j,i);
            if(ans=="-1"||a>ans)ans=a;
        }
    }
    cout<<ans;
}
//-2147483648 ~ 2147483647
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //init();
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
View Code

 

最大的差

思路:排个序,首位就是相差最大的

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e4+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;

//string s[25];
void solve(){
    /*int n,m,a,b;cin>>n>>m>>a>>b;
    for(int i=0;i<n;++i){
        cin>>s[i];
    }*/
    int n;cin>>n;
    vector<int>a(n);
    for(int i=0;i<n;++i)cin>>a[i];
    sort(a.begin(),a.end());
    cout<<abs(a[n-1]-a[0]);
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //init();
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
View Code

 

标签:typedef,const,23,int,long,return,solve,暑假,友谊赛
From: https://www.cnblogs.com/bible-/p/17567404.html

相关文章

  • HDU 暑假多校 2023 第一场
    目录写在前面72837279727672757284写在最后写在前面补题地址:HDUOJ题库第63页,题号7275~7286。以下题号以题库中题号为准。题目选补,按照个人认为题目难度排序,因为我是菜狗。打这场看到马娘题目直接整个人兴奋,于是推了3h推不出来滚粗了。以为是手玩题没想到是正统博弈论呃......
  • SSO2.0 28-20230719
                      ......
  • 2023.7.19
    今天忙着做学校的实习报告和结束企业的实习任务,网安的东西晚上回来才看了一点。目前进度到了ret2dlresolvePartialRELRO的stage4(ctfwiki上的进度),之前发现那几个阶段大部分步骤都是类似的,所以在刚开始几个阶段把那几个东西(如栈迁移的第一步payload构建、第二步payload构建)弄懂......
  • 【专题】2023中国品牌消费趋势洞察报告PDF合集分享(附原数据表)
    报告链接:https://tecdat.cn/?p=33262原文出处:拓端数据部落公众号品牌是企业乃至国家竞争力的综合体现。在2016年6月20日,国务院办公厅发布了《关于发挥品牌引领作用推动供富结构升级的意见》,首次提出了设立“中国品牌日”的建议。站在时代变革的风口,中国品牌抓住了创新发展的机......
  • 2023.7.19
    早上起来,零零碎碎的就是雨声,起来收了衣服就看起了书,说实话,在雨天的家里点灯看书真的有那味了,感觉整个人都升华了,中午炒了鱼香肉丝,手艺不行了,酸得离谱,糖也方少了,下午写了会儿代码,晚上就休息了。......
  • 2023.7.19
    今天上午吃到了奶奶包的三鲜包子,很好吃!上午给男朋友发消息但是他的电脑被借去投屏演示了,直接社死一波(报意思呜呜)下午和好朋友一起玩了一会游戏,一边玩一边吐槽破事,被人热暴力了谁懂,真的心梗犯了晚上许久不见的好友上线啦,还是一如既往的搞笑今天还去写了实验报告!明天准备去练......
  • 20230629-可持久化数据结构 1
    20230629权值线段树P3369【模板】普通平衡树题目大意传送门Solution可以用平衡树实现但用权值线段树代码量更少且速度更快注意前驱和后继的写法H_W_Y-Coding#include<bits/stdc++.h>usingnamespacestd;#definelb(x)lower_bound(b+1,b+cnt+1,x)-bconstintm......
  • 20230626-树链剖分+点分治
    20230626重链剖分计算每个节点子树大小,判断出每个点的重儿子优先遍历重儿子连边,并且按照DFS序重新编号特点:每条重链上的点编号是连续的每个点为根的子树内所有点的编号是连续的$\to$线段树需求:对于树上两点\(x,y\)路径上的所有点进行操作必然不能避免的事情......
  • 20230705-动态规划DP 2
    20230705单调队列优化DPHDU3401Trade题目大意传送门有T天,第i天买股票花Api元,卖股票花Bpi元,最多能买Asi股,能卖Bsi股。任何时候股票持有量不得超过MaxP,且两个交易日至少要间隔W天。若开始时有无限块钱,最后最多能赚多少钱?(你都有无限块钱了怎么赚都不会增加啊)0<=W<T<......
  • 20230703-动态规划DP 1
    20230703热身题目求长度为n的合法括号序列有多少个,对\(10^9+7\)取模。\(n\)为偶数,\(n\le10^6\)。Solution可以维护一个栈遇到一个左括号就加入栈而遇到右括号时就取栈顶的左括号与它配对出栈一个合法序列需要保证:最后栈为空,即所有的左括号都和有括号配对了中间不能出......