Hor1zDPX @ 2024-11-27 21:35:57
首先为您的热心与支持表示感谢。
rt 使用离散化+树状数组,全部RE,0pts.抓破脑袋都想不到在哪错了 题目为P1908.
code:https://www.luogu.com.cn/paste/wxnh61rw
关于code:
关于问题:
再次感谢您的帮助!
by sdjjdjdjdjd @ 2024-11-27 21:46:34
用奇怪方法调到样例能过了且不会段错误(gcc 11.3.0),但至于代码的正确性我帮不了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=5e5+5;
ll n,c[MAXN],ans=0;
struct Nub
{
ll ar;//下标,即在原数组中的位置
ll val;//值
}nub[MAXN];
bool cmp(Nub x,Nub y)
{
if(x.val!=y.val) return x.val<y.val;
else return x.ar<y.ar;
}
inline ll lowbit(ll x)
{return x&(-x);}
void add(ll x,ll k)
{
while(x<=n)
{
c[x]+=k;
x=x+lowbit(x);
}
}
ll query(ll x)
{
ll res=0;
while(x>0)
{
res+=c[x];
x=x-lowbit(x);
}
return res;
}
void init()
{
Nub tmp[MAXN];
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>nub[i].val;
nub[i].ar=i;
tmp[i]=nub[i];
}
sort(tmp+1,tmp+1+n,cmp);
ll k=1;
for(ll i=1;i<=n;i++)
{
if(tmp[i].val>tmp[i-1].val && i>1) k++;//判重
nub[tmp[i].ar].val=k;//离散化
}
return;
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
init();
for(ll i=n;i>=1;i--)
{
add(nub[i].val,1);
ans+=query(nub[i].val-1);
}
cout<<ans;
return 0;
}
by Hor1zDPX @ 2024-11-27 22:01:57
@sdjjdjdjdjd 感谢热心解答(另外数组开到5e5的情况下本地跑未响应是为什么)
by Hor1zDPX @ 2024-11-27 22:03:10
楼主是个纱布
对着看了半个小时没看出写得ll add(黑线)
by sdjjdjdjdjd @ 2024-11-27 22:06:16
@Hor1zDPX 这个我不太清楚
我也不知道为什么把add
的返回值改成void
就可以了