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

  

原文地址:https://www.cnblogs.com/wang9897/p/8169208.html