• Educational Codeforces Round 35 (Rated for Div. 2)


    A

    题意: 找出最小值之间最小的标号差

    #include <bits/stdc++.h>
    #define ll long long
    #define N 100005
    #define INF 0x3f3f3f3f
    using namespace std;
    typedef struct node{
    	ll vul;int x;
    	friend bool operator <(node aa,node bb){
    		if(aa.vul==bb.vul) return aa.x<bb.x;
    		return aa.vul<bb.vul;
    	}
    }node;
    node a[N];
    int main(){
    	ios::sync_with_stdio(false);
    	int n;cin>>n;
    	for(int i=1;i<=n;i++) {
    	cin>>a[i].vul;a[i].x=i;}
    	sort(a+1,a+n+1);
    	int minn=INF;
    	for(int i=2;i<=n;i++){
    		if(a[i].vul!=a[i-1].vul) break;
    		minn=min(minn,a[i].x-a[i-1].x);
    	}
    	cout<<minn<<endl;
    	return 0;
    }
    

    B

    题意:给你两块蛋糕分成n份 问怎么分使所有人蛋糕的最小值最大 要求 同一个人来的蛋糕只能来自同一份

    #include <bits/stdc++.h>
    using namespace std;
    int n,a,b;
    bool check(int mid){
    	int t=a/mid;int tt=b/mid;
    	if(t==0||tt==0) return false;
    	if(t+tt>=n) return true;
    	else return false;
    }
    int main(){
    	ios::sync_with_stdio(false);
    	cin>>n>>a>>b;
    	int l=1;int r=max(a,b);
    	int ans;
    	while(l<=r){
    		int mid=(l+r)>>1;
    		if(check(mid)) {
    			ans=mid;l=mid+1;
    		}
    		else r=mid-1;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

    C

    题意:打表题  特判几种情况就行(证明可以通过数学归纳法证明

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
    	ios::sync_with_stdio(false);
    	int t1,t2,t3;cin>>t1>>t2>>t3;
    	if(t1==1||t2==1||t3==1){
    		cout<<"YES"<<endl; 
    	}
    	else if(t1==3&&t2==3&&t3==3) cout<<"YES"<<endl;
    	else{
    		int cnt=0;
    		if(t1==2) cnt++;
    		if(t2==2) cnt++;
    		if(t3==2) cnt++;
    		int cnt1=0;
    		if(t1==4) cnt1++;
    		if(t2==4) cnt1++;
    		if(t3==4) cnt1++;
    		if(cnt>=2||(cnt1==2&&cnt==1)) cout<<"YES"<<endl;
    		else cout<<"NO"<<endl; 
    	}
    	return 0;
    }
    

    D

    题意:问交换[l,r]区间的内的数后 整个区间的逆序对个数为奇数还是偶数

    #include <bits/stdc++.h>
    int a[1505];
    using namespace std;
    int main(){
    	ios::sync_with_stdio(false);
    	int n;cin>>n;
    	for(int i=1;i<=n;i++) cin>>a[i];
    	int cnt=0;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<i;j++){
    			if(a[j]>a[i]) cnt++;
    		}
    	}
    	bool flag;
    	if(cnt%2) flag=1;
    	else flag=0;
    	int m;cin>>m;
    	int l,r;
    	//cout<<flag<<endl;
    	for(int i=1;i<=m;i++){
    		cin>>l>>r;
    		int t=(r-l+1)/2;
    		if(t%2){
    			if(flag==1) flag=0;
    			else flag=1;
    		}
    		if(flag) cout<<"odd"<<endl;
    		else cout<<"even"<<endl;
    	}
    	return 0;
    }
    

    E

    题意:按题意模拟即可

    #include <bits/stdc++.h>
    #define N 400005
    using namespace std;
    stack<int>s;
    int a[N],n,m,ans[N],x,y,cnt;
    bool vis[N];
    int main(){
    	cin>>n>>m;
    	for(int i=1;i<=m;i++) cin>>a[i];
    	for(int i=1;i<=m;i++) vis[a[i]]++;
    	for(int i=1;i<=m;i++){
    		while(s.empty()||s.top()>a[i]) s.push(a[i]),i++;
    		if(i<=m){
    			while(!s.empty()&&s.top()<a[i]){
    				if(s.top()!=cnt+1){printf("-1
    ");return 0;}
    				ans[++cnt]=a[i];s.pop();
    			}
    			s.push(a[i]);
    		}
    	}
    	x=1;
    	cnt=m;
    	for(int i=1;i<=m;i++) ans[i]=a[i];
    	int flag=0;
    	while(cnt<n){
    		if(!s.empty()){
    			y=s.top();
    			for(int i=y;i>=x;i--) {
    			if(!vis[i])ans[++cnt]=i;}
    			x=y+1;s.pop();
    		}else{
    			for(int i=n;i>=x;i--) {
    			if(!vis[i])ans[++cnt]=i;}
    			if(cnt<n){printf("-1
    ");flag=1;break;}
    		}
    	}
    	if(flag==0){
    	for(int i=1;i<n;i++) printf("%d ",ans[i]);
    	printf("%d
    ",ans[n]);}
    	return 0;
    }
    

    F:

    题解:构造一条直径(直径的构造 从任意一点出发找最远的点 然后从这个点找最远的点 这两个点就是直径的端点) 然后对于不在直径上点按照度进行删除即可

    #include <bits/stdc++.h>
    #define N 200005
    #define ll long long
    using namespace std;
    int read(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
        return f*x;
    }
    
    
    
    
    
    vector<int>vec[N];
    vector<pair<int,int> >v;
    int tt,mx_tt,t1,t2,n;
    bool vis[N];
    int dis[N],dis1[N];int fa[N],fa1[N];
    stack<int>s1;stack<int>s2;
    int du[N];
    void dfs(int u,int pre,int dep){
    	if(tt<dep){
    		tt=dep;mx_tt=u;
    	}
    	for(int i=0;i<vec[u].size();i++){
    		if(vec[u][i]!=pre){
    			dfs(vec[u][i],u,dep+1);
    		}
    	}
    }
    void bfs(int t){
    	queue<int>que;que.push(t);
    	fa[t]=-1;
    	memset(dis,0,sizeof(dis));
    	while(!que.empty()){
    		int p=que.front();que.pop();
    		for(int i=0;i<vec[p].size();i++){
    			if(vec[p][i]!=fa[p]){
    				fa[vec[p][i]]=p;
    				dis[vec[p][i]]=dis[p]+1;
    				que.push(vec[p][i]);
    			} 	
    		}
    	}
    	tt=-1;
    	for(int i=1;i<=n;i++){
    		if(tt<dis[i]){
    			tt=dis[i];t2=i;
    		}
    	}
    	int ttt=t2;
    	while(ttt!=-1){
    		vis[ttt]=1;
    		ttt=fa[ttt];
    	}
    	return ;
    }
    void bfs2(int t){
    	queue<int>que;que.push(t);
    	memset(dis1,0,sizeof(dis1));
    	fa1[t]=-1;
    	while(!que.empty()){
    		int p=que.front();que.pop();
    		for(int i=0;i<vec[p].size();i++){
    			if(vec[p][i]!=fa1[p]){
    				dis1[vec[p][i]]=dis1[p]+1;
    				fa1[vec[p][i]]=p;
    				que.push(vec[p][i]);
    			} 	
    		}
    	}
    	return ;
    }
    int main(){
    	//ios::sync_with_stdio(false);
    	n=read();
    	for(int i=1;i<n;i++){
    		t1=read();t2=read();
    		vec[t1].push_back(t2);
    		vec[t2].push_back(t1);
    		du[t1]++;du[t2]++;
    	}
    	tt=-1;
    	dfs(1,-1,1);
    	t1=mx_tt;
    	bfs(t1);
    	bfs2(t2);
    	queue<int>que;
    	for(int i=1;i<=n;i++){
    		if(vis[i]==0&&du[i]==1) que.push(i);
    	}
    	//cout<<t1<<" "<<t2<<endl;
    	ll ans=0;
    	while(!que.empty()){
    		int p=que.front();que.pop();
    		ans+=max(dis[p],dis1[p]);
    		if(dis[p]>=dis1[p]){
    			 v.push_back(make_pair(t1,p));
    		}
    		else v.push_back(make_pair(t2,p));
    		for(int i=0;i<vec[p].size();i++){
    			du[vec[p][i]]--;
    			if(du[vec[p][i]]==1&&vis[vec[p][i]]==0) que.push(vec[p][i]);
    		}
    	}
    	int ttt=t2;
    	while(fa[ttt]!=-1){
    		ans+=dis[ttt];
    		v.push_back(make_pair(t1,ttt));
    		ttt=fa[ttt];
    	}
    	printf("%I64d
    ",ans);
    	for(int i=0;i<v.size();i++){
    		//cout<<v[i].first<<" "<<v[i].second<<" "<<v[i].second<<endl;
    		printf("%d %d %d
    ",v[i].first,v[i].second,v[i].second);
    	}
    	return 0;
    }
    

    G

    #include <bits/stdc++.h>
    #define N 200005
    using namespace std;
    typedef struct node{
    	int cnt[101];
    }node;
    node d[N*6];
    int vis[N];
    int n,m;
    int t1,t2;
    int read(){
    	int x=0,f=1;char ch=getchar();
    	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    	while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    	return f*x;
    }
    void push(int root){
    	for(int i=1;i<101;i++){
    		d[root<<1].cnt[i]=d[root].cnt[d[root<<1].cnt[i]];
    		d[root<<1|1].cnt[i]=d[root].cnt[d[root<<1|1].cnt[i]];
    	}
    	for(int i=1;i<101;i++) d[root].cnt[i]=i;
    }
    void built(int root,int l,int r){
    	push(root); 
    	if(l==r){
    		return ;
    	}
    	int mid=(l+r)>>1;
    	built(root<<1,l,mid);
    	built(root<<1|1,mid+1,r);
    }
    void update(int root,int l,int r,int l1,int r1,int t,int e){
    	if(l<=l1&&r1<=r){
    		for(int i=1;i<101;i++){
    			if(d[root].cnt[i]==t) d[root].cnt[i]=e;
    		}
    		return ;
    	}
    	int mid=(l1+r1)>>1;
    	push(root);
    	if(l<=mid) update(root<<1,l,r,l1,mid,t,e);
    	if(r>mid) update(root<<1|1,l,r,mid+1,r1,t,e);
    }
    void querty2(int root,int l,int r){
    	if(l==r){
    		if(d[root].cnt[vis[l]]!=vis[l]) vis[l]=d[root].cnt[vis[l]]; 
    		return ;
    	}
    	int mid=(l+r)>>1;
    	push(root);
        querty2(root<<1,l,mid);
    	querty2(root<<1|1,mid+1,r);
    }
    int main(){
    	n=read();
    	int ch,ch1;
    	for(int i=1;i<=n;i++){
    		ch=read();
    		vis[i]=ch;
     	}
     	built(1,1,n);int l,r;
    	 m=read();
     	for(int i=1;i<=m;i++){
     		l=read();r=read();ch=read();ch1=read();
    		update(1,l,r,1,n,ch,ch1);
    	 }
    		querty2(1,1,n);	
    		for(int i=1;i<=n;i++){
    		if(i==1) printf("%d",vis[i]);
    		else printf(" %d",vis[i]);
    	}
    //	puts("");
    	return 0;
    }
    

      

  • 相关阅读:
    每天1题算法题(4)-合并二叉树 (√)
    每天1题算法题(3)-二叉树的最大深度 (√)
    每天1题算法题(2)-二叉树的层序遍历
    每天1题算法题(1)-二叉树的中序遍历
    uni-app登录页白屏
    uni-app真机运行顶部导航栏右边按钮显示不全的问题处理
    uni-app强制横屏设置
    uni-app离线打包步骤
    银行数据仓库体系实践(18)--数据应用之信用风险建模
    银行数据仓库体系实践(17)--数据应用之营销分析
  • 原文地址:https://www.cnblogs.com/wang9897/p/8169208.html
Copyright © 2020-2023  润新知