Codeforces Round 874 (Div. 3)

昨天晚上打的这场比赛3....

4万人排6000???不知道好不好...但是感觉整场比赛没有感觉做的很爽..有些东西没有证明就写了,感觉莫名奇妙的就对了...

感觉自己打比赛的时候很容易把问题复杂化..

比如D题我写了1个半小时..

200多行,也改了好久就是没出来...

但是自己的思路是完全正确的,还是自己的码力不行啊,或者说是自己简化问题的能力不足

Problem - D - Codeforces

比赛中我考虑了2种情况

1.最大值不在第一位:

又细分两种情况:

1.在最后,可以只颠倒n或者颠倒 left到n-1,left的范围为1到n-1

2.在中间  颠倒left到pos-1,left的范围为left-1,pos为n的位置

2.如果最大值在第一位,那么我们可以考虑第二大的数:

情况跟上面一样

然后我就是不会写代码....哭了...

我第一知道vector还可以用max函数比较大小的啊

find(a.begin(),a.end(),s)-a.begin()

到s的位置,不是迭代器

主要操作函数...返回值是vector...这我没想到...’

我写的是用数组来比较大小的...

写的异常麻烦...

vector op(vector v,int x,int y){ 
	vectorans;
	
	for(int i=y+1;i=x;i--){
		ans.push_back(v[i]);
	}
	
	for(int i=0;i
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 
#include 
using namespace std;
typedef  long  long ll ;
typedef  unsigned long  long ull ;
#define pii pair
const int inf = 0x3f3f3f3f;//106110956
inline int read(){
    int x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9'){
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9'){
        x = (x<<1) + (x<<3) + (ch^48);
        ch = getchar();
    }
    return x * f;
}
void print(__int128 num) {
	if(num) {
		print(num/10);
		putchar(num%10+'0');
	}
}
int t; 
int n;
vector op(vector v,int x,int y){ 
	vectorans;
	
	for(int i=y+1;i=x;i--){
		ans.push_back(v[i]);
	}
	
	for(int i=0;ia(n+5),ans;
		for(int i=0;i>a[i];
		}
		
		//ans=op(a,0,n-1);
		
		int pos=find(a.begin(),a.end(),n)-a.begin();
		
		if(pos==0){
			pos=find(a.begin(),a.end(),n-1)-a.begin();
		}
		
		
		
		for(int i=0;i

Problem - E - Codeforces

挺有意思的一道题..

最大的组数很容易观察,就是看有多少个fa呗

但是最小的组数就很难了

一开始我以为只要每个组里面的人>=3,就不能加入人了

但是发现过不了样例

又想了想

发现只要不是环或者组里面的人数==2就可以加人,他们可以划为一组

一开始写的递归一直出错..运行不对,结果是有环的情况

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 
#include 
using namespace std;
typedef  long  long ll ;
typedef  unsigned long  long ull ;
#define pii pair
const int inf = 0x3f3f3f3f;//106110956
inline int read(){
    int x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9'){
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9'){
        x = (x<<1) + (x<<3) + (ch^48);
        ch = getchar();
    }
    return x * f;
}
void print(__int128 num) {
	if(num) {
		print(num/10);
		putchar(num%10+'0');
	}
}
int t;
int n;
int fa[200005];
int vis[200005];
vectorson[200005];
int flag;
int find(int x){
	if(x!=fa[x]){
		fa[x]=find(fa[x]);
	}
	return fa[x];
}
void merge(int x,int y){
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy){
		fa[fx]=fy; 
	}
}
void dfs(int point ,int pre,int start){
	for(int i=0;imp;
		
		for(int i=1;i<=n;i++){
			int x=find(i);
			mp[x]++;
		}
		
		int  cnt1=0;
		int cnt2=0;
		int ans=0;
		
		for(auto it =mp.begin();it!=mp.end();it++){
				flag=0;
				dfs(it->first,0,it->first);
				
				if(flag==0){
					cnt1++;
				}else{
					cnt2++;
				}
		}
		
		if(cnt1>=1){
			ans=ans+1;
		}
		
		printf("%d ",ans+cnt2);
		cout<

你可能感兴趣的:(算法,笔记,c++)