Codeforces Round #439 (Div. 2)

A題ios

分析:注意異或之後可能會大於2e6,因此數組應該開到4e6。還有一種巧妙的解法就是用異或的性質,b^a^b=a,因此能夠看出必然都是偶數對。數組

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 #include "cmath"
 6 #include "vector"
 7 using namespace std;
 8 const int maxn=5000;
 9 const int maxm=4e6+10;
10 int x[maxn],y[maxn];
11 int vis[maxm];
12 int n;
13 //vector<int> res;
14 int main()
15 {
16     scanf("%d",&n);
17     //res.push_back(0);
18     for(int i=1;i<=n;i++){
19         scanf("%d",&x[i]);
20         vis[x[i]]=1;
21         //res.push_back(x[i]);
22     }
23     for(int i=1;i<=n;i++){
24         scanf("%d",&y[i]);
25         vis[y[i]]=1;
26         //res.push_back(y[i]);
27     }
28     int cnt=0;
29     for(int i=1;i<=n;i++){
30         for(int j=1;j<=n;j++){
31             int num=x[i]^y[j];
32             if(vis[num]){
33                 cnt++;
34                 //cout<<res[i]<<" "<<res[j]<<endl;
35                 //cout<<num<<endl;
36             }
37         }
38     }
39     //cout<<(1^1)<<endl;
40     //cout<<cnt<<endl;
41     if(cnt%2==0)
42         cout<<"Karen"<<endl;
43     else
44         cout<<"Koyomi"<<endl;
45 }
View Code

B題ide

分析:要求最後一位數分爲幾種狀況,若是兩數之差超過10的,由於最後一位出現0,因此必然爲0。若是兩數相等,直接對10曲餘,不然直接暴力便可。spa

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 #include "vector"
 6 using namespace std;
 7 long long a,b;
 8 int main()
 9 {
10     cin>>a>>b;
11     if(b-a>=10){
12         cout<<"0"<<endl;
13     }else{
14         long long t=b-a;
15         if(t==0)
16             cout<<"1"<<endl;
17         else if(t==1){
18             cout<<b%10<<endl;
19         }
20         else{
21             long long z=1;
22             vector<int>t;
23             for(long long i=a+1;i<=b;i++){
24                 int num=i%10;
25                 t.push_back(num);
26             }
27             for(int i=0;i<t.size();i++)
28                 z*=t[i];
29             z=z%10;
30             cout<<z<<endl;
31         }
32     }
33 }
View Code

C題code

分析:題意比較難理解,就是給定三個集合,每一個集合的元素個數分別爲a,b,c。而後相同的一個集合當中任何兩元素之間最短路必須大於等於3。求最多有多少種連線方式。根據題意咱們就能夠得知,首先同色的不可能相連,同時兩個同色的不能連在一個其餘顏色上。這個結論過重要了,這就說明了咱們連任意兩種顏色是獨立的,因而最後結果就是(a,b),(a,c),(b,c)三者的乘積。而對於選取任意兩種顏色,假設(a<b),那咱們若是選取k條線段的話,必然有C(a,k)*C(b,k)*k!種組合方式,因此最終結果也就是k從0取到a的和,而後其他顏色也依次類推。blog

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 #include "cmath"
 6 #include "algorithm"
 7 using namespace std;
 8 typedef long long LL;
 9 const LL mod= 998244353;
10 const int maxn=5050;
11 LL a[10];
12 LL f[maxn],dp[maxn][maxn];
13 void init(int n){
14     f[0]=1;
15     for(int i=1;i<=n;i++){
16         f[i]=f[i-1]*i;
17         f[i]%=mod;
18     }
19     for(int i=0;i<=n;i++){
20         dp[i][0]=1;
21     }
22     for(int i=1;i<=n;i++){
23         for(int j=1;j<=i;j++){
24             dp[i][j]=(dp[i-1][j-1]%mod+(dp[i-1][j]%mod))%mod;
25         }
26     }
27 }
28 int main()
29 {
30     cin>>a[1]>>a[2]>>a[3];
31     sort(a+1,a+4);
32     init(5000);
33     LL num1=0,num2=0,num3=0;
34     for(int i=0;i<=a[1];i++){
35         num1+=((dp[a[1]][i]%mod*(dp[a[2]][i]%mod))%mod*f[i])%mod;
36         num1%=mod;
37     }
38     for(int i=0;i<=a[2];i++){
39         num2+=((dp[a[2]][i]%mod*(dp[a[3]][i]%mod))%mod*f[i])%mod;
40         num2%=mod;
41     }
42     for(int i=0;i<=a[1];i++){
43         num3+=((dp[a[1]][i]%mod*(dp[a[3]][i]%mod))%mod*f[i])%mod;
44         num3%=mod;
45     }
46     LL ans=((num1*num2)%mod*num3)%mod;
47     cout<<ans<<endl;
48 }
View Code

 E題ci

分析:圍牆之間不相交,因此咱們能夠把每一個圍牆內部都設置成一個值,詢問的時候只要看兩個點的值是否相同便可。那麼怎麼get

將一個圍牆內設爲一個值呢,咱們能夠利用二維BIT,利用前綴和,進行區間更新,單點查詢,跟一維的時候區間更新單點更新一string

樣。那麼刪除的時候怎麼快速獲得這個圍牆原來設置的是什麼值呢,咱們能夠用哈希,將四個座標哈希成一個值。it

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 using namespace std;
 6 typedef long long LL;
 7 const int maxn=2500+10;
 8 const LL val=2333;
 9 LL c[maxn][maxn];
10 int n,m,q;
11 int lowbit(int x){
12     return x&(-x);
13 }
14 void add(int x,int y,LL k){
15     for(int i=x;i<=n;i+=lowbit(i))
16         for(int j=y;j<=m;j+=lowbit(j))
17             c[i][j]+=k;
18 }
19 void update(int x1,int y1,int x2,int y2,LL k){
20     add(x2+1,y2+1,k);
21     add(x2+1,y1,-k);
22     add(x1,y2+1,-k);
23     add(x1,y1,k);
24 }
25 LL sum(int x,int y){
26     LL ans=0;
27     for(int i=x;i;i-=lowbit(i))
28         for(int j=y;j;j-=lowbit(j))
29             ans+=c[i][j];
30     return ans;
31 }
32 int main()
33 {
34     scanf("%d%d%d",&n,&m,&q);
35     for(int cas=1;cas<=q;cas++){
36         int num,x1,y1,x2,y2;
37         scanf("%d%d%d%d%d",&num,&x1,&y1,&x2,&y2);
38         LL ans=x1;
39         ans=ans*val+y1;
40         ans=ans*val+x2;
41         ans=ans*val+y2;
42         if(num==1)
43             update(x1,y1,x2,y2,ans);
44         else if(num==2)
45             update(x1,y1,x2,y2,-ans);
46         else{
47             LL ans1=sum(x1,y1);
48             LL ans2=sum(x2,y2);
49             if(ans1==ans2)
50                 cout<<"Yes"<<endl;
51             else
52                 cout<<"No"<<endl;
53         }
54     }
55 }
View Code
相關文章
相關標籤/搜索