## 题意
t组数据,给定起始点x,y以及x和y的合法范围[x1,x2]、[y1,y2],
a表示向左走次数,b表示向右走次数,c表示向下走次数,d表示向上走次数
移动的顺序任意,任意一个状态不能超过x和y的合法范围,能达到输出YES,否则NO
t ∈ [1,1e3]
a,b,c,d ∈ [0,1e8]
x1,y1,x2,y2 ∈ [-1e8,1e8]
## 题解
x和y分别考虑,分别用+的减去-的,即得到相对差值,分别判断原点的x和y是否合法,
特判一下不能做移动的情况
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 void solve(){ 5 bool flag=1; 6 int a,b,c,d; 7 cin>>a>>b>>c>>d; 8 int x,y,x1,y1,x2,y2; 9 cin>>x>>y>>x1>>y1>>x2>>y2; 10 if(x==x1 && x1==x2) { 11 if(a || b) 12 flag=0; 13 } 14 if(y==y1 && y1==y2){ 15 if(c || d) 16 flag=0; 17 } 18 int dx=b-a,dy=d-c; 19 x+=dx;y+=dy; 20 if(x1>x || x>x2 || y1>y || y>y2) 21 flag=0; 22 if(flag) 23 puts("YES"); 24 else puts("NO"); 25 } 26 int main(){ 27 int t; 28 cin>>t; 29 while(t--){ 30 solve(); 31 } 32 }
## 题意
给定n个合数序列,选择 m ≤ 11 个数字将整个序列染色,并且相同颜色的不互质
t ∈ [1,1000]
n ∈ [1,1000]
∀ ai ∈ [1,1000]
## 题解
因为是合数,必定有质因数,枚举的是约数,因为约数也是由质因数组成的,本质相同,把能被这个约数除的染同一种即可,
累计用的颜色的个数,和当前已经染色的个数,全部染色后break即可所以是O(n)
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int N=1010; 5 int gcd(int a,int b){return b?gcd(b,a%b):a;} 6 int a[N]; 7 int n; 8 bool st[N]; 9 int rec[N]; 10 void solve(){ 11 memset(st,0,sizeof st); 12 int n; 13 cin>>n; 14 int m=1; 15 int mx=-1e4; 16 for(int i=1;i<=n;i++) 17 { 18 cin>>a[i]; 19 mx=max(mx,a[i]); 20 } 21 int cnt=0; 22 for(int i=2;i<=mx/i;i++){ 23 bool f=0; 24 for(int j=1;j<=n;j++){ 25 if(!st[j]) 26 if(a[j]%i==0) 27 { 28 st[j]=true; 29 rec[j]=m; 30 f=1; 31 cnt++; 32 } 33 } 34 if(f) 35 ++m; 36 if(cnt==n) break; 37 } 38 cout<<m-1<<endl; 39 for(int i=1;i<=n;i++) 40 cout<<rec[i]<<' '; 41 cout<<endl; 42 } 43 int main(){ 44 int t; 45 cin>>t; 46 while(t--){ 47 solve(); 48 } 49 }
## 题意
给定一个字符串,要求满足长度为k的循环节,并且整个串是个回文串,不满足的可以进行替换,
求最少的操作次数
t ∈ [1,1e5]
n,k ∈ [1,2e5]
数据保证了所有的n的和 ≤2e5
## 题解
因为整个是个回文,且是k长度的循环节,所以最后的循环节k也是一个回文,对于每个循环节,
不同的字符数最多由k/2个,长度为k的区间中每一位置上出现最多的字符,
这一位就固定这个字符,保证了操作最少次数
trick统计不用改变的用总的减去这个就是需要操作的
k为奇数的时候单独判断k/2+1
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define pci pair<int,int> 4 #define fi first 5 #define se second 6 using namespace std; 7 const int N=2e5+10; 8 char s[N]; 9 int n,k; 10 int cnt[30]; 11 int mid; 12 void solve(){ 13 cin>>n>>k; 14 cin>>s; 15 mid=k>>1; 16 int ans=0; 17 18 for(int i=0;i<mid;i++){ 19 memset(cnt,0,sizeof cnt); 20 for(int j=0;j<n/k;j++){ 21 cnt[s[j*k+i]-'a']++; 22 cnt[s[(j+1*k-1-i)]-'a']++; 23 } 24 int temp=0; 25 for(int j=0;j<26;j++) temp=max(temp,cnt[j]); 26 ans+=temp; 27 } 28 if(k&1){ 29 memset(cnt,0,sizeof cnt); 30 for(int i=0;i<n/k;i++){ 31 cnt[s[i*k+mid]-'a']++; 32 } 33 int temp=0; 34 for(int i=0;i<26;i++) temp=max(temp,cnt[i]); 35 ans+=temp; 36 } 37 ans=n-ans; 38 cout<<ans<<endl; 39 } 40 int main(){ 41 int t; 42 cin>>t; 43 while(t--){ 44 solve(); 45 } 46 return 0; 47 }