2021 ICPC 南京

10.7
赛时四题,也是可能是赛前最后一场vp,国庆爽vp了4场但是似乎毫无长进。

这场其实7题思路都有开出来,但是由于我睡着了没能阻止队友连开两小时J所以浪费太多时间。。感觉D和I都比J简单(大概

24级军爷都要开始军训了,然后我在机房军训,大家都有光明的未来。

A

签到

M

选取一个最大值一个最小值然后剩下的元素可以取绝对值运算,很容易证明

C

队友签的

H

树上dp,gxd秒了,不会

I

D

这题思路其实很快可以进展到除了第一次操作以外后面的数都可以直接取比它大的数。后面队友提示想到了即使第一次数变动也是在一个固定序列变动,贡献改变很少于是可以算贡献,但是我是真不会算贡献。我服了。。

最搞笑一开始队友假了但是我没发现他假了还写完了代码(虽然没几行)还是要辩证看待队友思路啊唉唉。

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mkp make_pair
#define lowbit(x) (x&(-x))
#define int long long
const int maxn=1e5+10;
int a[maxn],spe[maxn],k,n,t[maxn],pre[maxn],tt;
bool vis[maxn];
int que(int x){
    int res=0;
    while(x>0){
        res+=t[x];
        x-=lowbit(x);
    }
    return res;
}
void upd(int x,int k){
    while(x<=n){
        t[x]+=k;
        x+=lowbit(x);
        //Bcout<<x<<endl;
    }
}
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    upd(a[1],1);vis[a[1]]=1;
    int flag=0,ans=0,cnt=0;
    cout<<'0';
	for(int i=2;i<=n;i++)
	{
		if(!vis[a[i]]) vis[a[i]]=1,upd(a[i],1);
		if(a[i]==a[1]) flag=1; cnt+=flag-(flag?a[i]>a[1]:0);
		if(a[i]>a[1]) ans+=1+cnt,swap(a[1],a[i]),cnt=flag=0;
		ans+=que(a[1])-que(a[i]);
		cout<<" "<<ans;
	}
	cout<<"\n";

    for(int i=1;i<=n;i++)t[i]=0,pre[i]=0,spe[i]=0,vis[i]=0;
}
signed main(){
   cin>>tt;while(tt--)solve();
}

J

是暴力记忆化搜索,但是我不会啊

posted @ 2024-10-08 19:41  lyrrr  阅读(39)  评论(0)    收藏  举报