CF546

CF546A

暴力模拟。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define int ll
#define gc cin.get
#define pc cout.put
const int N=1e7+5;
const int M=3e7+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl ll read(){
    ll x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n,k,w;
signed main(){
    k=read(),n=read(),w=read();
    cout<<max(0ll,k*w*(w+1)/2-n)<<endl;
    return 0;
}

CF546B

显然的贪心做法:排序后对每个数不停加 加到刚好比前一个大一

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define int ll
#define gc cin.get
#define pc cout.put
const int N=1e7+5;
const int M=3e7+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl ll read(){
    ll x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n,k,w,a[N],ans;
signed main(){
    n=read();
    for(int i=1;i<=n;i++)a[i]=read();
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
        while(a[i]<=a[i-1])a[i]++,ans++;
    cout<<ans<<endl;
    return 0;
}

CF546C

注意到 \(n\) 很小,开两个队列暴力模拟。
当次数 \(\le 10^6\) 退出 判定无解即可

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define int ll
#define gc cin.get
#define pc cout.put
const int N=1e7+5;
const int M=3e7+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl ll read(){
    ll x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int n,k1,k2,cnt;
queue<int>q1,q2;
signed main(){
    n=read();
    k1=read();for(int i=1;i<=k1;i++)q1.push(read());
    k2=read();for(int i=1;i<=k2;i++)q2.push(read());
    while(++cnt<1e6){
        int x=q1.front(),y=q2.front();
        q1.pop();q2.pop();
        if(x<y)q2.push(x),q2.push(y);
        else q1.push(y),q1.push(x);
        if(q1.empty()){cout<<cnt<<' '<<2<<endl;return 0;}
        if(q2.empty()){cout<<cnt<<' '<<1<<endl;return 0;}
    }
    cout<<-1<<endl;
    return 0;
}

CF546D

曾尝试过分块打表 因CF代码大小限制不超过10KB而告终
注意到要求的是 \(\prod\limits_{i=a_i+1}^{b_i}i\) 分解出的质因数的数量之和
显然 可以线性筛+前缀和预处理 \(O(1)\) 求出
对于每个数的答案

  • 如果是质数 那么答案为 \(1\)
  • 否则线性筛时 \(f[i*primes[j]]=f[i]+f[primes[j]]\)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define int ll
#define gc cin.get
#define pc cout.put
const int N=1e7+5;
const int M=3e7+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl ll read(){
    ll x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,a,b,res[N],primes[N],cnt,vis[N];
inl void init(){
    for(int i=2;i<=5e6;i++){
        if(!vis[i])res[i]=1,primes[++cnt]=i;
        for(int j=1;j<=cnt&&i*primes[j]<=5e6;j++){
            vis[i*primes[j]]=1;
            res[i*primes[j]]=res[i]+res[primes[j]];
            if(!(i%primes[j]))break;
        }
    }
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    t=read();init();
    for(int i=2;i<=5e6;i++)res[i]+=res[i-1];
    while(t--){
        b=read();a=read();
        cout<<res[b]-res[a]<<endl;
    }
    return 0;
}

CF546E

最先想到模拟费用流那题 是不是美酒了
显然的网络流:从源点连容量为 \(a_i\) 的边 向汇点连 \(b_i\) 的边
对于不好操作的只能流到附近的点 可以经典操作拆点
很坑的点:只有 \(\sum\limits a_i = \sum\limits b_i\) 才有解

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define gc cin.get
#define pc cout.put
const int N=2e2+5;
const int M=1e5+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl ll read(){
    ll x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int n,m,s,t,dis[N],cur[N],maxflow,sum,ans[N][N];
int head[N],nxt[M],to[M],w[M],cnt=1;
inl void add(int u,int v,int wi){
    nxt[++cnt]=head[u];to[cnt]=v;w[cnt]=wi;head[u]=cnt;
    nxt[++cnt]=head[v];to[cnt]=u;w[cnt]=0;head[v]=cnt;
}
queue<int>q;
inl bool bfs(){
    memset(dis,0,sizeof dis);
    memcpy(cur,head,sizeof cur);
    dis[s]=1;q.push(s);
    while(!q.empty()){
        int x=q.front();q.pop();
        for(int i=head[x];i;i=nxt[i]){
            int y=to[i],wi=w[i];
            if(wi&&!dis[y]){
                dis[y]=dis[x]+1;
                q.push(y);
            }
        }
    }
    return dis[t];
}
inl int dfs(int x,int flow){
    if(x==t)return maxflow+=flow,flow;
    int used=0;
    for(int &i=cur[x];i;i=nxt[i]){
        int y=to[i],wi=w[i];
        if(wi&&dis[y]==dis[x]+1){
            if(int rlow=dfs(y,min(wi,flow-used))){
                w[i]-=rlow;w[i^1]+=rlow;
                used+=rlow;
                if(used==flow)break;
            }
        }
    }
    return used;
}
inl void dinic(){while(bfs())dfs(s,inf);}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    n=read();m=read();s=(n<<1)+1,t=s+1;
    int tot=0;
    for(int i=1;i<=n;i++){
        int wi=read();tot+=wi;
        add(s,i,wi);
    }
    for(int i=1;i<=n;i++)add(i,i+n,inf);
    for(int i=1;i<=n;i++){
        int wi=read();sum+=wi;
        add(i+n,t,wi);
    }
    if(tot^sum){cout<<"NO"<<endl;return 0;}
    for(int i=1;i<=m;i++){
        int u=read(),v=read();
        add(u,v+n,inf);add(v,u+n,inf);
    }
    dinic();
    if(maxflow^sum){cout<<"NO"<<endl;return 0;}
    cout<<"YES"<<endl;
    for(int x=1;x<=n;x++){
        for(int i=head[x];i;i=nxt[i]){
            int y=to[i],wi=w[i];
            if(i&1)continue;
            ans[x][y-n]=inf-wi;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            cout<<ans[i][j]<<' ';
        cout<<endl;
    }
    return 0;
}
posted @ 2023-12-07 12:23  xiang_xiang  阅读(8)  评论(0编辑  收藏  举报