
日记
我又双叒叕断更辣!
其实前面 天都差点更了。
上午
考试。
不过这个考试还算是正常的考试,因为分数也是十分正常。
然而,我的 T1 因为没开 long long
爆了 分。
T1
如上文所说:因为没开 long long
爆了 分。
但是赛时代码是这样的:
CPP
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
#include<bits/extc++.h>
#define ll long long
// #define LOCAL
using namespace std;
const int maxn = 1.5e5 + 5;
int n,q;
ll a[maxn],b[maxn];
ll pre[maxn],sum;
signed main()
{
#ifdef LOCAL
freopen("perm.in","r",stdin);
freopen("perm.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
b[i] = a[i];
}
cin >> q;
sort(b + 1,b + n + 1);
for (int i = 1; i <= n; i++)
{
sum += b[i] * i;
pre[i] = pre[i - 1] + b[i];
}
int x,y;
while (q--)
{
cin >> x >> y;
if (a[x] < y)
{
int l = lower_bound(b + 1,b + n + 1,a[x]) - b;
int r = lower_bound(b + 1,b + n + 1,y) - b - 1;
ll tmp = sum - l * a[x] + r * y;
tmp -= pre[r] - pre[l];
cout << tmp << endl;
}
else if (a[x] > y)
{
int l = lower_bound(b + 1,b + n + 1,y) - b;
int r = lower_bound(b + 1,b + n + 1,a[x]) - b;
ll tmp = sum - r * a[x] + l * y;
tmp += pre[r - 1] - pre[l - 1];
cout << tmp << endl;
}
else
cout << sum << endl;
}
#ifdef LOCAL
fclose(stdout);
cout << clock();
#endif
return 0;
}
改正后的代码是这样的:
CPP
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
#include<bits/extc++.h>
#define int long long
// #define LOCAL
using namespace std;
const int maxn = 1.5e5 + 5;
int n,q;
int a[maxn],b[maxn];
int pre[maxn],sum;
signed main()
{
#ifdef LOCAL
freopen("perm.in","r",stdin);
freopen("perm.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
b[i] = a[i];
}
cin >> q;
sort(b + 1,b + n + 1);
for (int i = 1; i <= n; i++)
{
sum += b[i] * i;
pre[i] = pre[i - 1] + b[i];
}
int x,y;
while (q--)
{
cin >> x >> y;
if (a[x] < y)
{
int l = lower_bound(b + 1,b + n + 1,a[x]) - b;
int r = lower_bound(b + 1,b + n + 1,y) - b - 1;
int tmp = sum - l * a[x] + r * y;
tmp -= pre[r] - pre[l];
cout << tmp << endl;
}
else if (a[x] > y)
{
int l = lower_bound(b + 1,b + n + 1,y) - b;
int r = lower_bound(b + 1,b + n + 1,a[x]) - b;
int tmp = sum - r * a[x] + l * y;
tmp += pre[r - 1] - pre[l - 1];
cout << tmp << endl;
}
else
cout << sum << endl;
}
#ifdef LOCAL
fclose(stdout);
cout << clock();
#endif
return 0;
}
咱就是说:这里面也没有什么该开的没开是吧?一个 数组,一个 数组,都开了,还有一个 和 都开了啊,为何呢??
大概是那个 sum += b[i] * i;
没开导致吧?
T2
打了一个假作法,骗了 分。还不如不打呢
T3 & T4
赛时没看,赛后看了,挺简单的,但是赛时要想到还是有点难。
下午
改题。
T1
T1 也是十分简单,但是因为没开 long long
痛失 分。
我决定把 #define int long long
打到缺省源里
T2
T3
虽然马周大佬的做法很简单,但是我还是更喜欢题解的 set
做法
T4
虽然 kaka
的线段树十分好懂,但是我还是更喜欢哈希。
晚上
晚上,因为[NOIP2012 提高组] 开车旅行没改,于是又被祝老荣幸提名了一遍。但是一看题解,只能对着行数 的代码犯恶心。
但是对着那个又臭又长的代码调了一晚上,死因是没开 long long
。我简直是。。。
然后,和 long long
斗争到底的一天就这么结束了
才没有呢。
半夜
由于今天晚上有 edu ,所以我还得到学校待到十一二点。但是,xguagua
和 yzp
都回去了,就剩我一个人在机房凌乱。
希望这次能够多打几题,多涨点 rated 。