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;
}