CF501

CF501A

水题。实际难度为红题的黄题。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline 
#define int ll
#define gc getchar
#define pc putchar
const int N=1e6+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=1e6+3;
inl int read(){
    int 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,a,b,c,d;
signed main(){
    a=read();b=read();c=read();d=read();
    int x=max(3*a/10,a-a/250*c),y=max(3*b/10,b-b/250*d);
    puts(x==y?"Tie":x<y?"Vasya":"Misha");
    return 0;
}

CF501B

map或其他数据结构模拟一下就行。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline 
#define int ll
#define gc getchar
#define pc putchar
const int N=1e6+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=1e6+3;
inl int read(){
    int 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;
string s1,s2;
map<string,string>mp;
bool operator<(pair<string,string>a,pair<string,string>b){
    return a.second<b.second;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n;
    while(n--){
        cin>>s1>>s2;
        if(mp.find(s1)!=mp.end()){
            mp[s2]=mp[s1];
            mp.erase(s1);
        }else{
            mp[s2]=s1;
        }
    }
    cout<<mp.size()<<endl;
    for(auto i:mp)
        cout<<i.second<<' '<<i.first<<endl;
    return 0;
}

CF501C

对于度数为1的叶子节点 异或和即为唯一连接的点

那么对这个点删除当前点影响 然后类似拓扑排序一下就行

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline 
#define int ll
#define gc getchar
#define pc putchar
const int N=1e6+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=1e6+3;
inl int read(){
    int 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,cnt[N],sum[N],q[N],h,t=1;
vector<pair<int,int>>v;
signed main(){
    n=read();
    for(int i=0;i<=n-1;i++)cnt[i]=read(),sum[i]=read();
    for(int i=0;i<=n-1;i++)if(cnt[i]==1)q[++h]=i;
    while(h>=t){
        int x=q[t++];
        if(!cnt[x])continue;
        v.push_back({x,sum[x]});
        sum[sum[x]]^=x;
        cnt[sum[x]]--;
        if(cnt[sum[x]]==1)q[++h]=sum[x];
    }
    writel(v.size());
    for(auto i:v)writei(i.first),writel(i.second);
    return 0;
}

CF501D

康拓展开:排序的字典序的排名-1

\[f(x)=\sum\limits_{i=1}^n a[i]\times (n-i)! \]

对于前两个序列 求出对应的 \(a\) 序列 (\(n\) 太大求不出来准确值)

类似进位的方式 可以求出二者合起来的康拓展开值

然后树状数组二分就能求出原序列

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline 
#define int ll
#define gc getchar
#define pc putchar
const int N=1e6+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=1e6+3;
inl int read(){
    int 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,a[N],b[N],c[N],f[N],vis[N],res[N],fa[N];
inl void add(int x,int v){
    for(;x<=n;x+=x&-x)c[x]+=v;
}
inl int query(int x){
    int ans=0;
    for(;x;x-=x&-x)ans+=c[x];
    return ans;
}
inl int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
signed main(){
    n=read();
    for(int i=1;i<=n;i++){
        a[i]=read()+1;
        f[i]+=(a[i]-query(a[i]))-1;
        add(a[i],1);
    }
    memset(c,0,sizeof c);
    for(int i=1;i<=n;i++){
        b[i]=read()+1;
        f[i]+=(b[i]-query(b[i]))-1;
        add(b[i],1);
    }
    memset(c,0,sizeof c);
    for(int i=n;i;i--){
        f[i-1]+=f[i]/(n-i+1);
        f[i]%=(n-i+1);
    }
    for(int i=1;i<=n;i++)add(i,1);
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=n;i++){
        int p=0,ans=0;
        for(int j=20;~j;j--){
            if(p+(1<<j)>n)continue;
            if(ans+c[p+(1<<j)]>f[i]+1)continue;
            ans+=c[p+(1<<j)];p+=(1<<j);
        }
        p=find(p);res[i]=p-1;fa[p]=p-1;
        add(p,-1);
    }
    for(int i=1;i<=n;i++)writei(res[i]);
    return 0;
}
posted @ 2023-11-23 16:23  xiang_xiang  阅读(6)  评论(0编辑  收藏  举报