Codeforces Round #531 (Div. 3)
阿新 • • 發佈:2019-01-10
不會F啊。。。投了。。。剩下的好像都很簡單
A:瞎猜。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 ios::sync_with_stdio(false); 5 int n; 6 cin>>n; 7 if(n%4==0||n%4==3){ 8 cout<<0<<endl; 9 } else{ 10 cout<<1<<endl; 11View Code} 12 }
B:隨便搞
#include <bits/stdc++.h> using namespace std; int n,k; int a[6666],ans[6666]; set<int>s[6666]; void cloro(int id,int clo){ while (s[a[id]].count(clo)){ clo++; if(clo==k+1){ clo=1; } } ans[id]=clo; s[a[id]].insert(clo); }View Codeint main() { ios::sync_with_stdio(false); cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i]; int now = 1; bool flag = false; for(int i=1;i<=n;i++){ if(s[a[i]].size()==k){ cout<<"NO"<<endl; exit(0); } cloro(i,now); now++; if(now==k+1) { now = 1; flag = true; } } if(!flag&&now<k){ cout<<"NO"<<endl; exit(0); } cout<<"YES"<<endl; for(int i=1;i<=n;i++) cout<<ans[i]<<' '; }
C:傻逼題
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,x,y,a[105]; 4 int dp[100005]; 5 set<int> s; 6 int main() { 7 ios::sync_with_stdio(false); 8 cin>>n>>x>>y; 9 for(int i=1;i<=n;i++) 10 cin>>a[i]; 11 if(x>y){ 12 cout<<n<<endl; 13 } else if(x<=y){ 14 int num = 0; 15 for(int i=1;i<=n;i++){ 16 if(a[i]<=x){ 17 num++; 18 } 19 } 20 int ans = 0; 21 while (num>0){ 22 ans++; 23 num-=2; 24 } 25 cout<<ans<<endl; 26 } 27 }View Code
D:貪心的 六種變換隨便搞
我寫的應該是有問題的,但是ppt了就不想改了,估計會掉。 因為我覺著 我先貪心的 情況會影響到後貪心的。其實加個vis就可以但是我比較懶。。。
#include <bits/stdc++.h> using namespace std; string s;int n; int a[3]; void slove(int c01,int c02,int c10,int c12,int c20,int c21){ for(int i=n-1;i>=0;i--){ if(s[i]=='0'){ if(c02) { s[i] = '2'; c02--; } else if(c01) { s[i] = '1'; c01--; } } else if(s[i]=='1'){ if(c12){ c12--; s[i]='2'; } } } for(int i=0;i<n;i++){ if(s[i]=='2'){ if(c20){ c20--; s[i]='0'; } else if(c21){ c21--; s[i]='1'; } } else if(s[i]=='1'){ if(c10){ s[i]='0'; c10--; } } } } int main() { ios::sync_with_stdio(false); cin>>n>>s; for(int i=0;i<n;i++){ a[s[i]-'0']++; } int c01=0,c02=0,c10=0,c12=0,c20=0,c21=0; if(a[0]>n/3){ if(a[1]>n/3){ c02=a[0]-n/3; c12=a[1]-n/3; } else{ c01=n/3-a[1]; c02=n/3-a[2]; } } else if(a[1]>n/3){ if(a[2]>n/3){ c10=a[1]-n/3; c20=a[2]-n/3; } else{ c10=n/3-a[0]; c12=n/3-a[2]; } } else if(a[2]>n/3){ c20=n/3-a[0]; c21=n/3-a[1]; } slove(c01,c02,c10,c12,c20,c21); cout<<s<<endl; }View Code
E:每個數都可以確定一個區間,然後我們求不確定的區間的長度,答案就是 1<<(len-1)
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll mod = 998244353; 5 int n;int a[200005]; 6 ll qpow(ll a,ll x){ 7 ll res = 1; 8 while (x){ 9 if(x&1) 10 res=(res*a)%mod; 11 a=(a*a)%mod; 12 x/=2; 13 } 14 return res; 15 } 16 map<int,int> m; 17 vector<int> v [200005]; 18 int pre[200005]; 19 int main() { 20 ios::sync_with_stdio(false); 21 cin>>n; 22 int id = 1; 23 for(int i=1;i<=n;i++) { 24 cin >> a[i]; 25 if(m.count(a[i])){ 26 v[m[a[i]]].push_back(i); 27 } else{ 28 m[a[i]]=id; 29 v[id].push_back(i); 30 id++; 31 } 32 } 33 for(int i=1;i<id;i++){ 34 pre[v[i][0]]++; 35 pre[v[i][v[i].size()-1]]--; 36 } 37 ll cnt = 0; 38 for(int i=1;i<=n;i++){ 39 pre[i]+=pre[i-1]; 40 if(pre[i]==0) 41 cnt++; 42 } 43 cout<<qpow(2,cnt-1)<<endl; 44 }View Code
F:狀壓dp。 資料範圍很明顯了。。 先預處理出來每兩行相鄰的時候對答案的貢獻,然後dp,dp的時候列舉第一行是啥。