Codeforces-Round#589 Div2

A题 Distinct Digits

题解:

暴力水题

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int f[10];
 4 bool judge(int x)
 5 {
 6     memset(f,0,sizeof(f));
 7     while(x){
 8         f[x%10]++;
 9         if(f[x%10]>1)return false;
10         x/=10;
11     }
12     return true;
13 }
14 int main()
15 {
16     memset(f,0,sizeof(f));
17     int l,r;cin>>l>>r;
18     for(int i=l;i<=r;i++)
19     {
20         if(judge(i)){
21             cout<<i<<endl;
22             return 0;
23         }
24     }
25     cout<<-1<<endl;
26     return 0;
27 }

B题 Filling the Grid

题解:

模拟水题,先按列放置黑色格子,外围一圈放上白色格子,

再按行放置黑色格子,若冲突则不成立。

 1 #include<bits/stdc++.h>
 2 #define MAXN 2000
 3 #define ll long long
 4
 5 using namespace std;
 6 const int MOD=1000000007;
 7 int dp[2000][2000];
 8 int main()
 9 {
10     vector<int>r,c;
11     for(int i=0;i<MAXN;i++)
12     for(int j=0;j<MAXN;j++)
13         dp[i][j]=2;
14     int h,w;cin>>h>>w;
15     for(int i=0;i<h;i++)
16     {
17         int num;cin>>num;
18         for(int j=1;j<=num;j++)
19         {
20             dp[i+1][j]=1;
21         }
22         dp[i+1][num+1]=0;
23     }
24     for(int i=0;i<w;i++)
25     {
26         int num;cin>>num;
27         for(int j=1;j<=num;j++)
28         {
29             if(dp[j][i+1]==0){
30                 cout<<0<<endl;
31                 return 0;
32             }
33             dp[j][i+1]=1;
34         }
35         if(dp[num+1][i+1]==1){
36             cout<<0<<endl;
37             return  0;
38         }
39         else dp[num+1][i+1]=0;
40     }
41     ll ans=1;
42     for(int i=1;i<=h;i++)
43     {
44         for(int j=1;j<=w;j++)
45         {
46             if(dp[i][j]==0)continue;
47             ans=(ans*dp[i][j])%MOD;
48         }
49     }
50     cout<<ans%MOD<<endl;
51     return 0;
52 }

C题 Primes and Multiplication

题解:

求n范围内质因子的个数和的次方的乘积

先求出x的质因子,然后从1-n范围内求出质因子的k次方的和

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3
 4 using namespace std;
 5 const ll MOD=1000000007;
 6 ll n,x;
 7 ll result  = 1;
 8 vector<int>prime;
 9 vector<ll> factor(ll n){
10     vector<ll>f;
11     for(ll i=2;i*i<=n;i++)
12         if(n%i==0)
13         {
14             f.push_back(i);
15             while(n%i==0)
16                     n/=i;
17         }
18
19     if(n>1)
20         f.push_back(n);
21     return f;
22 }
23 ll q_pow(ll a,ll b){
24     ll sum=1%MOD;
25     a%=MOD;
26         while(b)
27         {
28             if(b&1)
29                 sum=(sum*1ll*a)%MOD;
30             a=a*1ll*a%MOD;
31             b>>=1;
32         }
33     return sum;
34 }
35 int main()
36 {
37     cin>>x>>n;
38     vector<ll>prime=factor(x);//求质因子
39     ll ans=1;
40     for(int i = 0; i<prime.size(); i++)
41     {
42         ll nn=n;
43         while(nn>=prime[i]){
44             // cout<<nn/prime[i]<<endl;
45             ans=ans*q_pow(prime[i],nn/prime[i])%MOD;
46             // cout<<ans<<endl;
47             nn/=prime[i];
48         }
49     }
50     cout << ans%MOD << endl;
51
52     return 0;
53 }

D题 Complete Tripartite

题解:

暴力染色,先把所有的点放在集合1,遍历所有的点,颜色相同的联通点,把后一个点放入color++的集合。

判断:3个集合均有点,且没有点放在集合4;点图互相连通,即强连通图,m=v1*v2+v2*v3+v3*v1

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define MAXN 100010
 4 // typedef struct{
 5 //     int from,to;
 6 //     int next,color;
 7 // }EDGE;
 8 // EDGE edges[MAXN];
 9 typedef struct{
10     int u,color;
11     set<int>v;
12 }NODE ;
13 NODE nodes[MAXN];
14 int cnt=1,n,m;
15 int head[MAXN];
16 void add(int u,int v)
17 {
18     nodes[u].v.insert(v);
19     nodes[v].color=2;
20 }
21 int main()
22 {
23     cin>>n>>m;
24     for(int i=0;i<m;i++)
25     {
26         int a,b;scanf("%d%d",&a,&b);
27         add(a,b);
28         add(b,a);
29     }
30     for(int i=0;i<MAXN;i++)
31         nodes[i].color=1;
32     for(int i=1;i<=n;i++){
33         for(int j:nodes[i].v){
34             if(nodes[i].color==nodes[j].color)
35             {
36                 nodes[j].color++;
37             }
38         }
39     }
40     int a[4]={0,0,0,0};
41     for(int i=1;i<=n;i++){
42         a[nodes[i].color]++;
43         if(nodes[i].color>3||nodes[i].v.empty()){
44             cout<<"-1"<<endl;
45             return 0;
46         }
47     }
48     if(!a[1]||!a[2]||!a[3]||m!=(a[1]*a[2]+a[2]*a[3]+a[3]*a[1]))//判断是否是强连通图
49     {
50         cout<<-1<<endl;
51         return 0;
52     }
53     for(int i=1;i<=n;i++)
54     {
55         cout<<nodes[i].color<<" ";
56     }
57
58
59     return 0;
60 }

原文地址:https://www.cnblogs.com/tldr/p/11614424.html

时间: 2024-11-10 01:59:43

Codeforces-Round#589 Div2的相关文章

codeforces round #257 div2 C、D

本来应该认真做这场的,思路都是正确的. C题,是先该横切完或竖切完,无法满足刀数要求,再考虑横切+竖切(竖切+横切), 因为横切+竖切(或竖切+横切)会对切割的东西产生交叉份数,从而最小的部分不会尽可能的大. 代码如下,虽然比较长.比较乱,但完全可以压缩到几行,因为几乎是4小块重复的代码,自己也懒得压缩 注意一点,比如要判断最小块的时候,比如9行要分成2份,最小的剩下那份不是9取模2,而应该是4 m/(k+1)<=m-m/(k+1)*k          #include<bits/stdc+

codeforces Round #250 (div2)

a题,就不说了吧 b题,直接从大到小排序1-limit的所有数的lowbit,再从大到小贪心组成sum就行了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #define N 200000 6 using namespace std; 7 int pos[N],a[N],s[N],f[N],la[N],b[N],i,j,k,ans,n,p

Codeforces Round#320 Div2 解题报告

Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Finding Team Member codeforces 579C A Problem about Polyline codeforces 579D "Or" Game codeforces 579E Weakness and Poorness codeforces 579F LCS Aga

Codeforces Round #254(div2)A

很有趣的题.想到了就非常简单,想不到就麻烦了. 其实就是一种逆向思维:最后结果肯定是这样子: WBWBWBWB... BWBWBWBW... WBWBWBWB... ... 里面有“-”的地方改成“-”就行了. 但是我开始是正着想的,想每个点怎么处理,这还要看它周围点的状态,越想越麻烦... 这题中体现的正难则反的逆向思维很值得学习. #include<iostream> #include<cstdio> #include<cstdlib> #include<cs

Codeforces Round #254(div2)B

就是看无向图有几个连通块,答案就是2n-num. 范围很小,就用矩阵来存图减少代码量. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #inc

Codeforces Round #260(div2)C(递推)

有明显的递推关系: f[i]表示i为数列中最大值时所求结果.num[i]表示数i在数列中出现了几次. 对于数i,要么删i,要么删i-1,只有这两种情况,且子问题还是一样的思路.那么很显然递推一下就行了:f[i]=max(f[i-1],f[i-2]+i*num[i]); 这里技巧在于:为了防止麻烦,干脆就所有数的出现次数都记录一下,然后直接从2推到100000(类似于下标排序),就不用排序了,也不用模拟删除操作了.这一技巧貌似简单,但实际上临场想出来也需要点水平. #include<iostrea

Codeforces Round #289 Div2 E

Problem 给一串长度为N的字符串,对于每个字符,若字符为元音,则权值为1,否则为0.一个子串的权值定义为该串所有字符权值之和除以字符个数,一个母串的权值定义为所有子串的权值之和.求母串的权值. Limits Time Limit(ms): 1000 Memory Limit(MB): 256 N: [1, 5*10^5] 字符集: 'A'-'Z' 元音: I E A O U Y Solution 考虑每个元音字符对母串的贡献,可以找出规律. More 举"ABCDOEFGHKMN"

Codeforces Round #403 div2 C. Andryusha and Colored Balloons

题目链接:Codeforces Round #403 div2 C. Andryusha and Colored Balloons 题意: 给你一棵n个节点的树,然后让你染色,规定相连的三个 节点不能同色,问需要的最少颜色,并输出其中一种方案. 题解: 因为只有相邻3个节点不同色. 所以直接DFS,每个节点都从1开始. 然后ans[v]!=ans[u]!=ans[fa]就行. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i&

CodeForces Round#229 DIV2 C 递推DP

对这道题目也只好说呵呵了,没注意k的范围最大才10,所以昨晚纠结了很久,没什么好的方法来处理,后来无奈想去翻翻题解,发现人家开头就来了句,因为k的范围比较小 所以.........我只好暂停马上回头看看题目,是的,k比较小所以完全可以先在询问前预处理DP一遍, DP就比较清晰了,dp[i][j]  (i>=0 && i<k,,,,j>=i && j <=n)代表意义呢 以i为开头的  区间[1,j]注意 是 1~j的 所需要的操作数,题目问的是最小操

codeforces round#259 div2 B题(KMP)

先上链接:http://codeforces.com/contest/454/problem/B B. Little Pony and Sort by Shift time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output One day, Twilight Sparkle is interested in how to sort a se