Codeforces Round \ # 579 (Div. 3) 훈련 총화 및 문제 풀이 A - F
50376 단어 cf
#include
using namespace std;
#define ll long long
#define forn(i,n) for(int i=0;i
#define for1(i,n) for(int i=1;i<=n;i++)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f;
int main(){
IO;cout.precision(10);cout<<fixed;
int t;cin>>t;
while(t--){
int n;cin>>n;
vector<int>a(n);
forn(i,n) cin>>a[i];
bool ok1 = 1,ok2 = 1;
forn(i,n){
int x = 0;
if(i) x = a[i-1]+1;
else x = a[n-1]+1;
if(x>n) x-=n;
if(x!=a[i]) ok1 = 0;
}
forn(i,n){
int x = 0;
if(i) x = a[i-1]-1;
else x = a[n-1]-1;
if(x<1) x+=n;
if(x!=a[i]) ok2 = 0;
}
if(ok1||ok2) cout<<"YES"<<'
';
else cout<<"NO"<<'
';
}
return 0;
}
B. 제목: 4 * n 개 수 는 n 개의 사각형 을 구성 할 수 있 고 사각형 면적 이 같 습 니 다.사고방식: stl 코드:
#include
using namespace std;
#define ll long long
#define forn(i,n) for(int i=0;i
#define for1(i,n) for(int i=1;i<=n;i++)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f;
int main(){
IO;cout.precision(10);cout<<fixed;
int t;cin>>t;
while(t--){
int n;cin>>n;
multiset<int>s;
map<int,int>mp;
bool ok = 0;
forn(i,n<<2){
int x;cin>>x;
mp[x]++;s.insert(x);
}
int cnt = 0;
for(auto x:mp) cnt+=x.second/2;
if(cnt==2*n) ok = 1;
if(!ok){
cout<<"NO"<<'
';
continue;
}
set<int>ss;
forn(i,n){
int x = *s.rbegin();
int y = *s.begin();
int xx,yy;
xx = x,yy = y;
s.erase(s.find(xx));
s.erase(s.find(yy));
s.erase(s.find(xx));
s.erase(s.find(yy));
//cerr<
ss.insert(xx*yy);
}
if(ss.size()==1) cout<<"YES"<<'
';
else cout<<"NO"<<'
';
}
return 0;
}
C. 제목: n 개 수의 공통 인 자 는 몇 가지 사고방식 이 있다. gcd 의 인 자 는 몇 가지 코드 가 있다.
#include
using namespace std;
#define ll long long
#define forn(i,n) for(ll i=0;i
#define for1(i,n) for(ll i=1;i<=n;i++)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
const ll inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f;
int main(){
IO;cout.precision(10);cout<<fixed;
ll n;cin>>n;
ll x = 0;
forn(i,n){
ll y;cin>>y;x = __gcd(x,y);
}
ll cnt = 0;
ll m = sqrt(x);
for1(i,m){
if(x%i==0) cnt++;
if(x%i==0&&x/i!=i) cnt++;
}
cout<<cnt<<'
';
return 0;
}
D. 제목: 두 문자열 s, t 는 s 의 하위 문자열 을 삭제 하여 나머지 부분의 하위 서열 을 t 로 구성 할 수 있 습 니 다.가장 긴 길 이 를 삭제 하 십시오.사고: 두 바늘, 가운데 부분 을 삭제 하 는 것 에 주의 하 세 요.코드:
#include
using namespace std;
#define ll long long
#define forn(i,n) for(int i=0;i
#define for1(i,n) for(int i=1;i<=n;i++)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f;
const int maxn = 2e5+5;
int l[maxn],r[maxn];
int main(){
IO;cout.precision(10);cout<<fixed;
string s,t;cin>>s>>t;
int len = s.size(),len2 = t.size();
forn(i,len){
l[i+1] = l[i];
if(l[i+1]<len2&&s[i]==t[l[i+1]]) l[i+1]++;
}
r[len] = len2;
for(int i = len-1;i>=0;i--){
r[i] = r[i+1];
if(r[i]>=0&&s[i]==t[r[i]-1]) r[i]--;
}
int ans = 0,p = 0;
// forn(i,len) cerr<
// cerr<
// forn(i,len) cerr<
// cerr<
forn(i,len){
while(p<len&&l[i]+1>r[p+1]) p++;
// cerr<
ans = max(ans,p-i);
// else break;
}
cout << ans<<'
';
return 0;
}
E. 제목: 매번 숫자 + 1, - 1 을 사용 할 수 있 습 니 다.최대 몇 가지 숫자 를 구하 다.사고: 1 - 2 번 의 우선 아래로.코드:
#include
using namespace std;
#define ll long long
#define forn(i,n) for(int i=0;i
#define for1(i,n) for(int i=1;i<=n;i++)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f;
int main(){
IO;cout.precision(10);cout<<fixed;
int n;cin>>n;
multiset<int>s;
map<int,int>mp;
forn(i,n){
int x;cin>>x;
s.insert(x);mp[x]++;
}
for(auto x:s){
if(x>1&&!mp[x-1]){
mp[x]--;
mp[x-1]++;
}
if(mp[x]>1){
mp[x]--;
mp[x+1]++;
}if(!mp[x]) mp.erase(x);
}
cout << mp.size()<<'
';
// cout<
// cout<
return 0;
}
F. 제목: 100 개 관문 은 진입 문턱 ai 가 있 습 니 다. 통관 하면 bi (가능 - 가능 +) 를 얻 을 수 있 습 니 다. 처음에 r 의 금화 가 있 습 니 다. r > = ai 만 들 어 갈 수 있 습 니 다. 진입 후 r + = b [i], r < 0 이 되면 직접 게임 에 실패 하고 그 밖 에 통관 횟수 + 가 있 습 니 다.사고: bi > 0 시 우선 통관, bi < 0 시 우 리 는 이러한 상황 을 고려 하여 a1a 2b1b 2 만약 에 우리 가 12 의 노선 을 걷는다 면 r > = a1, r + b1 > = a2, 동 리 21r > = a1, r + b2 > = a1 그래서 r > = max (a1, a2 - b1) r > = max (a2, a1 - b2) 현재 첫 번 째 max 가 가장 작다 고 가정 하면 max (a1, a2 - b1) < = max (a2, a1 - b2), 분명히 a1 그래서 a2 - b1 은 a2 + b2 이후 01 가방 을 얻 으 면 된다.코드:
#include
using namespace std;
#define ll long long
#define forn(i,n) for(int i=0;i
#define for1(i,n) for(int i=1;i<=n;i++)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f;
const int maxn = 105;
int dp[maxn];
bool cmp(pair<int,int> x,pair<int,int> y){
return x.first+x.second>y.first+y.second;
}
int main(){
IO;cout.precision(10);cout<<fixed;
forn(i,maxn) dp[i] = -inf;
int n,r;cin>>n>>r;
vector<pair<int,int> >a,b;
forn(i,n){
int x,y;cin>>x>>y;
if(y>=0) a.push_back({x,y});
else b.push_back({x,y});
}
sort(a.begin(),a.end());
sort(b.begin(),b.end(),cmp);
int ans = 0;
for(auto x:a){
if(r>=x.first) r+=x.second,ans++;
}
n = b.size();
dp[0] = r;
forn(i,n){
int lim = b[i].first,v = b[i].second;
for(int j=n-1;j>=0;j--){
if(dp[j]>=max(lim,-v)){
dp[j+1] = max(dp[j+1],dp[j]+v);
//cerr<
}
}
}
for(int i = n;i>=1;i--) if(dp[i]!=-inf){
ans+=i;
break;
}
cout << ans <<'
';
return 0;
}