Tokitsukaze and Strange Inequality
注:用数组计数一下会更快 本人用log了
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;
#define ll long long
// #define int long long
const int N=5e3+10;
const int mod= 998244353;
int t,n,p[N];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&p[i]);
ll res=0;
for(int i=2;i<=n;i++){
vector<int> v;for(int j=1;j<i;j++) v.push_back(p[j]);
sort(v.begin(),v.end());
ll res2=0;for(int j=i+2;j<=n;j++) res2+=(p[j]<p[i]);
for(int j=i+1;j<n;j++){
if(j!=i+1) res2-=(p[j]<p[i]);
ll res1=lower_bound(v.begin(),v.end(),p[j])-v.begin();
res+=res1*res2;
}
}
cout<<res<<endl;
}
}
D. Tokitsukaze and Meeting
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
using namespace std;
const int N=1e6+10;
int t,n,m;
int ans[N],row[N],pre[N],pre2[N];
char ch[N];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m); cin>>ch+1;
for(int i=1;i<=n*m;i++){
pre[i]=pre[i-1]+ch[i]-'0';
ans[i]=row[i%m]=pre2[i]=0;
}
for(int i=1;i<=n*m;i++){
int l=max(1,i-m+1);
pre2[i]=(pre[i]-pre[l-1]>0?1:0)+pre2[l-1];
}
int cnt=0;
for(int i=1;i<=n*m;i++){
// cout<<row[i%m]<<" "<<ch[i]<<endl;
if(row[i%m]==0&&ch[i]=='1') row[i%m]=1,++cnt;
ans[i]=cnt;
}
for(int i=1;i<=n*m;i++){
ans[i]+=pre2[i];
}
for(int i=1;i<=n*m;i++) cout<<ans[i]<<" ";cout<<endl;
}
}
B2 - Tokitsukaze and Good 01-String (hard version)
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;
#define ll long long
// #define int long long
const int N=2e5+10;
const int mod= 998244353;
int t,n;char ch[N];
int a[N];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%s",&n,ch+1);
vector<int> v;
int res1=0,res2=1;
for(int i=1;i<=n;i+=2){
if(ch[i]!=ch[i+1]) ++res1,a[i]=a[i+1]=2;
else a[i+1]=a[i]=ch[i]-'0';
}
int pre=(a[1]==2?-1:a[1]);
for(int i=2;i<=n;i++){
if(a[i]==2) continue;
if(a[i]!=pre&&pre!=-1) ++res2,pre=a[i];
if(pre==-1) pre=a[i];
}
cout<<res1<<" "<<res2<<endl;
}
}
E. Tokitsukaze and Two Colorful Tapes
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
using namespace std;
const int N=1e6+10;
int t,n,a[N],b[N],fa[N];
int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=n;i++){
int fx=find(a[i]),fy=find(b[i]);
if(fx!=fy) fa[fx]=fy;
}
map<int,int> mp;
for(int i=1;i<=n;i++) mp[find(i)]++;
int cnt=0;
for(auto it:mp){cnt+=it.second/2;}
long long res=0;
for(int i=1;i<=cnt;i++) res-=i;
for(int i=n-cnt+1;i<=n;i++) res+=i;
cout<<res*2<<endl;
}
}