3 条题解

  • 3
    @ 2026-5-23 16:59:32
    #include <bits/stdc++.h>
    #define int long long
    const int N = 2e5 + 10;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    int t , lenc , s [N] , ans [N] , f [N];
    struct node
    {
    	int id , p;
    }a [N];
    bool cmp (node a1 , node a2)
    {
    	if (a1.id == a2.id) return a1.p > a2.p;
    	return a1.id < a2.id;
    }
    signed main()
    {
    		cin >> t;
    		for (int i = 1; i <= t; i++)
    		{
    			scanf ("%lld" , &a [i].id);
    			if (!s [a [i].id]) lenc++;
    			s [a [i].id]++;	
    		}	 
    		for (int i = 1; i <= t; i++) scanf ("%lld" , &a [i].p);
    		sort (a + 1 , a + t + 1 , cmp);
    //		for (int i = 1; i <= t; i++) cout << a [i].id << " ";
    //		cout << "\n";
    //		for (int i = 1; i <= t; i++) cout << a [i].p << " ";
    //		cout << lenc << "\n";
    		int len = 1;
    		for (int i = 1; i <= lenc; i++)
    		{
    			f [len] = a [len].p;
    			for (int j = len + 1; j <= len + s [a [len].id]; j++)
    				f [j] = f [j - 1] + a [j].p;
    			len += s [a [len].id];
    		}
    		len = 1;
    		while ( lenc-- )
    		{
    			for (int j = 1; j <= s [a [len].id]; j++) //1-n
    			{
    				int t = s [a [len].id] % j;
    				ans [j] += f [len + s [a [len].id] - t - 1];
    			}
    			len += s [a [len].id];
    		}
    		for (int i = 1; i <= t; i++) cout << ans [i] << " ";
    		return 0;
    }
    
    

    信息

    ID
    2342
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    150
    已通过
    23
    上传者