Educational Codeforces Round 84 (Rated for Div. 2)

原题链接

题外话

被教育了,读题不认真,明明能四题的(靠),竟然打不过jy,很烦

A

A题意

给你n,m(m是奇数的数量)问你是否可以使用m个奇数(不相同的)构成n

A思路

自己上来以为是判断奇偶就死了
其实还有点其他的东西,比如k个互不相同的奇数最小就是k*k(记录一下)

A代码

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define maxe 1000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,b) for(i=a;i<=b;i++)
#define drep(i,a,b) for(i=a;i>=b;i--)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
#define __i __int128
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll; 

ll read(ll x=0)
{
    ll c, f(1);
    for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
    for(;isdigit(c);c=getchar())x=x*10+c-0x30;
    return f*x;
}
ll n , k ;
int ar[1000010];
int  br[100010];
ll res =0 ;

int main()
{
  	int n;cin >>n;
  	while (n--){
  		int a, b;cin>>a>>b;
  		int num =0 ;
  		if(a%2 == b%2 && b <= sqrt(a)){
  			cout<<"Yes"<<endl;
			  continue ;	
		  }
		
		else  cout<<"NO"<<endl;
	  }
    return 0;
}

B

题意

题面挺长的,其实就是一个简单的模拟,问题就是让你给国王的女儿分配王子,不能分配的就optimal,不然就imporve(自己一开始以为是二分图。。有点尴尬)

思路

判断每个公主,是否有一个王子对应, 没有的话,就可以improve , 不然就是optimal
注意,只能添加一次

代码

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define maxe 1000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,b) for(i=a;i<=b;i++)
#define drep(i,a,b) for(i=a;i>=b;i--)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
#define __i __int128
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll; 

ll read(ll x=0)
{
    ll c, f(1);
    for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
    for(;isdigit(c);c=getchar())x=x*10+c-0x30;
    return f*x;
}
ll n , k ;
int ar[1000010];
int  br[100010];
ll res =0 ;

int main()
{
	    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
  	int t;cin >>t;
  	while(t--){
  		int n;cin >>n;
  		map<int ,int >mp;
//  		memset(ar, 0 ,sizeof ar);
  		int flag=0 ;int pos =0;
  		for(int i=0 ;i<n;i++){
  			int f =0 ;
  			cin >>ar[i];
  			for(int j=0;j<ar[i];j++){
  				int b; cin >>b;
  				if(mp[b]==0 &&f==0 ){
  					mp[b] ++ ;
  					f =1 ;
				  }
			  }
			if(!f){
				flag =1 ;
				pos =i+1 ;
			}
		  }
		if(!flag ){
			cout<<"OPTIMAL"<<endl;
			continue ;
		}
		cout<<"IMPROVE"<<endl;
		for(int i=1;i<=n;i++)if(!mp[i]){
			cout<<pos <<" "<< i <<endl;
			break; 
		}
	  }
    return 0;
}

C

题意

就是问你是否有一种方案,可以让所有的芯片至少通过一次给定的位置

思路

*注意, 最长不能够超过2mn,然后,每个位置可以放置多个芯片, 这意味着,你可以先把所有芯片放到(1,1),然后蛇形排列,就好了

代码

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define maxe 1000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define drep(i,a,b) for(i=a;i>=b;i--)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
#define __i __int128
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll; 

ll read(ll x=0)
{
    ll c, f(1);
    for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
    for(;isdigit(c);c=getchar())x=x*10+c-0x30;
    return f*x;
}
ll n , k, m ;
string v;
int main()
{
	    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
//    int i ;
  	n =read(), m = read() ;
  	rep(i,0,m-1)v.pb('L') ;
  	rep(i,0,n-1)v.pb('U');
  	rep(i,0,n){
  		if(i%2==0)rep(j,0,m-1)v.pb('R');
  		else rep(j,0,m-1)v.pb('L');
  		v.pb('D');
	  }
	cout<<SZ(v)<<endl;
	printf("%s\n", v.c_str());
    return 0;
}

E

题意

让你在【1,\(10^n\)-1】里面找出所有n个连续相同的数字块的数量(要从n到1的块都输出)

思路

其实就是一个规律题,推一推公式,如果不会的,就上oeis上面蒙蒙数据,看看能否成立啥的那就先打表,发现其实就是\(ar[i]= ar[i-1]*10+81*10^{i-1}\)
主要要取余一下,其他的就没什么了

代码

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define maxe 1000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define drep(i,a,b) for(i=a;i>=b;i--)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
#define __i __int128
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll; 

ll read(ll x=0)
{
    ll c, f(1);
    for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
    for(;isdigit(c);c=getchar())x=x*10+c-0x30;
    return f*x;
}
ll n , k, m ;
ll ar[500010];
int main()
{
	    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
//    int i ;
  	n =read();
  	ar[1]=10;
  	ar[2]=180;
  	ll cnt =810 ;
  	for(int i=3;i<=n;i++){
  		ar[i] = ar[i-1]*10%998244353+cnt;
  		ar[i]%=998244353;
  		cnt *=10;
  		cnt%=998244353;
	  }
	for(int i=n;i>=1;i--)cout<<ar[i]<<" "; cout<<endl;
    return 0;
}
posted @ 2020-03-25 00:27  dsrcis  阅读(150)  评论(0编辑  收藏  举报