codeforce #630 div2

A. Exercising Walk

\(t\)组数据,给定起始点\(x,y\)以及\(x\)\(y\)的合法范围\([x1,x2]\)\([y1,y2]\)
\(a\)表示向左走次数,\(b\)表示向右走次数,\(c\)表示向下走次数,\(d\)表示向上走次数
移动的顺序任意,任意一个状态不能超过\(x\)\(y\)的合法范围,能达到输出YES,否则NO
\(1 \leq t \leq 1000\)
\(0 \leq a,b,c,d \leq 10^{8}\)
\(-10^{8} \leq x1,y1,x2,y2 \leq 10^{8}\)
\(x\)\(y\)分别考虑,分别用+的减去-的,即得到相对差值,分别判断原点的\(x\)\(y\)是否合法,特判一下不能做移动的情况

Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
void solve(){
	bool flag=1;
	int a,b,c,d;
	cin>>a>>b>>c>>d;
	int x,y,x1,y1,x2,y2;
	cin>>x>>y>>x1>>y1>>x2>>y2;
	if(x==x1 && x1==x2) {
		if(a || b)
			flag=0;
	}
	if(y==y1 && y1==y2){
		if(c || d)
			flag=0;
	}
	int dx=b-a,dy=d-c;
	x+=dx;y+=dy;
	if(x1>x || x>x2 || y1>y || y>y2)
		flag=0;
	if(flag)
		puts("YES");
	else puts("NO");
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}

B. Composite Coloring

给定\(n\)个合数序列,选择 \(m \leq 11\) 个数字将整个序列染色,并且相同颜色的不互质
\(1 \leq t \leq 1000\)
\(1 \leq n \leq 1000\)
\(1 \leq a_{i} \leq 1000\)
因为是合数,必定有质因数,枚举的是约数,因为约数也是由质因数组成的,本质相同,把能被这个约数除的染同一种即可,
累计用的颜色的个数,和当前已经染色的个数,全部染色后break即可所以是\(O(n)\)

Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1010;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int a[N];
int n;
bool st[N];
int rec[N];
void solve(){
	memset(st,0,sizeof st);
	int n;
	cin>>n;
	int m=1;
	int mx=-1e4;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		mx=max(mx,a[i]);
	}
	int cnt=0;
	for(int i=2;i<=mx/i;i++){
		bool f=0;
		for(int j=1;j<=n;j++){
			if(!st[j])
				if(a[j]%i==0)
				{
					st[j]=true;
					rec[j]=m;
					f=1;
					cnt++;
				}
		}
		if(f)
			++m;
		if(cnt==n) break;
	}
	cout<<m-1<<endl;
	for(int i=1;i<=n;i++)
		cout<<rec[i]<<' ';
	cout<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}

C. K-Complete Word

给定一个字符串,要求满足长度为\(k\)的循环节,并且整个串是个回文串,不满足的可以进行替换,
求最少的操作次数
\(1 \leq t \leq 10^{5}\)
\(1 \leq n,k \leq 2\times 10^{5}\)
因为整个是个回文,且是k长度的循环节,所以最后的循环节k也是一个回文,对于每个循环节,
不同的字符数最多由\(\frac{k}{2}\)个,长度为k的区间中每一位置上出现最多的字符,
这一位就固定这个字符,保证了操作最少次数
trick:统计不用改变的用总的减去这个就是需要操作的
\(k\)为奇数的时候单独判断\(\frac{k}{2}+1\)

Code

#include <bits/stdc++.h>
#define ll long long
#define pci pair<int,int>
#define fi first
#define se second
using namespace std;
const int N=2e5+10;
char s[N];
int n,k;
int cnt[30];
int mid;
void solve(){
	cin>>n>>k;
	cin>>s;
	mid=k>>1;
	int ans=0;

	for(int i=0;i<mid;i++){
		memset(cnt,0,sizeof cnt);
		for(int j=0;j<n/k;j++){
			cnt[s[j*k+i]-'a']++;
			cnt[s[n-(j*k+i)-1]-'a']++;
		}
		int temp=0;
		for(int j=0;j<26;j++) temp=max(temp,cnt[j]);
		ans+=temp;
	}
	if(k&1){
		memset(cnt,0,sizeof cnt);
		for(int i=0;i<n/k;i++){
			cnt[s[i*k+mid]-'a']++;
		}
		int temp=0;
		for(int i=0;i<26;i++) temp=max(temp,cnt[i]);
		ans+=temp;
	}
	ans=n-ans;
	cout<<ans<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}
posted @ 2020-05-19 23:28  Hyx'  阅读(165)  评论(0编辑  收藏  举报