1.Tokitsukaze and Eliminate (hard)(easy难度可以通过暴力来进行,但是hard添加了颜色,我们需要从右往左找到最靠左的某一颜色的最后一个,那么我们可以先用map存图,存下当前剩下几种颜色,再用set一遍一遍重复清点颜色数量,一旦和map中颜色相同就消除一次)
1 #include<bits/stdc++.h>
2 using namespace std;
3 int main()
4 {
5 int n;
6 cin>>n;
7 int m;
8 for(int i=0;i<n;i++)
9 {
10 cin>>m;
11 vector<int> v;
12 map<int,int>mp;
13 for(int j=0;j<m;j++)
14 {
15 int x;
16 cin>>x;
17 v.push_back(x);
18 mp[x]++;
19 }
20 int ans=0;
21 set<int>s;
22 int r=m-1;
23 int d=mp.size();
24 while(r>=0)
25 {
26 mp[v[r]]--;
27 if(mp[v[r]]==0)mp.erase(v[r]);//此颜色消除完了就从map中删去
28 s.insert(v[r]);
29 if(s.size()==d)
30 {
31 s.clear();
32 d=mp.size();
33 ans++;
34 }
35 r--;
36 }
37 cout<<ans<<"\n";
38 }
39 return 0;
40 }
2.Tokitsukaze and Short Path (minus)(pius和minus其实都是找规律和sort排序,想复杂了)
1 #include <bits/stdc++.h>
2 #define endl '\n'
3 #define int long long
4 using namespace std;
5 const int N = 2e5+10 , M = 1e6+10 ;
6 void solve() {
7 int n;
8 cin >> n;
9 vector<int> k(n+1);
10 int sum=0;
11 for(int i=1;i<=n;i++) cin >> k[i] , sum+=k[i];
12 sort(k.begin()+1,k.end());
13 int ans=0 , res=k[1];
14 for(int i=1;i<=n;i++) {
15 int w = min(res*2,k[i]);
16 ans+=w*(n-i);
17 }
18 cout << ans*4 << endl;
19 }
20
21 signed main() {
22 ios::sync_with_stdio(0);
23 cin.tie(0) , cout.tie(0);
24 int T = 1;
25 cin >> T ;
26 while(T--) solve();
27 return 0;
28 }