T1:
给出一个数列 an ,求 ∑n1∑n1aixoraj
Solution :
数一数每一个位子上1的个数即可
Code:
/*************************************************************************
> File Name: alien.cpp
> Author: Archer
************************************************************************/
#include <bits/stdc++.h>
#include <ext/pb_ds/priority_queue.hpp>
using namespace std;
typedef long long ll;
const int N = 1111111;
int n, a[N], cnt[2];
ll ans, p;
inline void setIO(){
freopen("alien.in", "r", stdin);
freopen("alien.out", "w", stdout);
}
inline int read(){
int x = 0, f = 1; char ch = getchar();
while (!isdigit(ch)) {if (ch == '-') f = -1; ch = getchar();}
while (isdigit(ch)) {x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
int main(){
setIO();
n = read();
for (int i = 1; i <= n; i++) a[i] = read();
sort(a + 1, a + 1 + n);
ans = 0ll; p = 1ll;
while (a[n] > 0){
cnt[0] = 0; cnt[1] = 0;
for (int i = 1; i <= n; i++)
cnt[a[i] & 1]++, a[i] >>= 1;
ans += 1ll * cnt[0] * cnt[1] * p;
p <<= 1;
}
printf("%I64d\n", ans);
return 0;
}
T2:
给出一些直线 yi=kix+bi ,抹去在x轴下方的部分,令 s(x)=∑n1yi ,求s的图像上有几个不为180的角
Solution:
直线叠加还是直线。
按零点排序即可。
Code:
/*************************************************************************
> File Name: polyline.cpp
> Author: Archer
************************************************************************/
#include <bits/stdc++.h>
#include <ext/pb_ds/priority_queue.hpp>
using namespace std;
typedef long long ll;
const int N = 111111;
struct L{ int k, b; } line[N];
int n, cnt;
ll sk;
#define WORK\
if (line[cur].k < 0) sk -= line[cur].k * 1ll;\
else sk += line[cur].k * 1ll;\
cur++;\
inline void setIO(){
freopen("polyline.in", "r", stdin);
freopen("polyline.out", "w", stdout);
}
inline int read(){
int x = 0, f = 1; char ch = getchar();
while (!isdigit(ch)) {if (ch == '-') f = -1; ch = getchar(); }
while (isdigit(ch)) {x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
bool cmp(L l1, L l2){
ll p = 1ll * l1.b * l2.k - 1ll * l2.b * l1.k;
ll q = 1ll * l1.k * l2.k;
if (q > 0) return p > 0;
else return p < 0;
}
int main(){
setIO();
n = read(); cnt = 0; sk = 0;
for (int i = 1; i <= n; i++){
int t1 = read(), t2 = read();
if (t1 == 0) continue;
line[++cnt].k = t1; line[cnt].b = t2;
if (line[cnt].k < 0) sk += line[cnt].k * 1ll;
}
sort(line + 1, line + 1 + cnt, cmp);
int cur = 1, ans = 0;
while (cur <= cnt){
ll last = sk;
WORK
while (cur <= cnt && 1ll* line[cur].k * line[cur - 1].b - 1ll * line[cur].b * line[cur - 1].k == 0){
WORK
}
if (sk != last) ans++;
}
printf("%d\n", ans);
return 0;
}
T3:
搅屎题,没什么好说的。