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
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)<
B. Just eat it 的AC代码
#include
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
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
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;
vectorv;
int dfs(int cur, vector&vect){
if(cur < 0){
return 0;
}
vectorzero, 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);
}