Codeforce #630 div2

# A.Exercising Walk

  ## 题意

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 }

# B. Composite Coloring

  ## 题意

给定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 }

# C. K-Complete Word

  ## 题意

给定一个字符串,要求满足长度为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 }

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12624173.html
今日推荐