2020.1.12 星期六
昨天上經濟課真是刺激,本來沒打算打這場div2的,後來看到羣裏好多人都去了,心裏癢癢,正好在路上有了第一題的思路,就交上去了,全然不顧我已經比別人晚了45分鐘以及我馬上要去上economic of risk的事實,試試就逝世。
上課我習慣性地坐在了第一排,結果忘了我今天還有別的任務,結果電腦打開就開始做題了,後面的三位中國同學很好奇經濟課上爲什麼會有計科學生亂入,紛紛投來好奇的目光,第一排坐着個在看電腦的人,然後後一排人全在看第一排的人,這想都不用想絕對是走神了,當場被老師拉出來制裁了,結果我才交完第一題就被繳了械。。。哭了,掉分預定,綠名也能掉分屬實厲害。
然後說比賽吧,感覺真的不難,這幾個都是構思特別精巧的題,a和c基本都是秒出,然而b卡住了,後來還是因爲國內老姐給我的思路,最後ac了,然後最後一題d,再往下就是不可做題了,這道題分治的優勢很明顯(雖然我逆序數都能寫掛好幾次沒資格說這個話),但是具體怎麼做我也是後來從別人那裏得到的啓發,畢竟對位運算還不算太老練,答題思路是對每一位進行分治,查在這個位置上0和1的情況,就是這個位置上如果既有0,也有1,那麼完蛋了,這個位置上的1八成是跑不掉了,如果只有0或者只有1那麼就可以把這一位對應地設置成0或1來取到0,感覺不難,但是寫起來真的有一定的難度,後來還是A了。
下面是A. Mezo Playing Zoma 的AC代碼
#include <bits/stdc++.h>
using namespace std;
#define limit 200000 + 5//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3ff
#define lowbit(i) i&(-i)//一步兩步
#define EPS 1e-6
#define Modulo 1000000
#define ff(a) printf("%d\n",a );
#define MOD 1e9 + 7
typedef unsigned long long ll;
void read(int &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快讀
int read(){
int x;
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return x;
}//快讀
int n;
int main(){
//freopen("C:\\Users\\administrator01\\CLionProjects\\untitled14\\data.txt", "rt", stdin);
string str;
cin>>n>>str;
cout<<(str.length() + 1)<<endl;
}
B. Just eat it 的AC代碼
#include <bits/stdc++.h>
using namespace std;
#define limit 200000 + 5//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3ff
#define lowbit(i) i&(-i)//一步兩步
#define EPS 1e-6
#define Modulo 1000000
#define ff(a) printf("%d\n",a );
#define MOD 1e9 + 7
typedef long long ll;
void read(int &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快讀
int read(){
int x;
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return x;
}//快讀
int n;
int kase;
ll a[limit];
int main(){
//freopen("C:\\Users\\administrator01\\CLionProjects\\untitled14\\data.txt", "rt", stdin);
kase = read();
while(kase--){
n = read();
for(int i = 1 ; i <= n ; ++i){
cin>>a[i];
}
ll sum1 = 0, sum2 = 0;
int flag = 1;
for(int i = 1 ; i <= n ; ++i){
sum1 += a[i];
if(sum1 <= 0){
flag = 0;
break;
}
}
for(int i = n ; i >= 1 ; --i){
sum2 += a[i];
if(sum2 <= 0){
flag = 0;
break;
}
}
puts(flag ? "YES" : "NO");
}
}
C. Fadi and LCM 的AC代碼(記得開ull)
#include <bits/stdc++.h>
using namespace std;
#define limit 200000 + 5//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3ff
#define lowbit(i) i&(-i)//一步兩步
#define EPS 1e-6
#define Modulo 1000000
#define ff(a) printf("%d\n",a );
#define MOD 1e9 + 7
typedef unsigned long long ll;
void read(int &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快讀
int read(){
int x;
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return x;
}//快讀
ll n;
int kase;
ll a[limit];
int cnt = 0;
int main(){
//freopen("C:\\Users\\administrator01\\CLionProjects\\untitled14\\data.txt", "rt", stdin);
cin>>n;
for(ll i = 1 ; i * i <= n; ++i){
//枚舉所有的divisor
if(n % i == 0){
a[++cnt] = i;//記錄所有的divisor
}
}
ll ans1 = inf, ans2 = inf;
for(int i = 1 ; i <= cnt ; ++i){
if(gcd(a[i] , n / a[i]) == 1){
//如果這兩個互質
if(max(ans1, ans2) > max(a[i] , n / a[i])){
ans1 = a[i];
ans2 = n / a[i];
}
}
}
printf("%lld %lld\n", ans1, ans2);
}
D. Dr. Evil Underscores的AC代碼,不要問我你是不是抄答案了,我這幾天的代碼和標準答案真的很像,但不一樣
#include <bits/stdc++.h>
using namespace std;
#define limit 100000 + 5//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3ff
#define lowbit(i) i&(-i)//一步兩步
#define EPS 1e-6
#define Modulo 1000000
#define ff(a) printf("%d\n",a );
#define MOD 1e9 + 7
#define FOPEN freopen("C:\\Users\\administrator01\\CLionProjects\\untitled14\\data.txt", "rt", stdin)
typedef unsigned long long ll;
void read(int &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快讀
int read(){
int x;
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return x;
}//快讀
int n;
vector<int>v;
int dfs(int cur, vector<int>&vect){
if(cur < 0){
return 0;
}
vector<int>zero, one;//當前位置上兩個數字的開合情況
for(auto i : vect){
if((i >> cur) & 1){
//如果當前位置上有1
one.push_back(i);
}else{
zero.push_back(i);
}
}
if(one.empty()){
return dfs(cur - 1, zero);
}else if(zero.empty()){
return dfs(cur - 1, one);
}
return min(dfs(cur - 1, zero) , dfs(cur - 1, one)) + (1 << cur);//記錄本單位
}
int main(){
//FOPEN;
n = read();
for(int i = 1 ; i <= n ; ++i){
int a = read();
v.push_back(a);
}
int ans = dfs(30 , v);
printf("%d\n", ans);
}