2024 ICPC ShaanXi Provincial Contest
A. chmod
模拟
F. Try a try, AC is OK
gi&gj<=gi gi&gj<=gj
可以都交最大的,任意gi&gj<=gi<=gmax
M. Window Decoration
观察菱形周围从近到远的点,发现只有以四个点为中心的会相交,
加进来稳定增加2,相交就减少
先要去掉重复
#include<iostream>
using namespace std;
int n;
bool vis[100][100];
int dx[4]={1,0,-1,0};int dy[4]={0,1,0,-1};
int main(){
std::ios::sync_with_stdio(false);
double ans=0;
cin>>n;
while(n--){
int x,y;cin>>x>>y;
if(vis[x][y])continue;
vis[x][y]=1;ans+=2.0;
for(int k=0;k<4;k++){
int tx=x+dx[k];int ty=y+dy[k];
if(tx>=1&&tx<=99&&ty>=1&&ty<=99){
if(vis[tx][ty])ans-=0.5;
}
}
}
cout<<ans;
}
G. Disappearing Number
我直接数位dp板子,也可以模拟做,
以2为例,一位的有1个
两位的有12 22 32 42 共81+10个
三位的有818+100个
依次类推
C. Seats
#include<iostream>
using namespace std;
#include<vector>
#include<queue>
const int N=200010;
int n;
int a[N];int ind[N];
int vis[N];int pre[N];int f[N];
vector<int> G[N];
int ans=0;
bool flag=0;
void dfs(int u){
vis[u]=1;
for(auto v:G[u]){
if(vis[v]==1){
int t=u;int cnt=1;flag=1;
while(t!=v){
t=pre[t];cnt++;
}
//cout<<"get"<<cnt<<endl;
ans+=cnt;
}else if(vis[v]==0){
pre[v]=u;
dfs(v);
}
}
vis[u]=2;
}
int main(){
std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];ind[a[i]]++;
G[i].push_back(a[i]);
}
queue<int> q;
for(int i=1;i<=2*n;i++){if(!ind[i])q.push(i);
}for(int i=1;i<=2*n;i++)f[i]=1;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=1;
for(auto v:G[u]){
--ind[v];
f[v]=max(f[u]+1,f[v]);
if(ind[v]==0)q.push(v);
}
}
for(int i=n+1;i<=n+n;i++)ans+=f[i]-1;
for(int i=1;i<=n;i++)if(!vis[i])ans++;
cout<<ans;
}

浙公网安备 33010602011771号