L 、 Problem L is the Only Lovely Problem
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include <map>
#include <list>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <stack>
#include <set>
#pragma GCC optimize(3 , "Ofast" , "inline")
using namespace std ;
#define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)
#define x first
#define y second
typedef long long ll ;
const double esp = 1e-6 , pi = acos(-1) ;
typedef pair<int , int> PII ;
const int N = 1e6 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
ll in()
{
ll x = 0 , f = 1 ;
char ch = getchar() ;
while(!isdigit(ch)) {if(ch == '-') f = -1 ; ch = getchar() ;}
while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;
return x * f ;
}
int main()
{
string s ;
cin >> s ;
string a = "lovely" ;
for(int i = 0 ;i < 6 ;i ++ ) {
if(i >= s.size()) break ;
if(s[i] < 'a') s[i] += 32 ;
if(s[i] != a[i]) return 0 * puts("ugly") ;
}
return 0 * puts("lovely") ;
}
/*
*/
B、Classical String Problem
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include <map>
#include <list>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <stack>
#include <set>
#pragma GCC optimize(3 , "Ofast" , "inline")
using namespace std ;
#define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)
#define x first
#define y second
typedef long long ll ;
const double esp = 1e-6 , pi = acos(-1) ;
typedef pair<int , int> PII ;
const int N = 2e6 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
ll in()
{
ll x = 0 , f = 1 ;
char ch = getchar() ;
while(!isdigit(ch)) {if(ch == '-') f = -1 ; ch = getchar() ;}
while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;
return x * f ;
}
char s[N] ;
int main()
{
scanf("%s" , s) ;
int n = in() ;
int len = strlen(s) ;
int l = 0 , r = len - 1 ;
for(int i = 1; i <= n ;i ++ ) {
char c[2] ;
int x ;
scanf("%s%d" , c , &x) ;
if(c[0] == 'A') printf("%c
" , s[((l + x - 1) % len + len) % len]) ;
else l += x , r += x , (l %= len + len) %= len , (r %= len + len) %= len ;
}
return 0 ;
}
/*
*/
A、Clam and Fish
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include <map>
#include <list>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <stack>
#include <set>
#pragma GCC optimize(3 , "Ofast" , "inline")
using namespace std ;
#define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)
#define x first
#define y second
typedef long long ll ;
const double esp = 1e-6 , pi = acos(-1) ;
typedef pair<int , int> PII ;
const int N = 2e6 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
char s[N] ;
void work(){
int n ;
scanf("%d" , &n) ;
int ans = 0 , res = 0 ;
scanf("%s" , s) ;
for(int i = 0 ;i < n ;i ++) {
if(s[i] >= '2') {
ans ++ ;
}
if(s[i] == '0') {
if(res) res -- , ans ++ ;
}
if(s[i] == '1')
res ++ ;
}
printf("%d
" , ans + res / 2) ;
return ;
}
int main()
{
int t ;
scanf("%d" , &t) ;
while(t --) work() ;
return 0 ;
}
/*
*/
c、Operation Love
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include <map>
#include <list>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <stack>
#include <set>
#pragma GCC optimize(3 , "Ofast" , "inline")
using namespace std ;
#define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)
#define x first
#define y second
typedef long long ll ;
const double esp = 1e-5 , pi = acos(-1) ;
typedef pair<double , double> PII ;
const int N = 1e6 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
ll in()
{
ll x = 0 , f = 1 ;
char ch = getchar() ;
while(!isdigit(ch)) {if(ch == '-') f = -1 ; ch = getchar() ;}
while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;
return x * f ;
}
PII a[N] ;
int len(PII a , PII b){
double x = a.x - b.x , y = a.y - b.y ;
return sqrt(x * x + y * y + 0.5) ;
}
double cross(PII a , PII b){
return a.x * b.y - a.y * b.x ;
}
double area() {
double ans = 0 ;
for(int i = 0 ;i < 20 ;i ++)
ans += cross(a[i] , a[(i + 1) % 20]) ;
return ans ;
}
void work()
{
vector<int> ans ;
for(int i = 0; i < 20 ;i ++ ) cin >> a[i].x >> a[i].y ;
if(area() > 0) {
for(int i = 0; i < 20 ;i ++) {
if(len(a[i] , a[(i + 1) % 20]) == 9) {
if(len(a[(i + 1) % 20] , a[(i + 2) % 20]) == 8) cout << "right" << endl ;
else cout << "left" << endl ;
return ;
}
}
}else {
for(int i = 0; i < 20 ;i ++) {
if(len(a[i] , a[(i + 1) % 20]) == 9) {
if(len(a[(i + 1) % 20] , a[(i + 2) % 20]) == 8) cout << "left" << endl ;
else cout << "right" << endl ;
return ;
}
}
}
return ;
}
int main()
{
int n = in() ;
while(n --) work() ;
return 0 ;
}
/*
*/
E、Two Matchings
首先
根据上述,发现一个目标n的排列里面,都是一个一个的环,并且每个环的长度为2 , 题目要求两个那个matching串和最小,就贪心使每个串的和比较小,也就是找个最小和次小,那么第一个matching最小的话,肯定是直接将a排序,a[1] < a[2] < a[3] < a[4] , 这个贡献就是a[i + 1] - a[i] , i += 2, 那么次小的怎么算呢
贪心讲:次小的应该是错开一个减,例如a[3] - a[1] , a[4] - a[2],但是枚举6个时候应该是a[6] - a[4] ,. a[5] - a[2] , a[3] - a[1], 如下图, 那么8个时候怎么错开,发现就是两个4错开,10个时候错开的话就是一个4和一个6组合,下面也就是dp了,每次dp就max一下上面两种错开方式的最大值
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include <map>
#include <list>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <stack>
#include <set>
#pragma GCC optimize(3 , "Ofast" , "inline")
using namespace std ;
#define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)
#define x first
#define y second
typedef long long ll ;
const double esp = 1e-6 , pi = acos(-1) ;
typedef pair<int , int> PII ;
const int N = 1e6 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
ll in()
{
ll x = 0 , f = 1 ;
char ch = getchar() ;
while(!isdigit(ch)) {if(ch == '-') f = -1 ; ch = getchar() ;}
while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;
return x * f ;
}
ll a[N] , dp[N] ;
void work(){
int n = in() ;
for(int i = 1; i <= n ;i ++ ) a[i] = in() , dp[i] = 1e18 ;
sort(a + 1 , a + n + 1) ;
ll ans = 0 ;
for(int i = 1; i <= n ;i += 2) {
ans += a[i + 1] - a[i] ;
}
dp[0] = 0 ;
for(int i = 4; i <= n ;i ++ ) {
dp[i] = min(dp[i] , dp[i - 4] + a[i] - a[i - 2] + a[i - 1] - a[i - 3]) ;
if(i >= 6)
dp[i] = min(dp[i] , dp[i - 6] + a[i] - a[i - 2] + a[i - 1] - a[i - 4] + a[i - 3] - a[i - 5]) ;
}
printf("%lld
" , dp[n] + ans) ;
return ;
}
int main()
{
int n = in() ;
while(n --) work() ;
return 0 ;
}
/*
*/
F、 Fraction Construction Problem
-
玄学卡常可能,ll不能多用
-
我看的别的博客说b如果是质数的话,输出-1,但是这个地方好象不行,质数好象是可以的,如果a == b是可以的,不管b是否指数
-
如果gcd(a , b) > 1 , 直接构造
- 如果gcd(a , b) == 1 , 通分
构造的话,就(d*f = b&&gcd(d , f) = 1)
为啥要加上gcd(d , f) = 1呢
假设不等于1的情况:(t = gcd(d , f)) , d , f也是b的约数,那么t也就是b的因子。在对(cd - de)扩展欧几里得的过程里面,(cf - de = gcd(d , f)) , 并且最终呢我们要(cf - de = a) , 也就是说(gcd(d , f)) 是a的因子,那么(gcd(d , f))也是b的因子,所以此时(gcd(a , b) > 1) , 与假设(gcd(a , b) == 1), 不符合
5.枚举d,得到f,(gcd(d , f) == 1), 然后就直接扩展欧几里得求解c , e,判断c , e的正负即可
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include <map>
#include <list>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <stack>
#include <set>
#pragma GCC optimize(3 , "Ofast" , "inline")
using namespace std ;
#define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)
#define x first
#define y second
typedef long long ll ;
const double esp = 1e-6 , pi = acos(-1) ;
typedef pair<int , int> PII ;
const int N = 3e6 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
ll in()
{
ll x = 0 , f = 1 ;
char ch = getchar() ;
while(!isdigit(ch)) {if(ch == '-') f = -1 ; ch = getchar() ;}
while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;
return x * f ;
}
ll exgcd(ll a , ll b , ll &x , ll &y){
if(b == 0) {
x = 1 , y = 0 ;
return a ;
}
ll t = exgcd(b , a % b , y , x) ;
y -= 1ll * (a / b) * x ;
return t ;
}
int work(){
int a , b ;
scanf("%d%d" , &a , &b) ;
if(b == 1) {
return 0 * puts("-1 -1 -1 -1") ;
}
int g = __gcd(a , b) ;
if(g != 1) {
printf("%d %d %d %d
" , a / g + 1 , b / g , 1 , b / g ) ;
return 0 ;
}
for(int i = 2; i * i <= b ;i ++ ) {
if(b % i == 0 && __gcd(i , b / i) == 1) {
ll e , c ;
exgcd(i , b / i , e , c ) ;
e *= a , c *= a ;
if(c < 0 && e > 0) {
printf("%lld %d %lld %d
" , e ,b / i , -c , i ) ;
return 0 ;
}else {
printf("%lld %d %lld %d
" , c , i , -e , b / i ) ;
return 0 ;
}
break ;
}
}
return 0 * puts("-1 -1 -1 -1") ;
}
int main()
{
int n ;
scanf("%d" , &n) ;
while(n --) work() ;
return 0 ;
}
/*
*/