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